Ffmpeg 使用 hwaccel 旋转绘制文本

Ffmpeg 使用 hwaccel 旋转绘制文本

我尝试在原始视频上绘制几个文本。其中一个文本是水印,应该是斜的。

我之前的命令是绘制 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)。

相关内容