Подтвердить что ты не робот

IPhone Читать UIimage (кадры) с видео с AVFoundation

Извините за мой английский) В поисках информации о считывании кадров с видео с iPhone я нашел этот проект http://www.codza.com/extracting-frames-from-movies-on-iphone/comment-page-1#comment-1116, но я также где-то читал, что вы можете использовать AVFoundation для захвата кадров из видео для лучшей производительности.

Но я не могу найти информацию о том, как я могу это сделать...

Некоторая идея?

Спасибо за чтение

4b9b3361

Ответ 1

Вы говорите об использовании вызовов для создания того, что Apple вызывает уменьшенные изображения из видео в определенное время.

Для MPMoviePlayerController (то, что IOS использует для хранения видео из файла или другого источника), для этого есть две команды. Первая генерирует один эскиз (изображение) из фильма в определенный момент времени, а второй генерирует набор миниатюр для диапазона времени.

Этот пример получает изображение через 10 секунд в мувиклип, myMovie.mp4:

MPMoviePlayerController *movie = [[MPMoviePlayerController alloc]
        initWithContentURL:[NSURL URLWithString:@"myMovie.mp4"]];
UIImage *singleFrameImage = [movie thumbnailImageAtTime:10 
        timeOption:MPMovieTimeOptionExact];

Обратите внимание, что это выполняется синхронно - то есть пользователь будет вынужден ждать, пока вы получите скриншот.

Другой вариант - получить серию изображений из фильма из массива раз:

MPMoviePlayerController *movie = [[MPMoviePlayerController alloc]
        initWithContentURL [NSURL URLWithString:@"myMovie.mp4"]];
NSNumber time1 = 10;
NSNumber time2 = 11;
NSNumber time3 = 12;
NSArray *times = [NSArray arrayWithObjects:time1,time2,time3,nil];
[movie requestThumbnailImagesAtTimes:times timeOption:MPMovieTimeOptionExact];

Этот второй способ вызовет уведомление типа MPMoviePlayerThumbnailImageRequestDidFinishNotification каждый раз при создании нового изображения. Вы можете настроить наблюдателя, чтобы контролировать это и обрабатывать изображение - я оставлю вас работать, что выбивает самостоятельно!

Ответ 3

Код Swift 2 для создания кадров с помощью AVAssetImageGenerator:

func previewImageForLocalVideo(url:NSURL) -> UIImage?
{
    let asset = AVAsset(URL: url)
    let imageGenerator = AVAssetImageGenerator(asset: asset)
    imageGenerator.appliesPreferredTrackTransform = true

    var time = asset.duration
    //If possible - take not the first frame (it could be completely black or white on camara videos)
    time.value = min(time.value, 2)

    do {
        let imageRef = try imageGenerator.copyCGImageAtTime(time, actualTime: nil)
        return UIImage(CGImage: imageRef)
    }
    catch let error as NSError
    {
        print("Image generation failed with error \(error)")
        return nil
    }
}