Fffmpeg drawtext过滤器会创建较大的输出文件并占用较高的CPU?

时间:2019-07-09 12:20:09

标签: video ffmpeg filtering

我有一个视频输入文件,在上面可以绘制用户输入的文本。我可以使用ffmpeg的drawtext过滤器在视频文件上绘制文本,并且可以正常工作,但是主要问题出现在ffmpeg命令中。

那是当我运行ffmpeg命令时发生的三件事:- 1.输出视频文件的大小大于输入文件的大小。 2.输出视频文件比输入视频文件丢失视频质量。 3. cpu越来越高了。

正在使用is-的ffmpeg命令-

ffmpeg -i input1.asf -vf drawtext="fontfile=/path/to/font.ttf: \text='Stack Overflow': fontcolor=white: fontsize=24: box=1: boxcolor=black@0.5: \boxborderw=5: x=10: y=10" -codec:a copy IndVsNZ.asf

为避免视频质量下降,我使用了此参数“ -c:v libx264 -crf 20”。

我要实现的目标是,我可以在视频文件上绘制文本而不会丢失质量,输出文件的大小与输入文件相同,并且cpu较低(因为它使我的系统挂起)。

我已经尝试了Internet上的各种解决方案,但是找不到问题。如果有任何与此相关的链接,请分享。我是ffmpeg的新手。

谢谢!

1 个答案:

答案 0 :(得分:2)

您正在比较不同的格式,不同的编码器实现方式,并处理代损耗。

  

输出视频文件的大小大于输入文件的大小。
  输出的视频文件比输入的视频文件失去视频质量。

您的输入视频流可能是现代有效的格式,例如H.264。但是,使用ffmpeg来.asf输出的默认编码器是msmpeg4v3,它输出视频格式MPEG-4第2部分Microsoft变体版本3。这是一种老式的,效率低下的编码器,默认设置糟糕。由于效率较低,因此相同质量需要花费更多的位。这就是为什么添加-c:v libx264 -crf 20可以提高每位质量的原因,因为这样可以实现更好的编码器和更现代的格式(H.264)。

您还将重新编码有损输入中存在的压缩伪像,这会进一步损害可压缩性。这称为generation loss

如果您要H.264视频,则可以调整CRF值。给它提供可以接受的质量的最高价值。尝试在18-26左右的范围内。使用您耐心最慢的-preset。有关更多信息,请参见FFmpeg Wiki: H.264

  

cpu越来越高了。

这是预料之中的。视频编码在计算上很昂贵。您可以使用-threads选项减少编码线程的数量和/或使用单独的工具来限制CPU使用率,例如Linux上的nice。但这会使编码花费更长的时间。