一段时间以来,我一直在使用 VideoToolbox 的H264 硬件加速编码器VTCompressionSession
实现工作,一个一致的问题是它的比特率不可靠。我已经阅读了许多论坛帖子并查看了现有的代码,并试图效仿,但我的编码器的比特率几乎总是在设置的 5% 到 50% 之间,有时我已经看到了一些巨大的错误,比如甚至 400% 的过冲,即使是一帧也会是给定平均比特率的两倍。
我的会话设置如下:
kVTCompressionPropertyKey_AverageBitRate
= 所需比特率kVTCompressionPropertyKey_DataRateLimits
= [所需比特率 / 8, 1]; 占位与字节kVTCompressionPropertyKey_ExpectedFrameRate
= 帧率(30、15、5 或 1 fps)kVTCompressionPropertyKey_MaxKeyFrameInterval
= 1500kVTCompressionPropertyKey_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 的要求提供时间信息。然后,我将每个帧的输出大小相加,并在一个周期性的时间段内进行划分,以确定所需的输出比特率和错误。这就是我看到显着波动的地方。
我正在寻求任何帮助来控制比特率,因为我现在不确定该怎么做。谢谢!