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 在状态栏下停止扩展