这是一个简单的请求,它有一个输入,输出和两个水印。根据我收集的内容,我无法应用-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
就水印而言,这就是诀窍,但输出被压缩到原始文件大小的一半。
是否可以在不损失视频质量的情况下进行水印?
答案 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
过滤器。我没有很好的解决方案,但这是我的解决方法。
mkdir frames
ffmpeg -i input.mp4 frames/%d.png
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 的评论中的特定示例命令。