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

标签 ios background avfoundation multitasking avassetwriter

我正在为 iphone/ipod touch 开发视频编辑应用程序。我的应用程序只是要求用户选择相机胶卷目录中现有的视频之一,然后逐帧更改像素值并以不同的名称再次保存在相机胶卷目录中。因为视频处理可能会很长,我真的需要实现某种功能来恢复之前启动的 session (即当视频处理达到总视频长度的 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

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

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

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

如果有人能给我一些提示应该如何正确完成,那就太好了......

最佳答案

我很确定 AVAssetWriter 不能追加,所以如果你必须让你的导出可重新启动,那么类似于 2) 的东西,保存然后合并它们,可能是最好的解决方案。

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

此外,在你开始创作数百部电影之前,你应该看看 AVAssetWriter.movieFragmentInterval与对演示时间戳/持续时间的仔细管理一样,您可以使用它来最大限度地减少您必须合并的片段数量。

关于ios:如何恢复基于 AVAsset 视频的写作 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7947752/

相关文章:

ios - AVPlayerLayer 动画帧变化

ios - SpriteKit (Swift) 方向改变

android背景图片减慢了应用程序

android - 在 Android 应用程序中重复背景横幅

java - 如何更改GridLayout间距的颜色?

ios - 可以使用 NSURLProtocol 的子类、使用 MPMovieController 或 AVFoundation 来播放视频吗?

ios - 在 Xcode "Provisioning Profile"build设置中配置 "Code Signing"选项

ios - 设置导航 Controller 的委托(delegate)?

ios - 通过 UIToolBar 的 UIBarButtonItem 在 iOS13 上不显示

ios - 我可以使用 AVCaptureSession 将 AAC 流编码到内存吗?