0

一段时间以来,我一直在使用 VideoToolbox 的H264 硬件加速编码器VTCompressionSession实现工作,一个一致的问题是它的比特率不可靠。我已经阅读了许多论坛帖子并查看了现有的代码,并试图效仿,但我的编码器的比特率几乎总是在设置的 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 的要求提供时间信息。然后,我将每个帧的输出大小相加,并在一个周期性的时间段内进行划分,以确定所需的输出比特率和错误。这就是我看到显着波动的地方。

我正在寻求任何帮助来控制比特率,因为我现在不确定该怎么做。谢谢!

4

1 回答 1

0

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

于 2019-02-21T06:25:06.923 回答