为什么我使用带有videotoolbox的ffmpeg编码HEVC alpha视频的质量不好?

3
我正在将带有 alpha 通道的 ProRes 4444 视频编码为透明视频,以便在网络上使用 VP9(webm)和 HEVC(mp4)两种格式。我正在使用一个 Rotato 免费工具同时对两种格式进行编码。
然而,由于我希望能够更好地控制视频的尺寸和比特率等参数,因此我正在研究 ffmpeg。我可以使用以下参数编码两种格式。
# vp9
ffmpeg -i in.mov -vf scale=-1:720 -c:v libvpx-vp9 -auto-alt-ref 0 -pix_fmt yuva420p -acodec libvorbis -cpu-used 3 -deadline good -crf 40 out.webm 

# hevc
ffmpeg -i in.mov -vf scale=-1:720 -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.9 -tag:v hvc1 -q:v 65 out.mp4

问题:videotoolbox编码器在黑色铅笔动画周围生成奇怪的白色垃圾,并且从透明到黑色铅笔的渐入效果变成了从白色铅笔到黑色铅笔的渐入效果!?
以下是两者比较的截图(顶部是我的ffmpeg输出):

hevc

rotato

有人有好的FFmpeg设置吗?可以用来编码带透明度的高质量HEVC吗? 硬件:MacBook Air M1和Win11 + GTX 1060(我应该能够使用NVEnc,但不知道如何使用)。

你尝试使用x265进行编码了吗?我想知道你是否在硬件编码器中看到了伪影。 - kesh
是的,但是 x265 没有编码 alpha 的选项,所以那不是一个选择。 - Jos
你能提供你的输入文件吗? - Markus Schumann
除了文件大小为8GB之外,我可能不会发布该文件,因为它是我的客户的财产。 - Jos
这是一个免费的在线示例视频,可以用来测试:https://www.vecteezy.com/video/20153377-hand-draw-symbol-icon-2d-animation-alpha-channel。请参考下面@Kajuna的回答。 - Jos
2个回答

5
对我来说,解决方案是使用预乘滤镜。
-vf premultiply=inplace=1

那完全解决了白色伪像 @Kajuna!非常感谢! - Jos
1
除此之外,我降低了质量以弥补使用预乘时的更大文件大小。我的新完整命令现在是 ffmpeg -i in.mov -vf scale=-1:720 -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.9 -tag:v hvc1 -q:v 35 -vf premultiply=inplace=1 out.mp4 - Jos
太棒了!@Jos,你能接受这个答案吗? - Kajuna
1
当然,我本应早就这样做了。很抱歉让你提醒;-) - Jos
1
我现在明白了,我有两个滤镜选项,你应该将它们指定为一个选项,就像这样:ffmpeg -i in.mov -vf "scale=-1:720, premultiply=inplace=1" -c:v hevc_videotoolbox -allow_sw 1 -alpha_quality 0.9 -tag:v hvc1 -q:v 35 out.mp4。视频选项中逗号后面的空格确实很重要 :-/ - undefined

0

在选择选项之前,我会检查系统偏好设置以保留Alpha通道透明度,更多信息请参见Larry,因为它们是本地构建的-请查看Larry网站上的两个选项。

确认在“系统偏好设置”>“键盘”中, 左侧的“服务”类别, 然后在右侧选择启用“对所选视频文件进行编码”。 从任何视频应用程序中,使用ProRes 4444编解码器直接导出包含透明度的项目。 然后,在Finder中右键单击结果.mov文件,并选择“服务”->“对所选视频文件进行编码”。 等待几秒钟,直到出现下一个菜单。

enter image description here


看起来你正在寻找编码器和比特率选项,你可以完整列出它们如下:

选项1: H.264编码器

// Help you understand the ***H.264 encoder's options.
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip

[![enter image description here][1]][1]

选项1:HEVC/H.265编码器
// Help you understand the **H.265 encoder's options.
ffmpeg -hide_banner -h encoder=h264_nvenc | xclip -sel clip

现在针对比特率,使用-b:v-maxrate:v-bufsize:v选项设置值。

另外,由于您拥有Mac硬件 - 如果您键入此命令,它将告诉您的配置信息。

 ~ ffmpeg -h encoder=hevc_videotoolbox

一旦您拥有它,您可以选择在配置中进行微调,并重新构建自己...使用不同的选项。请查看VM + Apple M1的构建,以及针对Apple Silicon M1编码器的编码支持


1
我感到困惑。我不确定为什么我应该使用服务中的“编码视频”。我已经尝试过,但我无法控制比特率,所以视频文件大小非常大。更重要的是,我不能自动化它。我也不确定如何处理/期望上述FFmpeg命令。前两个命令无效(命令xclip未找到),第三个命令显示了我已经在使用的选项。问题在于动画中的黑色线条周围有白色垃圾,而这种情况在任何比特率/质量下都存在。 - Jos
1
嘿,Jos,你找到解决方案或在这方面取得任何进展了吗?谢谢! - Mike
Jos或@Mike,你们解决这个问题了吗? - Kajuna
1
是的,终于我可以使用ffmpeg进行编码了,感谢@Kajuna在这里的回答:https://dev59.com/03EOtIcB2Jgan1znCeuo#76569133 - Jos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接