AVAssetWriter 停止在 iOS7 中写入文件

Posted

技术标签:

【中文标题】AVAssetWriter 停止在 iOS7 中写入文件【英文标题】:AVAssetWriter stopped writing to file in iOS7 【发布时间】:2013-09-24 23:54:19 【问题描述】:

我正在解决我的应用程序在 ios6 中运行良好的问题,但是当我升级到 XCode 5 和 iOS7 时,AVAssetWriter 停止将视频数据写入 tmp 目录中的文件。我正在使用带有 AVCaptureSession 的 AVFoundation 来捕获视频。录制开始时会创建输出文件,但不会加载任何视频数据。 finishWritingWithCompletionHandler 运行时没有任何错误,并按预期调用其完成处理程序。

有谁知道我是否需要对 iOS7 做一些在 iOS6 中不需要的不同操作?我没有成功在文档中找到任何内容。

这里有更多信息...

临时文件位置: /var/mobile/Applications/[App ID]/tmp/[TempFileName].MOV

视频样本缓冲区大小:1

音频样本缓冲区大小:1024

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我也遇到过完全相同的情况,也只是在 iOS 7 上。 就我而言,问题实际上是使用同一应用程序捕获的损坏的视频文件。

问题在于,在使用 AVAssetWriter 完成捕获后,我在后台线程上调用了“finishWriting”并在写入完成之前立即访问媒体

使用 'finishWritingWithCompletionHandler:' 解决了这个问题,并且仅在写入完成后才访问文件(来自完成处理程序的回调)。记住要分派回主线程,因为处理程序是从后台线程调用的。

希望对你有帮助

【讨论】:

感谢您的回复。我终于自己找到了问题,但一直忙于回答我的问题。所以我会用我的发现来回答我的问题。【参考方案2】:

我发现了问题所在。首先,我错误地归咎于 AVAssetWriter 对象。它工作正常。实际问题来自 AVPlayerItem。我使用 AVPlayerItem 来确定视频的持续时间。无论我尝试什么,它总是返回零持续时间,这让我的视频编辑被调用。因此,为了解决这个问题,我改为使用 AVAssetItem 来获取视频持续时间并解决了我的问题。我可能会将此作为 AVPlayerItem 对象中的错误报告给 Apple。

【讨论】:

【参考方案3】:

avishic 是对的。在 iOS 7 之前,我不必包含 assetWriter finishWritingWithCompletionHandler,但现在如果您不包含,它将使文件无法使用。 这里有一些代码来说明:

[assetWriterInput requestMediaDataWhenReadyOnQueue:mediaInputQueue
                                                usingBlock:
^
    CMSampleBufferRef nextBuffer;
    while (assetWriterInput.readyForMoreMediaData)
    
        nextBuffer = [assetReaderOutput copyNextSampleBuffer];
        if (nextBuffer) 
            //...
        
        else 
            [assetWriterInput markAsFinished];
            [assetReader cancelReading];
            [assetWriter finishWritingWithCompletionHandler:^
                //notify your other code that the file is ready
               ];
            return;
        

【讨论】:

以上是关于AVAssetWriter 停止在 iOS7 中写入文件的主要内容,如果未能解决你的问题,请参考以下文章

MPMoviePlayerController 寻求前进按钮停止在IOS7 中的视频?

一段时间后,ios7 UINavigationBar 在状态栏下停止扩展

AVAssetWriter / AVAudioPlayer 冲突?

AVAssetWriter 未知错误

AVAssetWriter - 设置自定义帧率

AVAssetWriter视频数据编码