VTCompressionSession битрейт / превышение скорости передачи данных - PullRequest
0 голосов
/ 06 декабря 2018

Я уже некоторое время работаю над реализацией аппаратного ускорения 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 говорит, чтобы сделать.Затем я складываю размер вывода для каждого кадра и делю на периодические промежутки времени, чтобы определить исходящий битрейт и ошибку от желаемого.Вот где я вижу значительную волатильность.

Я ищу любую помощь в получении контроля над битрейтом, так как я не уверен, что делать в этот момент.Спасибо!

1 Ответ

0 голосов
/ 21 февраля 2019

Я думаю, что вы можете проверить frameTimestamp, установленный в VTCompressionSessionEncodeFrame, похоже, влияет на битрейт.Если вы измените частоту кадров, измените frameTimestamp.

...