使用ffmpeg在视频上加水印并缩放图像

Use ffmpeg to watermark and scale an image on video

我希望能够为带有徽标图像的视频加水印,该徽标图像包含一个网站URL。
视频可以具有不同的格式和尺寸。
我正在尝试找出通用的ffmpeg命令来实现它,这样我就不必根据要处理的视频来调整命令。
到目前为止,我得到了:

1
ffmpeg -i sample.mov -sameq -acodec copy -vf 'movie=logo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]' sample2.mov

通过这种方式,即使在使用不同尺寸的视频时,徽标看起来太大或太小。
我已经看到了avfilter的缩放选项,但是我没有弄清楚是否有可能根据输入视频的尺寸来调整图像徽标的大小,因此我可以说缩放徽标设置为例如视频长度的1/3,并保持图像比例。

有什么主意吗?不需要在单个命令中完成,甚至可以是一个脚本。
在此先感谢。


与此同时,我想出了执行此任务的脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

VIDEO=$1
LOGO=$2
VIDEO_WATERMARKED=w_${VIDEO}

VIDEO_WIDTH=`ffprobe -show_streams $VIDEO 2>&1 | grep ^width | sed s/width=//`
echo The video width is $VIDEO_WIDTH

cp $LOGO logo.png
IMAGE_WIDTH=$((VIDEO_WIDTH/3))
echo The image width will be $IMAGE_WIDTH

mogrify -resize $IMAGE_WIDTH logo.png
echo logo.png resized

echo Starting watermarking
ffmpeg -i $VIDEO -sameq -acodec copy -vf 'movie=logo.png [watermark]; [in][watermark] overlay=main_w-overlay_w-10:main_h-overlay_h-10 [out]' $VIDEO_WATERMARKED
echo Video watermarked

我唯一不确定的是如何保持相同的视频质量。我以为" -sameq"将保持相同的视频质量,但最终的视频尺寸较小。
我注意到了这一点:

1
2
3
4
5
6
7
8
INPUT
Duration: 00:01:25.53, start: 0.000000, bitrate: 307 kb/s
    Stream #0:0(eng): Video: mpeg4 (Simple Profile) (mp4v / 0x7634706D),
yuv420p, 640x480 [SAR 1:1 DAR 4:3], 261 kb/s, 10 fps, 10 tbr, 3k tbn, 25 tbc
OUTPUT
   encoder         : Lavf53.20.0
    Stream #0:0(eng): Video: h264 (avc1 / 0x31637661), yuv420p, 640x480 [SAR 1:
1 DAR 4:3], q=-1--1, 10 tbn, 10 tbc

而音频信息是相同的。
关于如何保持原始视频质量的任何建议?
谢谢


感谢您的想法,Ae。!

使用powershell进行相同操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
$videoFilename ="..."
$logoFilename ="..."

$videoInfo = (&"$($ffmpeg)ffprobe.exe" -show_streams -of xml -loglevel quiet $videoFilename) | Out-String
$videoStreamInfo = Select-Xml -Content $videoInfo -XPath"/ffprobe/streams/stream[@codec_type='video' and @width and @height][1]"

$videoWidth = $videoStreamInfo.Node.width
$videoHeight = $videoStreamInfo.Node.height

# logo will be 10% orginal video width
$logoWidth = $videoWidth/10

# preparing arguments
$a ="-i", $videoFilename,"-i", $logoFilename,"-filter_complex","[1]scale=$($logoWidth):$($logoWidth)/a [logo]; [0][logo]overlay=main_w-overlay_w-10:10","-ss","-y","-loglevel","error", $node.output
# logo actual height is cumputed by ffdshow`s scale filter at"$($logoWidth)/a". a - original video aspect ratio


# clear error stream for clear error handling
$error.Clear()
# execute ffmpeg
(&"$($ffmpeg)ffmpeg.exe" $a)

if($error.Count -gt 0){
    Write-Output"error! $error"
}

这里可以不使用" mogrify"工具,而仅使用ffmpeg分发。