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