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

ios:如何恢复AVAsset基于视频的写作会话,ios,background,avfoundation,multitasking,avassetwriter,Ios,Background,Avfoundation,Multitasking,Avassetwriter,我正在为iphone/iPodtouch开发视频编辑应用程序。我的应用程序只要求用户选择相机滚动目录中已有的视频之一,然后逐帧更改像素值,并在相机滚动目录中以不同的名称再次保存。因为视频处理可能相当长,我真的需要实现某种功能来恢复以前启动的会话(即,当视频处理达到总视频长度的30%时,用户按下home按钮(或有电话)时)当我的应用程序返回前台时,视频处理应从30%开始,而不是从开始) 我的代码中最重要的部分(简化了一点以便于阅读): 我正在听我的应用程序的委托回调方法,如applicationW

我正在为iphone/iPodtouch开发视频编辑应用程序。我的应用程序只要求用户选择相机滚动目录中已有的视频之一,然后逐帧更改像素值,并在相机滚动目录中以不同的名称再次保存。因为视频处理可能相当长,我真的需要实现某种功能来恢复以前启动的会话(即,当视频处理达到总视频长度的30%时,用户按下home按钮(或有电话)时)当我的应用程序返回前台时,视频处理应从30%开始,而不是从开始)

我的代码中最重要的部分(简化了一点以便于阅读):

我正在听我的应用程序的委托回调方法,如applicationWillResignActive、applicationWillEnterForeground,但我不确定如何以正确的方式处理它们。我已经尝试过的:

1) [AVAssetWriter start/EndSessionaSourceTime],不幸的是,在最后一帧中停止和启动演示时间对我不起作用

2) 手动保存已处理电影的每个部分,当处理达到100%时,使用AVMutableComposition合并所有部分,但此解决方案有时会在调度队列中崩溃


如果有人能给我一些提示,告诉我应该如何正确地做,那就太好了

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

但首先你必须解决这个问题


此外,在你开始创作数百部电影之前,你应该先看看AVAssetWriter.movieFragmentInterval,因为仔细管理放映时间戳/持续时间,你可以使用它来最小化你必须合并的电影片段数量。

我很确定AVAssetWriter不能追加,因此,如果您必须使导出重新启动,那么保存片段然后合并它们可能是最好的解决方案

但首先你必须解决这个问题

此外,在开始创建数百个电影片段之前,您应该先查看一下AVAssetWriter.movieFragmentInterval,因为仔细管理演示时间戳/持续时间,您可以使用它最大限度地减少需要合并的片段数。

您尝试过吗?这似乎是一个在后台请求额外操作时间以完成重载的好地方。

您尝试过吗?这似乎是一个在后台请求额外操作时间以完成重载的好地方

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