У меня есть файл PNG (альфа) и видеофайл. Я хочу создать видео, в котором первая дорожка — это изображение, а вторая — видео (PNG поверх видео). Проблема в том, что PNG не сохраняет прозрачность.
Мне нужно создать водяной знак (PNG) на отдельной дорожке с помощью ffmpeg поверх видеодорожки.
ffmpeg -i base.mov -i logo.png -map 0 -map 1 output.mov
решение1
Синтаксис добавления водяного знака немного отличается. Для этого вам понадобятся видеофильтры, которые уже идут в комплекте с FFmpeg.
Я не уверен, что можно добавить прозрачный водяной знак на отдельную дорожку. Причина в том, что само изображение (PNG "поток") нужно превратить в фактическую видеодорожку (например, с помощью x264) – и поскольку видеокодеры не поддерживают прозрачность на этом этапе, вы не получите прозрачное изображение.
Следующий будет добавлен logo.png
в base.mov
правом верхнем углу. Вы можете использовать следующие параметры для определения положения – в моем примере я просто разместил его на расстоянии десяти пикселей от границы:
main_w
(ширина основного видео)main_h
(высота основного видео)overlay_w
(ширина наложенного видео)overlay_h
(высота наложенного видео)
Тогда команда фильтра будет выглядеть так:
movie='logo.png' [logo]; [in][logo] overlay=main_w-overlay_w-10:10 [out]
Превращаем это в полноценную команду FFmpeg:
ffmpeg -i base.mov -vf "movie='logo.png' [logo]; [in][logo] overlay=main_w-overlay_w-10:10 [out]" -c:v libx264 -crf 20 out.mov
Параметры -c:v libx264 -crf 20
определяют выходной видеокодек и его качество (где CRF, вероятно, будет от 19 до 24, в зависимости от желаемого качества; чем ниже, тем лучше).
На эту тему есть довольно хорошая запись в блоге:Как наложить водяной знак на видео с помощью FFmpeg. Это касается деталей позиционирования.