Вы можете указать несколько входов для 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, когда входы имеют разные размеры?
Предположим, что видеопоток имеет разрешение 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 для всего кадра.
пользователь3643
-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]
работают здесь?пользователь3643
,
. Строка,
разделенных фильтров называется цепочкой фильтров. Разделите цепочки фильтров с помощью файла;
. Строка;
разделенных цепочек фильтров называется графом фильтра. Ссылочные входы с[x]
в начале цепочки. А[y]
в конце цепочки можно отправить по графу фильтра в другую цепочку.[0:v:0]
вызывает первый вход (в частности, только первый видеопоток). Фильтры применяются в цепочке, затем этот вывод называется[vid1]
.[vid1]
затем немедленно вызывается, как если бы это вход в следующую цепочку фильтров.