ios:如何恢复基于AVAsset视频的写作会话

时间:2011-10-30 20:55:12

标签: ios background avfoundation multitasking avassetwriter

我正在开发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 :(得分:0)

我很确定AVAssetWriter无法追加,因此,如果你必须让你的导出可以重启,那么保存碎片然后合并它们可能是最好的解决方案。

但首先你必须解决这个崩溃。

此外,在你开始创作数百部电影之前,你应该看看AVAssetWriter.movieFragmentInterval,因为仔细管理你可能能够使用它的演示时间戳/持续时间最小化你需要的部分数量合并。

答案 1 :(得分:0)

你试过-[UIApplication beginBackgroundTaskWithExpirationHandler:]吗?这似乎是在后台请求额外操作时间以完成繁重工作的好地方。