ffmpeg - 如何在不损失质量的情况下应用过滤器

时间:2013-12-06 23:29:09

标签: ffmpeg

这是一个简单的请求,它有一个输入,输出和两个水印。根据我收集的内容,我无法应用-codec copy,因为我正在使用过滤器。

ffmpeg -i input.mp4 -i wm-bl.png -i wm-br.png -filter_complex "overlay=x=0:y=H-h,overlay=x=W-w:y=H-h" output.mp4

就水印而言,这就是诀窍,但输出被压缩到原始文件大小的一半。

是否可以在不损失视频质量的情况下进行水印?

3 个答案:

答案 0 :(得分:13)

您必须重新编码才能执行任何过滤

因此,在过滤时stream copying的任何尝试都将被忽略。这就是为什么-codec copy对你没有任何作用的原因。

您可以重新编码为无损格式

虽然您必须重新编码进行过滤,但这并不意味着您必须失去质量。您可以使用无损编码器:

  • -codec:v libx264 -crf 0 -preset veryslow
  • -codec:v huffyuv
  • -codec:v ffv1
  • -codec:v ffvhuff

输出文件大小可能很大(它们是无损的)。

如果发生色度子采样,您可能会遇到一些损失。

有损,但看起来无损

或者,您可以使用看起来“视觉无损”的正确编码设置,但在技术上并非真正无损。创建视觉无损的H.264视频示例(取决于输入和查看器,因为质量是主观的):

ffmpeg -i input -codec:v libx264 -crf 18 -preset slow -pix_fmt yuv420p out.mp4

概括地说,-crf控制质量:范围是0-51的对数标度,0是无损的,~18通常被视为视觉无损,23是默认值。 -preset控制编码速度:超快,超快,非常快,更快,更快,中等(默认),慢,慢,更快。

-pix_fmt yuv420p将允许编码器使用与QuickTime等troglodyte播放器兼容的色度子采样方案。根据您的输入,您的ffmpeg版本以及您将如何使用输出,可能需要也可能不需要它,但是对于一般用途,使用libx264时包含它并没有什么坏处。

另见

答案 1 :(得分:1)

不幸的是,在使用 overlay 过滤器时是不可能的(至少在我使用的 FFmpeg 版本 4.1.6-1~deb10u1 中),即使您对最终输出文件使用无损编码器。由于overlay过滤器本身在处理过程中使用了有损编码,叠加后图像质量肯定会下降;但是这种降级通常不会很明显,并且此过滤器非常适合大多数视频。

但如果您的输入文件已经是无损格式,并且您绝对想要无损结果,则不要使用 overlay 过滤器。我没有很好的解决方案,但这是我的解决方法。

  • 将原始视频逐帧提取为 PNG 文件:
mkdir frames
ffmpeg -i input.mp4 frames/%d.png
  • 在视频上添加水印或任何您想要叠加的内容;本示例中使用了 GraphicsMagick:
for f in frames/*.png; do gm composite -geometry +0+640 wm-bl.png "$f" "$f"; gm composite -geometry +1100+640 wm-br.png "$f" "$f"; done
  • 使用无损编码格式将帧重新组合成新的视频文件;还记得指定与原始视频相同的帧率:
ffmpeg -framerate 30 -i frames/%d.png -qp 0 -pix_fmt yuv444p output.mp4

很明显,这种解决方法效率很低——一个一个修改大量的PNG文件需要很长时间,尤其是原始视频很长;存储这些临时 PNG 文件将占用文件系统上的大量空间,如果文件系统访问这么多文件的速度不够快,则进度会更长。

但它对我有用,我认为分享它可能只是帮助其他有类似问题的人。

答案 2 :(得分:0)

尝试将 format=auto 添加到 -filter_complex 参数的详细信息中。

或者,如果值 auto 不适合您的情况,请尝试另一个 - 它们列在 FFmpeg 文档的 overlay 部分。

请参阅我对问题“如何无损替换一系列帧中的特定区域”的 Skinkie's answer 的评论中的特定示例命令。