Добавьте наложение изображения перед видео, используя ffmpeg

У меня есть много видео, и мне нужно поместить изображение перед ними примерно на 5 секунд, но добавление его вручную и рендеринг каждый раз займет очень много времени, поэтому я спрашиваю, возможно ли это сделать через ffmpeg, и если вы не могли бы, пожалуйста, помочь мне с этим, так как у меня нет опыта работы с ffmpeg. Я уже нашел несколько команд, но ни одна из них не сработала. Этот например.

ffmpeg -itsoffset 5 -i in.mp4 -r 25 -loop 1 -i intro.png -filter_complex "[1:v] fade=out:125:25:alpha=1 [intro]; [0:v][intro] overlay [v]" -map "[v]" -map 0:a -acodec copy out.mp4
Вы просто скопировали эту команду или написали ее в соответствии с вашими потребностями? Я спрашиваю, потому что эта команда включает в себя такие вещи, как затухание и множество других вещей, которые не рассматриваются в вашем вопросе. Вам просто нужно наложить изображение или вам нужно больше?
Я его откуда-то скопировал, все, что мне нужно, это просто поставить изображение перед видео.

Ответы (2)

Вы можете сделать простое наложение изображения, используя следующий синтаксис:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=25:25:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

overlay=25:25означает, что мы хотим расположить изображение на 25 пикселей вправо и на 25 пикселей вниз, исходя из верхнего левого угла (0:0).

enable='between(t,0,20)'означает, что мы хотим, чтобы изображение показывалось между 0 и 20 секундами.

[0:v][1:v]означает, что мы хотим, чтобы первый видеофайл, который мы импортируем с помощью -i, в нашем случае input.mp4 или как его видит ffmpeg, номер входного видеофайла 0, находился под входным видеофайлом 1, в нашем случае image.png. :vпросто означает, что нам нужна видеодорожка из этих источников файлов. [0:a]означает, что нам нужна первая импортированная звуковая дорожка. Который также будет исходить из input.mp4, но будет указывать на звуковую дорожку, а не на видеодорожку в файле mp4.

Если вам нужно определенное качество/настройки изображения, а не настройки, которые выбирает ffmpeg, добавьте параметры кодирования изображения и/или звука, которые вы хотите использовать. Кодировщик видео по умолчанию будет x264. Возможные настройки см. в руководстве по кодированию H.264 .

/ который у вас есть в вашей команде fe -acodec copy, -c:a copyпросто повторно использует звук из исходного файла. Хотя вы, конечно, не можете сделать это с видео (в данном случае), его необходимо перекодировать, потому что мы создаем новый источник видео.

Если вы хотите перекодировать аудио, удалите -c:a copyчасть. Возможно, вам придется явно указать кодировщик, например -c:a aac -strict experimental. Дополнительные сведения см. в руководстве по кодированию AAC .

Следующая итерация приведенной выше команды сработала для меня на Android, поскольку исходная выдает ошибку, например aac, является экспериментальной функцией: ffmpeg -i input.mp4 strict -2 -i image.png -filter_complex [0:v][1: v] overlay=25:25:enable='между(t,0,20)' output.mp4
можно ли как-то расположить внизу, не зная высоты? или далеко справа не зная ширины?
конечно, просто проанализируйте видео с помощью ffprobe и извлеките размеры видео из вывода. Возможно, в ffmpeg есть встроенная опция, но я о ней не знаю.
Есть ли какой-либо метод или расчет, благодаря которому изображение появляется в центре?
Ваша команда заменяет фрагмент исходного видеофайла, но пользователь может захотеть добавить (таким образом увеличив продолжительность видео) изображение до и/или после видео. Пожалуйста, помогите с этим
@porton Это вопрос был о добавлении наложения, если вам нужна помощь по другой проблеме, не стесняйтесь открывать новый вопрос в правом верхнем углу этой страницы с помощью кнопки «Задать вопрос».
Можем ли мы использовать GIF вместо PNG для той же цели? @PTS
Конечно, все форматы, поддерживаемые FFMPEG. Вы также можете использовать видеофайл.
Я думаю, что опция -strict-experimental больше не нужна.
@PTS На самом деле, здесь задают именно этот вопрос, на который вы вообще не ответили . Нигде он не спрашивал, как наложить изображение поверх видео, а как его вставить до начала видео (используя фильтр наложения ). Обратите внимание на формулировку вопроса, -itsoffset в его примере кода и нежелательную альтернативу (отображение отдельно).
Возможно, он попробовал это из-за явно запутанной формулировки. Если бы это было не то, чего он хотел, то он, вероятно, не принял бы это как ответ на этот вопрос. Если у вас есть проблемы с этим, вы всегда можете задать новый вопрос, касающийся дела, которое вы ищете.
А к чему pix_fmtспор? Я вижу это в большинстве команд ffmpeg, но независимо от того, включаю я его или удаляю, результат тот же. Действительно ли полезно помещать его в команду?
@laurent, который зависит от вашего исходного файла и/или вывода. pix_fmt означает формат пикселей. Существует множество различных форматов пикселей для разных кодеков. Указание одного из них гарантирует, что вы не получите то, что вам не подходит. yuv420p является наиболее поддерживаемым форматом пикселей, когда речь идет о h264, но есть также, например, yuv422p и yuv444p.
@Deepak, если у вас есть новый вопрос, пожалуйста, откройте его. Однако вы можете попробовать закодировать изображение в видео определенной длины. Снова, пожалуйста, откройте новый вопрос, комментарии не место для этого.
вау, это сработало прямо из коробки для меня! Благодарность
Есть ли способ изменить размер изображения перед его наложением или это нужно сделать заранее?
@BallpointBen ты нашел способ изменить размер?

Это дополнение к отличному ответу PTS и ответ для chovy. Если вы хотите разместить оверлей в правом нижнем углу, FFMPEG может очень легко вычислить это для вас.

Используйте модифицированную команду:

ffmpeg -i input.mp4 -i image.png \
-filter_complex "[0:v][1:v] overlay=W-w:H-h:enable='between(t,0,20)'" \
-pix_fmt yuv420p -c:a copy \
output.mp4

Ww означает ширину основного видео минус ширину наложения, и то же самое для Hh.

Спасибо, что рассказали секретный ответ: что такое Ww, в документации об этом действительно неясно сказано.
@AlexSham W— это ffmpegпсевдоним ширины видео, на которое вы накладываете, и wпсевдоним ширины накладываемого изображения. То же самое с Hи h. Они также могут называться main_w(или _h) и overlay_w(или _h)
Спасибо за этот трюк. Что, если w больше, чем W, или h больше, чем H. Моя цель — центрировать оверлей на видео независимо от их размеров. Я боюсь, что ffmpeg может выдать исключение, если есть отрицательные значения. Также filter_complexвсегда ли выходное видео имеет тот же размер, что и входное видео? Или это делает его того же размера, что и больший размер входного видео и наложения png?
Я не уверен в функциональности, если оверлей больше, так как это необычный вариант использования. Возможно, что-то вроде (Ww)/2?