一段时间以来,我一直在使用VideoToolbox的VTCompressionSession
进行 H264硬件加速编码器的实现,并且一直存在一个问题,那就是比特率不可靠。我已经阅读了很多论坛帖子并浏览了现有代码,并试图效仿,但是编码器的比特率几乎总是比设置的比特率低5%到50%之间,有时看到了一些巨大的错误,例如400%的超调,甚至一帧也将是给定平均比特率的两倍。
我的会话设置如下:
kVTCompressionPropertyKey_AverageBitRate
=所需的比特率kVTCompressionPropertyKey_DataRateLimits
= [所需的比特率/ 8、1];占位与字节的关系kVTCompressionPropertyKey_ExpectedFrameRate
=帧速率(30、15、5或1 fps)kVTCompressionPropertyKey_MaxKeyFrameInterval
= 1500 kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration
= 1500 /帧率kVTCompressionPropertyKey_AllowFrameReordering
=否kVTCompressionPropertyKey_ProfileLevel
= kVTProfileLevel_H264_Main_AutoLevel
kVTCompressionPropertyKey_RealTime
=是kVTCompressionPropertyKey_H264EntropyMode
= kVTH264EntropyMode_CABAC
kVTCompressionPropertyKey_BaseLayerFrameRate
=帧速率/ 2 然后,我会在整个会话期间调整平均比特率和数据率值,以尝试补偿波动性(如果波动太大,我会降低一些,如果波动过小,我会增加它们,并限制波动幅度的高低。走)。
我创建了会话,然后使用VTSessionSetProperties
将上述配置作为单个字典应用,并像这样向其中输入帧:
VTCompressionSessionEncodeFrame(compressionSessionRef,
static_cast<CVImageBufferRef<(pixelBuffer),
CMTimeMake(capturetime, 1000),
kCMTimeInvalid,
frameProperties,
frameDetailsStruct,
&encodeInfoFlags);
因此,正如API所说,我正在提供计时信息。 然后,我将每个帧的输出大小相加,并在一个周期性的时间段内进行划分,以确定所需的传出比特率和错误。这是我看到的大幅波动的地方。
我正在寻找任何有助于控制比特率的帮助,因为我不确定此时该怎么做。谢谢!
答案 0 :(得分:0)
我认为您可以检查VTCompressionSessionEncodeFrame中设置的frameTimestamp,它似乎会影响比特率。如果更改帧速率,请更改frameTimestamp。