我想将水印缩放到视频宽度的 5%。
我需要这样的东西:
ffmpeg -i 1.mp4 -i logo.png -filter_complex "[1:v] scale=1_MP4_VIDEO_WIDTH*0.05:-1 [logo1]; [0:v][logo1] overlay=0:0" -y -b 1600k -c:v libx264 -profile high -level 4.1 -c:a libfaac -q:a 128k 2.mp4
如何参考视频宽度?
答案1
假设一个 linux 环境(或 windows 上的 cygwin),我发现的唯一方法是执行 2 个命令。
首先获取主视频大小并对其进行计算(注意x/20 == x*0.05
::
val=`ffmpeg.exe -i 1.mp4 2>&1 | grep Video: | sed 's_.*, \([0-9]*x[0-9]*\) .*_\1_' | awk 'BEGIN {FS="x"} {print int($1/20)"x"int($2/20)}'`
第二步缩放和叠加视频
ffmpeg -i 1.mp4 -i logo.png -filter_complex "[1:v] scale=$val [logo1]; [0:v][logo1] overlay=0:0" -y -b 1600k -c:v libx264 -profile high -level 4.1 -c:a libfaac -q:a 128k 2.mp4
另外,您可以$val
用第一个表达式(包括反引号)替换第二行并获得相同的结果,但我发现将命令分成两部分更容易阅读。
答案2
现在可以直接使用scale2ref
过滤器执行此操作。
ffmpeg -i 1.mp4 -i logo.png \
-filter_complex "[1:v][0:v]scale2ref=iw*0.05:-1[logo1][base]; \
[base][logo1]overlay=0:0[v]" \
-map [v] -map 0:a -y -b:v 1600k -c:v libx264 -profile high -level 4.1 \
-c:a libfaac -b:a 128k 2.mp4
答案3
对于 Windows,我发现了以下使用 ffprobe 和 ffmpeg 的方法。这是一个 .bat 文件代码:
@echo off
SetLocal EnableExtensions EnableDelayedExpansion
for %%a in ("*.mp4") do (
For /F "usebackq" %%I In (`ffprobe -v error -show_entries stream"="width -of default"="noprint_wrappers"="1:nokey"="1 "%%~a"`) Do (
Set V=%%~I
ffmpeg -i "%%a" -i logo.png -b:v 1M -filter_complex "[1:v]scale=(SCALE_FACTOR*!V!):-1 [wm]; [0:v][wm] overlay=x=(main_w-overlay_w):y=(main_h-overlay_h)" -y -v 2 "new\%%~na.mp4"
)
)
这里 SLACE_FACTOR 是覆盖图像宽度除以某个参考视频文件宽度(例如 320px/1280px)。