使用ffmpeg在视频上添加水印并调整图片大小

4

我希望能够使用包含网站URL的徽标图像为视频添加水印。这些视频可以是不同的格式和大小。

我正在尝试找出一种通用的ffmpeg命令来实现它,以便我不必根据需要处理的视频调整命令。目前我已经得到了以下命令:

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有一个scale选项,但我还不知道是否可以根据输入视频的尺寸调整图像logo的大小,这样我就可以说将logo按比例缩小到视频长度的1/3,并保持图片比例。 有什么想法?不必在一个命令中完成,甚至可以是脚本。 提前致谢。
2个回答

2
同时,我想到了这个可以完成任务的脚本:

在此期间,我想到了这个可以完成任务的脚本:

#!/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”可以保持相同的视频质量,但结果视频大小变小了。

我注意到这个问题:

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

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


感谢您的脚本。选项“-sameq”必须更改为“-qscale 0”。 在执行您的脚本后,会显示一些错误消息: <code> 选项“sameq”已被删除。如果您正在寻找保留质量的选项(这不是-sameq的用途),请使用-qscale 0或等效的质量因子选项。 </code> 这里我的ffmpeg版本是4.1.3 - chx3

1
感谢您提供的想法,Ae!
使用 PowerShell 可以完成相同的操作:
$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分发版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接