Стандартные настройки транскодирования FFMPEG

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

Я использую следующую примерную FFMPEGкоманду для transcodeвидео:

ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0 
-s 1280x720 -vcodec libx264 -strict experimental -pix_fmt yuv420p 
-profile:v baseline -movflags +faststart -acodec aac -profile:a aac_low 
-b:v 2000k -refs 6 -coder 1 -sc_threshold 40 -flags +loop -me_range 16 
-subq 7 -i_qfactor 0.71 -qcomp 0.6 -qdiff 4 -trellis 1 -b:a 128k outputvideo.mp4

Команда генерируется динамически с использованием языка программирования после загрузки сведений о видео. Что я делаю, так это просто сбрасываю битрейт, высоту и ширину видео, используя следующие настройки:

Если height >= 720затем установить его на 720, ширина будет автоматически установлена ​​​​в соответствии с высотой и bit-rateбудет равна 5000k,

Если height >= 480затем установить его на 480, ширина будет автоматически установлена ​​​​в соответствии с высотой и bit-rateбудет равна 2500k,

Если height >= 360затем установить его на 360, ширина будет автоматически установлена ​​в соответствии с высотой и bit-rateбудет1000k

Я получил эту логику из этой ссылки .

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

При поиске я нашел другую ссылку , и она имеет другой битрейт, чем тот, который я использую. Я не уверен, какой из них лучше.

Может ли кто-нибудь предложить мне, как уменьшить размер видео на 25-30% больше, чем текущие настройки, не влияя на качество видео?

Ответы (1)

Вместо того, чтобы использовать постоянный битрейт, попробуйте использовать постоянное качество (также известный как коэффициент постоянной скорости или crf).

Поэтому вместо -b:v 2000использования -crf 23(отрегулируйте число, чтобы изменить качество, чем выше, тем меньше/ниже качество и ниже больше/лучше качество).

Постоянное качество обычно дает вам большую отдачу от ваших битов, так как экономит битрейт там, где он на самом деле не нужен. Это также устраняет необходимость в дополнительных сценариях для разных размеров, поскольку автоматически снижает битрейт для меньших размеров кадров.

Вы также можете использовать предустановки x264, такие как -preset slowerили , -preset veryslowчтобы заставить x264 тратить больше времени на оптимизацию. Это также избавляет от необходимости добавлять все дополнительные флаги кодирования — пресеты в основном представляют собой готовые флаги кодирования (предположительно, сделанные людьми, которые знают, что они делают). Подробнее о кодировании x264 здесь

Таким образом, ваша команда может выглядеть так:

ffmpeg -y -i inputvideo.mp4 -async 1 -metadata:s:v:0 start_time=0 -s 1280x720 -vcodec libx264 -pix_fmt yuv420p -profile:v baseline -movflags faststart -profile:a aac_low -preset slower -crf 23 -b:a 128k outputvideo.mp4

Я не думаю, что вам нужен -strict-experimentalфлаг, если у вас нет старой версии ffmpeg.

+1 за -crf. Если у вас есть время, -crf 23 и veryslow могут дать очень компактные файлы с довольно хорошим качеством.