我想编码这个 WEBM 视频:
我注意到 FFmpeg 在质量方面受到了重视。
我正在做 WEBM 到 GIF,如果有帮助的话。几乎所有在线转换器都在底层使用 FFmpeg,导致同样的质量损失。
请注意,FFmpeg 编码的第一帧非常像素化:
这是我一直用于编码的命令。
ffmpeg -i connecting.webm -vf "fps=40,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
即使我将 WEBM 源转换为 MP4 而不是 GIF,质量损失仍然存在。
我必须添加-vf
选项来修复有缺陷的帧速率。有问题的转换如下。
为什么会发生这种情况?
原始 WebM 输入文件具有 alpha(透明度)通道。
可能的解决方案是将半透明视频覆盖在黑色背景上:
ffmpeg -y -c:v libvpx-vp9 -i connecting.webm -vf "[v:0]fps=40[v0];color=black:rate=40[b];[b][v0]scale2ref[b][v0];[b]setsar=1[b];[b][v0]overlay=shortest=1,scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse" -loop 0 output.gif
当忽略 Alpha 时,视频会像素化,因为平滑度是通过对象周围透明度的逐渐变化创建的。
-c:v libvpx-vp9
- 使用libvpx-vp9
解码器。我们需要它是因为默认解码器会忽略 alpha(透明度)通道。color=black:rate=40[b]
- 创建 40 fps 的黑色视频,具有一定的标称分辨率。[b][v0]scale2ref[b][v0]
- 将黑色视频缩放至输入视频的分辨率。[b]setsar=1[b]
- 将黑色视频的宽高比设置为 1:1。[b][v0]overlay=shortest=1
- 将输入视频覆盖在黑色视频上。scale=320:-1:flags=lanczos,split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse"
- 缩放生成调色板并使用它,如问题中所示。输出:
关于输入的 alpha(透明度)通道的备注:
执行时
ffprobe connecting.webm
显示:元
alpha_mode : 1
数据标记存在 alpha(透明度)通道。我认为这是某种“特殊”配置(通常我希望像素格式为 yuva420p 而不是 yuv420p 当有 alpha 通道时)。
有一些关于VP8 编码
alpha_mode : 1
相关的文档。