Как указать разные флаги для входов с помощью FFMPEG?

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

ffmpeg -i vid1.mp4 -i vid2.mp4 [commands] output.mp4

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

 ffmpeg -i vid1.m2t -i vid2.mp4 -map 0:a -filter_complex "[0:v:0][1:v:0]vstack=inputs=2" -crf 24 -c:a aac -b:a 128k -ac 1 -movflags +faststart output.mp4

vid1.m2tпредставляет собой анаморфотный поток hdv mpeg 1440 и vid2.mp4обычный 1920 h.264. Используя -filter_complex "[0:v:0][1:v:0]vstack=inputs=2"я пытаюсь сложить vid1 поверх vid2, но я получаю сообщение об ошибке, в котором говорится, что это не может продолжаться, потому что два видео имеют разную ширину. Ну да, за исключением того, что на дисплее m2t на самом деле имеет ширину 1920, а не 1440.

Когда я конвертирую только hdv сам по себе, я использую -filter_complex "scale=1920:1080,setsar=1"для обеспечения квадратных пикселей. Я знаю, что это работает хорошо, но как я могу включить это в эту команду vstack? Если я вставлю его с другим, я получаю ошибки. Я пробовал разные способы, в том числе перед вводом (думая, что это заставит ffmpeg применять его только к вводу, прежде чем отправлять его другим командам для вывода), но все они делают ошибки.

Кроме того, мне интересно, -crf 24можно ли указать команду для каждого входа. При индивидуальном преобразовании m2t должен быть 24 или меньше, иначе он выглядит плохо, в то время как mp4 может достигать 30. Возможно, я неправильно понимаю, что делает vstack, но я думаю, что если я могу сказать ffmpeg уделять другое внимание к качеству для каждого входа уменьшит размер файла.


У меня такая же проблема с hstack. FFMPEG будет отображать вывод, но файл m2t имеет ширину 1440, поэтому он искажен. Таким образом, общая ширина видео составляет 3360 вместо 3840.


Может быть, более конкретно для этой конкретной проблемы, как я могу использовать vstack или hstack, когда входы имеют разные размеры?

Ответы (1)

Предположим, что видеопоток имеет разрешение 1440x1080 с соотношением сторон выборки/пикселя 1,333, что приводит к отображению 1920x1080. Имейте в виду, что фактическое разрешение потока и того, что хранится в файле, составляет 1440x1080. Флаг соотношения сторон сообщает потребляющему приложению (проигрывателю/редактору..), что предполагаемая пропорция экрана отличается от необработанного отношения ширины к высоте, и что оно должно использовать соотношение сторон для изменения масштаба видео для получения точного отображения. FFmpeg не будет автоматически создавать квадратные пиксели видео, поскольку пользователь может этого не захотеть.

Фильтры стека требуют, чтобы все потоки имели одинаковый размер на интерфейсе, к которому они присоединяются: для hstack это высота, а для vstack — ширина. Имеет значение только необработанный размер, соотношение сторон — это просто информационный флаг.

Таким образом, вам придется масштабировать первый вход перед суммированием.

Использовать

ffmpeg -i vid1.m2t -i vid2.mp4 -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1[vid1];[vid1][1:v:0]vstack=inputs=2" -map 0:a -crf 24 -ac 1 -c:a aac -b:a 128k -movflags +faststart output.mp4

Что касается энкодера, то ему просто предъявляется один поток 1920х2160 - историческое происхождение и композиция утеряны. Теперь, если вы хотите применить разные уровни сжатия к частям кадра, это называется кодированием области интереса . Некоторые первоначальные исправления были применены в прошлом месяце, чтобы разрешить это для x264 и x265, но они еще не работают. Я обновлю этот ответ, когда он станет таким, но пока вы можете назначить только одно значение CRF для всего кадра.

Спасибо, Гьян. Работает как положено. У меня также была необходимость настроить яркость и насыщенность на m2t, но не на mp4, поэтому я повозился с этим и придумал -filter_complex "[0:v:0]scale=iw*sar:ih,setsar=1,eq=brightness=0.2:saturation=1.5[vid1];[vid1][1:v:0]vstack=inputs=2". Я очень рад, что это работает, но я не понимаю синтаксис этой команды. Можете ли вы немного объяснить, как , ;и [vid1]работают здесь?
Отвечая на мой собственный вопрос здесь: отдельные фильтры с расширением ,. Строка ,разделенных фильтров называется цепочкой фильтров. Разделите цепочки фильтров с помощью файла ;. Строка ;разделенных цепочек фильтров называется графом фильтра. Ссылочные входы с [x]в начале цепочки. А [y]в конце цепочки можно отправить по графу фильтра в другую цепочку. [0:v:0]вызывает первый вход (в частности, только первый видеопоток). Фильтры применяются в цепочке, затем этот вывод называется [vid1]. [vid1]затем немедленно вызывается, как если бы это вход в следующую цепочку фильтров.