AVAssetWriterInput和readyForMoreMediaData

Mik*_*ike 7 iphone avfoundation iphone-sdk-3.0 ios4 avassetwriter

AVAssetWriterInput的readyForMoreMediaData是否在后台线程中更新?如果readyForMoreMediaData为NO,我可以在主线程中阻塞并等待值变为YES吗?

我通过向其推送数据来使用AVAssetWriterInput(即不使用requestMediaDataWhenReadyOnQueue)并且我设置了expectedMediaDataInRealTime,并且99.9%的时间我可以在其上调用appendSampleBuffer(或appendPixelBuffer),就像我的应用程序可以生成帧一样快.

除非您在AVAssetWriter会话中间将设备(iPhone 3GS)置于睡眠状态15分钟左右,否则此工作正常.唤醒设备后,appendPixelBuffer有时会收到一条错误消息,"当readyForMoreMediaData为NO时,无法追加像素缓冲区".因此我的问题 - 如何最好地响应readyForMoreMediaData = NO,如果我可以在主线程中稍等一下,如下所示:

while ( ![assetWriterInput readyForMoreMediaData] )
{
    Sleep for a few milliseconds
}
Run Code Online (Sandbox Code Playgroud)

MoD*_*oDJ 5

小心不要阻塞线程,这是我在不起作用之前所做的:

while (adaptor.assetWriterInput.readyForMoreMediaData == FALSE) {
  [NSThread sleepForTimeInterval:0.1];
}
Run Code Online (Sandbox Code Playgroud)

上述方法在我的iPad2上有时会失败。这样做反而解决了问题:

while (adaptor.assetWriterInput.readyForMoreMediaData == FALSE) {
  NSDate *maxDate = [NSDate dateWithTimeIntervalSinceNow:0.1];
  [[NSRunLoop currentRunLoop] runUntilDate:maxDate];
}
Run Code Online (Sandbox Code Playgroud)

  • 在运行循环上调用 runUntilDate 与睡眠不同。运行循环可以做其他事情,比如响应异步 IO 准备好或 NSNotification 传递。这里的要点是,readyForMoreMediaData 标志可能由运行循环操作之一设置,这似乎是 iPad2 发生的情况。 (2认同)