如何使用 ffmpeg 在视频的前 30 秒添加我的徽标?

iwo*_*can 10 ffmpeg

我正在尝试在带有 ffmpeg 的视频中的前 30 秒添加我的徽标。我有一个名为 的视频d1.mp4和一个名为 的徽标logo.png

视频开始时,水印应位于视频的左上角或右上角,并在 30 秒后消失。

你能告诉我如何添加它吗?

llo*_*gan 19

使用overlay视频过滤器视频添加徽标:

在此处输入图片说明

ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay" \
-codec:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)

要理解此命令,您需要知道流说明符是什么,阅读FFmpeg 过滤简介会有所帮助。[0:v]指的是第一个输入(video.mp4[1:v]的视频流, 指的是第二个输入(logo.mp4)的视频流。这就是您可以判断overlay要使用哪些输入的方式。您可以省略[0:v][1:v],并且overlay仍然可以工作,但建议明确并且不依赖可能未知的默认值。

默认情况下,徽标将放置在左上角。

使用-codec:a copy流式复制音频。这只是简单地重新混合音频而不是重新编码它。将其视为音频的“复制和粘贴”。

移动标志

此示例将徽标向右移动 10 个像素,向下移动 10 个像素: 在此处输入图片说明

ffmpeg -i video.mp4 -i logo.png -filter_complex "[0:v][1:v]overlay=10:10" \
-codec:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)

此示例将徽标从右侧移动 10 个像素,向下移动 10 个像素:

在此处输入图片说明

ffmpeg -i video.mp4 -i logo.png -filter_complex \
"[0:v][1:v]overlay=main_w-overlay_w-10:10" -codec:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)

main_w指“主”输入(背景或[0:v]overlay_w的宽度,指“覆盖”输入(徽标或[1:v])的宽度。因此,在示例中,这可以转换为overlay=320-90-10:10overlay=220:10

定时叠加

一些过滤器可以处理时间线编辑,允许您使用算术表达式来确定何时应用过滤器。请参阅ffmpeg -filters查看哪些过滤器支持时间线编辑。

此示例将显示徽标直到 30 秒:

ffmpeg -i video.mp4 -i logo.png -filter_complex \
"[0:v][1:v]overlay=10:10:enable=between(t\,0\,30)" -codec:a copy out.mp4
Run Code Online (Sandbox Code Playgroud)

如果您想使徽标褪色,请参阅mark4o 的回答


mar*_*k4o 13

ffmpeg -i in.mp4 -framerate 30000/1001 -loop 1 -i logo.png -filter_complex
  "[1:v] fade=out:st=30:d=1:alpha=1 [ov]; [0:v][ov] overlay=10:10 [v]" -map "[v]"
  -map 0:a -c:v libx264 -c:a copy -shortest out.mp4
Run Code Online (Sandbox Code Playgroud)

这假设徽标是具有 Alpha 通道的单个静止图像,并且您希望将其覆盖在帧速率为 30000/1001(NTSC 速率)的视频上。-framerate如果不同,请更改以匹配您的输入视频。如果您的徽标是视频,则省略-framerate 30000/1001 -loop 1. 如果徽标没有 alpha 通道,请通过format=yuva420p,在 之前插入例如添加一个fade

这将在 x,y 位置 10,10 处显示徽标 30 秒,然后淡出 1 秒。

  • @Rajib:静止图像的`-framerate` 和`-loop` 的原因是淡出会起作用。如果只有一个帧,那么它无法在 1 秒的间隔内淡出。理想情况下,它应该与视频具有相同的帧速率,以便淡入淡出尽可能平滑。 (4认同)