VTCompressionSession比特率/数据率过冲

时间:2018-12-05 21:21:41

标签: ios macos compression h.264 video-toolbox

一段时间以来,我一直在使用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所说,我正在提供计时信息。 然后,我将每个帧的输出大小相加,并在一个周期性的时间段内进行划分,以确定所需的传出比特率和错误。这是我看到的大幅波动的地方。

我正在寻找任何有助于控制比特率的帮助,因为我不确定此时该怎么做。谢谢!

1 个答案:

答案 0 :(得分:0)

我认为您可以检查VTCompressionSessionEncodeFrame中设置的frameTimestamp,它似乎会影响比特率。如果更改帧速率,请更改frameTimestamp。