Как объединить и вывести различные битрейты видео и отдельный аудиофайл? - PullRequest
0 голосов
/ 05 октября 2018

Как объединить и вывести различные битрейты видео и отдельный аудиофайл в ffmpeg?

Мое требование:

  1. У меня 4 входных файла.
  2. Необходимо сшить все 4 файла в один сегмент.
  3. Требуется вывод с четырьмя различными битрейтами видео: 500k, 800k, 1000k, 1500k
  4. . Вместе с тем мне нужно извлекать только аудио из сшитого файла..

Таким образом, мой вывод будет 4 разных битрейта видео + 1 аудиофайл.

1 Ответ

0 голосов
/ 05 октября 2018

tee muxer

Наиболее эффективным методом является использование tee muxer (больше примеров ), чтобы избежать ненужного кодирования звука для каждого выхода, но это сложноиспользовать:

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][aud];[v]split=4[v0][v1][v2][v3]" -map "[v0]" -b:v:0 500k -map "[v1]" -b:v:1 800k -map "[v2]" -b:v:2 1000k -map "[v3]" -b:v:3 1500k -map "[aud]" -c:v libx264 -c:a aac -f tee "[select=\'v:0,aud\':movflags=faststart]500.mp4|[select=\'v:1,aud\':movflags=faststart]800.mp4|[select=\'v:2,aud\':movflags=faststart]1000.mp4|[select=\'v:3,aud\':movflags=faststart]1500.mp4|[select=aud:movflags=faststart]audio.m4a"

Этот пример метода не выполняет два прохода, которые вы должны делать при использовании метода старой школы - ручной выбор скорости передачи битов для потоковых выходных данных.См. FFmpeg Wiki: H.264 .

более простой, но менее эффективный метод

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

ffmpeg -i 1.mp4 -i 2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a];[v]split=4[v0][v1][v2][v3];[a]asplit=4[a0][a1][a2][a3]" -map "[v0]" -map "[a0]" -b:v 500k -movflags +faststart 500.mp4 -map "[v1]" -map "[a1]" -c:v libx264 -c:a aac -b:v 800k -movflags +faststart 800.mp4 -map "[v2]" -map "[a2]" -b:v 1000k -movflags +faststart 1000.mp4 -map "[v3]" -map "[a3]" -b:v 1500k -movflags +faststart 1500.mp4

Но так как вы хотите нацелиться на определенный битрейт, вы должны выполнить два прохода:

ffmpeg -y -i 1.mp4 -i 2.mp4 -filter_complex "[0:v][1:v]concat=n=2:v=1:a=0[v];[v]split=4[v0][v1][v2][v3]" -map "[v0]" -b:v 500k -pass 1 -passlogfile 500 -f mp4 /dev/null -map "[v1]" -c:v libx264 -c:a aac -b:v 800k -pass 1 -passlogfile 800 -f mp4 /dev/null -map "[v2]" -c:v libx264 -c:a aac -b:v 1000k -pass 1 -passlogfile 1000 -f mp4 /dev/null -map "[v3]" -c:v libx264 -c:a aac -b:v 1500k -pass 1 -passlogfile 1500 -f mp4 /dev/null
ffmpeg -y -i 1.mp4 -i 2.mp4 -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[v][a];[v]split=4[v0][v1][v2][v3];[a]asplit=5[a0][a1][a2][a3][a4]" -map "[v0]" -map "[a0]" -c:v libx264 -c:a aac -b:v 500k -pass 2 -passlogfile 500 -movflags +faststart 500.mp4 -map "[v1]" -map "[a1]" -c:v libx264 -c:a aac -b:v 800k -pass 2 -passlogfile 800 -movflags +faststart 800.mp4 -map "[v2]" -map "[a2]" -c:v libx264 -c:a aac -b:v 1000k -pass 2 -passlogfile 1000 -movflags +faststart 1000.mp4 -map "[v3]" -map "[a3]" -c:v libx264 -c:a aac -b:v 1500k -pass 2 -passlogfile 1500 -movflags +faststart 1500.mp4 -map "[a4]" -movflags +faststart audio.m4a

Если вы используете Windows, замените/dev/null с NUL в приведенных выше примерах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...