为什么我们需要在appendPixelBuffer:withPresentationTime:之后暂停线程?

问题描述 投票:0回答:2

在 iOS 上编码视频时,大多数解决方案都包含此步骤:

while(encoding) {
    if(assetWriterInput.readyForMoreMediaData) {
        [adaptor appendPixelBuffer:buffer withPresentationTime:presentTime];
        if(buffer)
            CVBufferRelease(buffer);
        [NSThread sleepForTimeInterval:0.05]; // <=== This line slows down encoding
    }
} 

如果我不休眠线程,即使readyForMoreMediaData 始终返回YES,结果视频也会看起来不稳定。如果我暂停线程,结果看起来很完美。

但是如果我们无论如何都需要暂停线程,我不明白“readyForMoreMediaData”的目的?看起来我可以将睡眠时间减少到 0.03,但结果不会显得生涩,但它仍然会减慢编码过程。

任何帮助将不胜感激,谢谢!

ios avfoundation video-encoding avassetwriter
2个回答
0
投票

多年来,我一直使用 assetwriter 在多个应用程序中编写实时视频,其中一个标准运行速度为 240 fps。我没有遇到过视频不稳定的问题。我从未使用过任何睡眠命令,也没有使用过 CVBufferRelease。我的代码基本上是这样的:

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer  fromConnection:(AVCaptureConnection *)connection
{
  if (videoWriterInput.readyForMoreMediaData) [videoWriterInput appendSampleBuffer:sampleBuffer]) 

}

也许您应该检查一下您如何设置 assetwriter?有一个“recommendedVideoSettingsForAssetWriterWithOutputFileType”设置可以帮助您优化它。如果您不是绝对需要适配器,我会尝试不使用适配器,根据我的经验,没有适配器运行会更顺畅。


0
投票

我遇到了同样的问题。这个问题最后有更好的解决办法吗?

© www.soinside.com 2019 - 2024. All rights reserved.