我尝试在原始视频上绘制几个文本。其中一个文本是水印,应该是斜的。
我之前的命令是绘制 2 个水平文本。此命令以 246 fps 运行
.\ffmpeg.exe -y -r 25 -f h264 -hwaccel nvdec -i input -vf
"drawtext=text='Bottom Center':x=(W-tw)/2:y=H-th-3:
fontfile=arial.ttf:fontsize=125:[email protected]:
box=1:[email protected]:boxborderw=5,
drawtext=text='Top Center':x=(W-tw)/2:y=3:
fontfile=arial.ttf:fontsize=72:fontcolor=4F81BD@1:
box=1:boxcolor=C0504D@1:boxborderw=5"
-c:v h264_nvenc output.mp4
但在我添加对角线水印文本后,fps 下降到 25。
.\ffmpeg.exe -y -r 25 -f h264 -hwaccel nvdec -i input -filter_complex
"color=black@0:100x100,format=yuva420p[c];[c]scale2ref[ct][mv];[ct]setsar=1,
drawtext=text='WATERMARK WATERMARK WATERMARK':x=(W-tw)/2:y=(H-th)/2:
fontfile=arial.ttf:fontsize=(w+h)/18:[email protected],
split[txt][alpha],[txt][alpha]alphamerge,
rotate=(-27*PI)/180:ow=rotw((-27*PI)/180):oh=roth((-27*PI)/180):c=black@0[rot];
[mv][rot]overlay=x=(W-w)/2:y=(H-h)/2:shortest=1,
drawtext=text='Bottom Center':x=(W-tw)/2:y=H-th-3:
fontfile=arial.ttf:fontsize=125:[email protected]:
box=1:[email protected]:boxborderw=5,
drawtext=text='Top Center':x=(W-tw)/2:y=3:
fontfile=arial.ttf:fontsize=72:fontcolor=4F81BD@1:
box=1:boxcolor=C0504D@1:boxborderw=5"
-c:v h264_nvenc output.mp4
为什么第二个命令不起作用?hwaccel nvdec
旋转 的预期结果是 25 fps 吗?c:v h264_nvenc
结果属于 FFmpeg 4.1.3、Windows 10 和 NVIDIA Quadro RTX 5000
我尝试了 FFmpeg 5.0.1,fps 增加了 25 到 ~40。但 FFmpeg 5.0.1 需要更新 gpu 驱动程序。
答案1
我们可以提前创建一个叠加的 PNG 图像,并将 PNG 图像叠加在视频之上。
假设旋转操作需要相对较长的时间,建议的解决方案仅应用一次旋转,而不是对每一帧都应用旋转。
准备叠加的 PNG 图像的示例:
ffmpeg -y -f h264 -hwaccel nvdec -i input.264 -filter_complex "color=black@0:100x100,format=rgba[c];[c]scale2ref[ct][mv];[ct]setsar=1,drawtext=text='WATERMARK WATERMARK WATERMARK':x=(W-tw)/2:y=(H-th)/2:fontfile=arial.ttf:fontsize=(w+h)/18:[email protected],split[txt][alpha],[txt][alpha]alphamerge,rotate=(-27*PI)/180:ow=iw:oh=ih:c=black@0,drawtext=text='Bottom Center':x=(W-tw)/2:y=H-th-3:fontfile=arial.ttf:fontsize=125:[email protected]:box=1:[email protected]:boxborderw=5,drawtext=text='Top Center':x=(W-tw)/2:y=3:fontfile=arial.ttf:fontsize=72:fontcolor=4F81BD@1:box=1:boxcolor=C0504D@1:boxborderw=5[fin];[mv]nullsink" -frames:v 1 -map "[fin]" rot_text.png
scale2ref
用于将图像的分辨率调整为视频的分辨率。[mv]nullsink
用于忽略[mv]
“未连接的”输出流。-frames:v 1
- 第一帧后停止。
将 PNG 图像叠加到视频上的示例:
ffmpeg.exe -y -r 25 -f h264 -hwaccel nvdec -i input -i rot_text.png -filter_complex "[0][1]overlay=x=(W-w)/2:y=(H-h)/2" -c:v h264_nvenc output.mp4
测试:
构建合成图案进行测试(例如应用低分辨率 192x108):
ffmpeg -y -f lavfi -i testsrc=size=192x108:rate=10:duration=10 -vcodec libx264 -pix_fmt yuv420p -f h264 input.264
构建rot_text.png
图像:
ffmpeg -y -f h264 -hwaccel nvdec -i input.264 -filter_complex "color=black@0:100x100,format=rgba[c];[c]scale2ref[ct][mv];[ct]setsar=1,drawtext=text='WATERMARK WATERMARK WATERMARK':x=(W-tw)/2:y=(H-th)/2:fontfile=arial.ttf:fontsize=(w+h)/18:[email protected],split[txt][alpha],[txt][alpha]alphamerge,rotate=(-27*PI)/180:ow=iw:oh=ih:c=black@0,drawtext=text='Bottom Center':x=(W-tw)/2:y=H-th-3:fontfile=arial.ttf:fontsize=12:[email protected]:box=1:[email protected]:boxborderw=5,drawtext=text='Top Center':x=(W-tw)/2:y=3:fontfile=arial.ttf:fontsize=7:fontcolor=4F81BD@1:box=1:boxcolor=C0504D@1:boxborderw=5[fin];[mv]nullsink" -frames:v 1 -map "[fin]" rot_text.png
将图像叠加于input.264
:
ffmpeg -y -r 25 -f h264 -hwaccel nvdec -i input.264 -i rot_text.png -filter_complex "[0][1]overlay=x=(W-w)/2:y=(H-h)/2" -c:v h264_nvenc output.mp4
将更多工作转移到 GPU - 使用overlay_cuda
:
以下命令将更多工作转移到 GPU(希望提高性能):
ffmpeg -y -vsync 0 -init_hw_device cuda=cuda -hwaccel cuda -hwaccel_output_format cuda -r 25 -f h264 -c:v h264_cuvid -i input.264 -hwaccel cuda -hwaccel_output_format cuda -i rot_text.png -filter_complex "[1]hwupload_cuda[rot];[0]scale_cuda=format=yuv420p[vid];[vid][rot]overlay_cuda=x=(W-w)/2:y=(H-h)/2" -c:v h264_nvenc output.mp4
上述命令需要更新的FFmpeg版本(即FFmpeg 5.01)。