ios: как возобновить сеанс записи видео на основе AVAsset - PullRequest
2 голосов
/ 31 октября 2011

Я работаю над приложением для редактирования видео для iPhone / iPod Touch. Мое приложение просто просит пользователя выбрать одно из уже существующих видео в каталоге прокрутки камеры, затем кадр за кадром изменяет значения пикселей и снова сохраняет под другим именем в каталоге прокрутки камеры. Поскольку обработка видео может быть довольно продолжительной, мне действительно нужно реализовать какую-то функциональность, чтобы возобновить ранее начатый сеанс (т. Е. Когда обработка видео достигает 30% от общей длины видео, и пользователь нажимает кнопку «домой» (или происходит телефонный звонок), когда мое приложение возвращается на передний план, обработка видео должна начинаться с 30%, а не с начала).

Наиболее важные части моего кода (немного упрощены, чтобы быть более читабельными):

AVAssetReader* assetReader = [[AVAssetReader alloc] initWithAsset:sourceAsset error:&error];
NSArray* videoTracks = [sourceAsset tracksWithMediaType:AVMediaTypeVideo]; 
AVAssetTrack* videoTrack = [videoTracks objectAtIndex:0];
AVAssetReaderTrackOutput* assetReaderOutput = [[AVAssetReaderTrackOutput alloc] initWithTrack:videoTrack 
[assetReader addOutput:assetReaderOutput]);
[assetReader addOutput:assetReaderOutput];
[mVideoWriter startWriting]
[mAssetReader startReading]
[mVideoWriter startSessionAtSourceTime: kCMTimeZero];
mediaInputQueue = dispatch_queue_create("mediaInputQueue", NULL);
[writerInput requestMediaDataWhenReadyOnQueue:mediaInputQueue usingBlock:^{ 
    while (mWriterInput.readyForMoreMediaData) {
        CMSampleBufferRef nextBuffer = [mAssetReaderOutput copyNextSampleBuffer];
        if (nextBuffer) {
            // frame processing here
        } // if
    } // while
 }]; // block
 // when done saving my video to camera roll directory

Я слушаю методы обратного вызова делегата моего приложения, такие как applicationWillResignActive, applicationWillEnterForeground, но я не уверен, как правильно их обрабатывать. Что я уже пробовал:

1) [AVAssetWriter start / endSessionAtSourceTime], к сожалению, остановка и запуск во время представления последнего кадра не работали для меня

2) сохранение «вручную» каждой части фильма, которая была обработана, и когда обработка достигает 100% слияния всех из них с помощью AVMutableComposition, это решение, однако, иногда дает сбой в очереди отправки

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Вы пробовали -[UIApplication beginBackgroundTaskWithExpirationHandler:]? Это похоже на хорошее место, чтобы запросить дополнительное время работы в фоновом режиме, чтобы закончить тяжелую работу.

0 голосов
/ 31 октября 2011

Я почти уверен, что AVAssetWriter не может добавить, поэтому что-то вроде 2), сохранение кусочков и их объединение, вероятно, является лучшим решением, если вы должны сделать свой экспорт перезагружаемым.

Но сначала вы должны устранить этот сбой.

Кроме того, прежде чем приступить к созданию сотен фрагментов фильма, вы должны взглянуть AVAssetWriter.movieFragmentInterval, как при тщательном управлении метками времени представления /длительность, которую вы можете использовать, сводит к минимуму количество частей, которые вы должны объединить.

...