AVAssetWriter在iOS7中停止写入文件

时间:2013-09-24 23:54:19

标签: ios6 avfoundation ios7 avcapturesession avassetwriter

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

有人知道我是否需要在iOS6中做任何与iOS7不同的事情?我没有在文档中找到任何成功的东西。

以下是一些更多信息......

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

视频样本缓冲区大小:1

音频样本缓冲区大小:1024

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

我有完全相同的情况,也只是在iOS 7上。
在我的情况下,问题变成实际上是使用相同的应用程序捕获的损坏的视频文件。

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

使用'finishWritingWithCompletionHandler:'解决它并仅在写完成后访问文件(从完成处理程序回调)。记得派遣回主线程,因为从后台线程调用处理程序。

希望有所帮助

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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;
        }
}