Кодирование видеороликов H.264 CBR с помощью FFmpeg

Я пытаюсь кодировать видео с ffmpeg в H.264 (через библиотеку libx264) с постоянной скоростью передачи. Я знаю, я знаю, что VBR часто предпочтительнее, но для этой конкретной работы я должен использовать CBR (столько же, сколько и столько килобайт в секунду, это не должно быть точных килобайт на фрейм, afaik), Мое тестовое видео, которое я использую для тестирования, находится здесь: http://a1408.g.akamai.net/5/1408/1388/2005110403/1a1a1ad948be278cff2d96046ad90768d848b41947aa1986/sample_iTunes.mov.zip (он исходит из http://support.apple.com/kb/HT1425)

Я могу получить постоянную скорость передачи данных при кодировании видео с помощью MPEG-4 Video (используя команды ffmpeg -i sample_iTunes.mov -b 819968 -minrate 819968 -maxrate 819968 out.mov), и скорость передачи данных будет такой, как ожидалось. Считывая спецификации видео через QuickTime Inspector, он получил скорость передачи данных 844,94 кбит/с. Круто.

Однако, когда я меняю кодек на libx264, он, кажется, полностью игнорирует мои запросы на битрат! Команда, которую я пытаюсь сделать, это "ffmpeg -i sample_iTunes.mov -vcodec libx264 -vpre medium -b 819968 -vb 819968 -minrate 819968 -maxrate 819968 -bufsize 400000 test.mov". Но когда я проверяю спецификации видео через QuickTime Inspector, он получает скорость передачи данных 254,74 кбит/с. WTF? Это даже не близко!

Я попробовал изменить так много параметров и добавить много разных вещей, и я потратил 2 дня на поиски в Google, но я не могу заставить его работать. Если я кодирую видео с помощью кодировщика MainConcept H.264, я могу получить постоянный битрейт, но мне нужно это для работы с ffmpeg.

Если кто-то может помочь мне понять, как сделать кодировку CBR H.264 с помощью FFmpeg, я буду любить вас навсегда!

Ответ 1

Я тоже работал над попыткой получить CBR из x264. Я нашел этот блог post темным Шакари довольно интересным.

Вот что я имею для видео с низкой задержкой CBR в потоке трансакций MPEG:

ffmpeg -i sintel_trailer-720p.mp4 -an -tune zerolatency \
       -x264opts bitrate=4000:vbv-maxrate=4000:vbv-bufsize=166 \
       -vcodec libx264 -f mpegts -muxrate 4000K -y trailer.ts

В блоге разработчиков x264 вы устанавливаете:

  • vbv-maxrate = bitrate = B = целевой битрейт
  • vbv-bufsize = B/fps (в этом видео-случае, что 24 кадра в секунду)

Наконец, установите переключатель ffmpeg для x264 -tune zerolatency.

Надеюсь, что это полезно. И, если у кого есть улучшения, пожалуйста, дайте мне знать!

Ответ 2

Укажите -nal-hrd cbr после -bufsize 400000.

Ответ 3

Хорошо, поэтому я думаю, что, возможно, нашел часть проблемы. Создание -bufsize, превышающее скорость передачи данных, похоже, решило проблему. Конечно, я не знаю, кодирует ли он реальный CBR, но скорость передачи данных, которую Quick Time Inspector читает, выглядит прямо сейчас.