Я уже некоторое время работаю над реализацией аппаратного ускорения H264 с использованием VideoToolbox VTCompressionSession
, и постоянной проблемой является ненадежный битрейт, выходящий из него.Я прочитал много сообщений на форуме, просмотрел для этого существующий код и попытался последовать его примеру, но битрейт моего кодера почти всегда составляет от 5% до 50% от установленного значения, и иногда явидел некоторые огромные ошибки, такие как даже превышение на 400%, когда даже один кадр будет в два раза больше заданного среднего битрейта.
Мой сеанс настроен следующим образом:
kVTCompressionPropertyKey_AverageBitRate
= желаемый битрейт kVTCompressionPropertyKey_DataRateLimits
= [желаемый битрейт / 8, 1];учет битов против байтов kVTCompressionPropertyKey_ExpectedFrameRate
= частота кадров (30, 15, 5 или 1 кадр / с) kVTCompressionPropertyKey_MaxKeyFrameInterval
= 1500 kVTCompressionPropertyKey_MaxKeyFrameIntervalDuration
= 1500 /частота кадров kVTCompressionPropertyKey_AllowFrameReordering
= NO kVTCompressionPropertyKey_ProfileLevel
= kVTProfileLevel_H264_Main_AutoLevel
kVTCompressionPropertyKey_RealTime
= YES kVTCompressionPropertyKey_H264EntropyMode
= kVTH264EntropyMode_CABAC
kVTCompressionPropertyKey_BaseLayerFrameRate
= частота кадров / 2
И я корректирую средние значения битрейта и данных в течение сеанса, чтобы попытаться компенсировать волатильность (если она слишком высокая, я уменьшаю ихнемного, если слишком низко, я увеличиваю их, с ограничениями на то, как высоко и низко идти).Я создаю сеанс и затем применяю вышеупомянутую конфигурацию как единый словарь, используя VTSessionSetProperties
и вставляю кадры в него следующим образом:
VTCompressionSessionEncodeFrame(compressionSessionRef,
static_cast<CVImageBufferRef<(pixelBuffer),
CMTimeMake(capturetime, 1000),
kCMTimeInvalid,
frameProperties,
frameDetailsStruct,
&encodeInfoFlags);
Таким образом, я предоставляю информацию о синхронизации какAPI говорит, чтобы сделать.Затем я складываю размер вывода для каждого кадра и делю на периодические промежутки времени, чтобы определить исходящий битрейт и ошибку от желаемого.Вот где я вижу значительную волатильность.
Я ищу любую помощь в получении контроля над битрейтом, так как я не уверен, что делать в этот момент.Спасибо!