我正在为iphone/ipod touch制作视频编辑应用程序。我的应用程序只是让用户在相机胶卷目录中选择一个已经存在的视频,然后逐帧更改像素值,并以不同的名称再次保存在相机胶卷目录中。因为视频处理可能相当长,我真的需要实现某种功能来恢复以前开始的会话(即。当视频处理达到总视频长度的30%时,用户按下home键(或有电话),当我的应用程序被带回到前台时,视频处理应该从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) [avassetwwriter start/endSessionAtSourceTime],不幸的是,在最后一帧演示时间停止和开始对我不起作用
2)手工保存已处理的电影的每个部分,当处理达到100%时,使用AVMutableComposition合并所有这些部分,然而这种解决方案有时会在调度队列中崩溃
如果有人能给我一些提示如何正确地做,那就太好了……我很确定avassetwwriter不能追加,所以沿着2)的路线,保存碎片然后合并它们,可能是最好的解决方案,如果你必须使你的导出可重新启动。
但首先你得解决崩溃问题。
此外,在开始创建数百个电影片段之前,您应该查看AVAssetWriter.movieFragmentInterval
,因为仔细管理演示时间标记/持续时间,您可能能够使用它将必须合并的片段数量降至最低。
您试过-[UIApplication beginBackgroundTaskWithExpirationHandler:]
吗?这似乎是在后台请求额外操作时间来完成繁重工作的好地方。