1

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

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

这里有一些更多的信息.​​.....

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

视频样本缓冲区大小:1

音频样本缓冲区大小:1024

任何帮助将不胜感激。

4

3 回答 3

1

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

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

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

希望能帮助到你

于 2013-10-03T12:26:27.003 回答
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;
        }
}
于 2013-10-14T21:53:48.453 回答
0

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

于 2013-10-04T02:26:01.247 回答