1

Я пытаюсь сжать видео 10 секунд на разных битрейтах с помощью ffmpeg. Моя цель - получить одно и то же видео с разным качеством (от очень низкого до очень высокого). Я не хочу касаться аудио части, и я использую H264 в качестве видеокодека. Я использую следующий CLI:

ffmpeg -i input.mkv -c:v libx264 -b:v $j'k' -c:a copy output.mkv

Где $ j варьируется от 150 до 4000.

Моя проблема в том, что я получаю сжатые видео 10 с, но качество не постоянно на протяжении всего времени. Вот пример: с очень низким битрейтом ($ j = 150) в начале (от 0 до 3 с) видео действительно плохое, но в конце (от 8 до 10 с) качество хорошее! Кроме того, во время просмотра видео можно увидеть это повышение качества во времени. Может кто-нибудь объяснить мне это явление? Как получить постоянное качество?

Спасибо'

1 ответ1

2

Как уже указывал @LordNeckbeard, постоянный битрейт - это не то же самое, что постоянное качество. На самом деле все как раз наоборот. Некоторые части видеопоследовательностей легче кодировать, чем другие (проще в том смысле, что требуется меньше битов), а другие нет. Если вы потратите все свои биты на легкие части, вам будет не хватать их для более сложных деталей.

Вот где в игру вступает постоянное качество. В x264 есть коэффициент постоянной скорости, который делает именно это. Я предлагаю вам прочитать связанную статью, если вы хотите получить дополнительную информацию. В основном, CRF варьируется от 0 (без потерь, лучший) до 51 (худший). Шаги ± 6 примерно равны двойному или половинному битрейту.

Итак, чтобы адаптировать ваш скрипт, просто сделайте что-то вроде следующего:

for i in $(seq 0 5 51); do 
  ffmpeg -i input.mkv -c:v libx264 -crf $i -c:a copy output-$i.mkv
done

Сам масштаб, если я не ошибаюсь, близок к логарифмическому с точки зрения качества, поэтому вы можете рассчитывать свои шаги на основе этого вместо вызова seq .


С очень низким битрейтом ($ j = 150), в начале (от 0 до 3 с) видео действительно плохое, но в конце (от 8 до 10 с) качество хорошее! Кроме того, во время просмотра видео можно увидеть это повышение качества во времени. Может кто-нибудь объяснить мне это явление?

Создание постоянной скорости передачи данных не является легкой задачей для кодера. Вы задаете ему определенное значение для работы, например, говорите «дай мне 150 кбит / с», но кодировщик даже не знает, что он собирается кодировать в следующем кадре.

Итак, сколько он должен потратить на этот кадр? Сколько на следующий? Некоторые кадры, как я упоминал выше, легко кодируются и занимают всего несколько килобит, а другие могут занимать гораздо больше. Но кодировщик может действительно только смотреть на то, что он кодировал в прошлом, чтобы масштабировать для будущих изображений. Также примите во внимание различные типы изображений.

Алгоритмически делать постоянный битрейт действительно сложно, и это также худший из режимов управления скоростью, которые может предложить x264. Особенно для коротких клипов, поскольку кодировщик не будет знать, чего он может ожидать, не выполняя двухпроходное кодирование, вы можете заметить это описанным способом: качество резко меняется в течение десяти секунд. Но 150 кбит / с действительно недостаточно для видео достаточно приличных размеров.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .