我正在解决我的应用程序在iOS6中运行良好的问题,但是当我升级到XCode 5和iOS7时,AVAssetWriter退出将视频数据写入tmp目录中的文件。我正在使用AVFoundation和AVCaptureSession来捕获视频。录制开始时会创建输出文件,但从不加载任何视频数据。 finishWritingWithCompletionHandler运行时没有任何错误,并按预期调用其完成处理程序。
有人知道我是否需要在iOS6中做任何与iOS7不同的事情?我没有在文档中找到任何成功的东西。
以下是一些更多信息......
临时文件位置: / var / mobile / Applications / [App ID] / tmp / [TempFileName] .MOV
视频样本缓冲区大小:1
音频样本缓冲区大小:1024
非常感谢任何帮助。
答案 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;
}
}