Я получил следующую команду в FFMpeg:

ffmpeg -i file_input.mp4 -filter_complex split=2[i1][i2];[i1]scale=trunc(oh*a/2)*2:480[o1];[i2]scale=trunc(oh*a/2)*2:640[o2] -map [o1] -map 0:a -pix_fmt yuv420p -vcodec libx264 file_out_1.mp4 -map [o2] -map 0:a -pix_fmt yuv420p -vcodec libx264 file_out_2.mp4

Эта команда по сути делит мой исходный файл на две части, масштабирует видео в 2 разных формах и перекодирует видеопотоки с использованием кодека x264 . Все идет нормально.

Теперь, пожалуйста, обратите внимание на -map 0:a флаг. Если я удаляю это из любого из двух потоков, у получающегося выходного файла не будет никакого аудио вообще. Это заставляет меня задуматься, удаляет ли фильтр scale автоматически звук из букета или это что-то еще.

Если я немного изменю команду на эту и попытаюсь извлечь аудиопоток из результирующего [o1] или [o2], я все равно не смогу получить звук:

ffmpeg -i eFront_sample.mp4 -filter_complex split=2[i1][i2];[i1]scale=trunc(oh*a/2)*2:480[o1];[i2]scale=trunc(oh*a/2)*2:640[o2] -map [o1]:a -pix_fmt yuv420p -vcodec libx264 file_out_1.mp4 -map [o2]:a -pix_fmt yuv420p -vcodec libx264 file_out_2.mp4

Что мне здесь не хватает?

Заранее спасибо.

1 ответ1

1

Выбор Steam

По умолчанию будет выбран один поток для каждого типа потока. Если вы используете -map то поведение выбора потока по умолчанию будет отключено.

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

Масштаб

Вместо trunc(oh*a/2)*2 вы можете просто использовать -2 . Из документации видеофильтра масштаба:

Если одно из значений равно -n с n> 1, фильтр масштабирования также будет использовать значение, которое поддерживает соотношение сторон входного изображения, рассчитанное из другого указанного измерения. После этого он, однако, удостоверится, что вычисленный размер делится на n, и при необходимости скорректирует значение.

x264 требует, чтобы ширина и высота делились на 2 при выводе yuv420p, поэтому -2 будет иметь дело с этим, предполагая, что ваше объявленное значение является приемлемым.

пример

Ваша итоговая команда может выглядеть примерно так:

ffmpeg -i input.mp4 -filter_complex \
"[0:v]split=2[i1][i2]; \
 [i1]scale=-2:480,format=yuv420p[o1]; \
 [i2]scale=-2:640,format=yuv420p[o2]" \
-map "[o1]" -map 0:a -c:v libx264 output1.mp4 \
-map "[o2]" -map 0:a -c:v libx264 output2.mp4

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