
我想編碼這個 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
選項來修復有缺陷的幀速率。有問題的轉換如下。
為什麼會發生這種情況?
答案1
原始 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
顯示:
Stream #0:0: Video: vp9 (Profile 0), yuv420p(tv, progressive), 400x400, SAR 1:1 DAR 1:1, 60 fps, 60 tbr, 1k tbn (default)
Metadata:
alpha_mode : 1
ENCODER : Lavc58.134.100 libvpx-vp9
DURATION : 00:00:01.067000000
元alpha_mode : 1
資料標記存在 alpha(透明度)通道。
我認為這是某種“特殊”配置(通常我希望像素格式為 yuva420p 而不是 yuv420p 當有 alpha 通道時)。
有一些有關相關的alpha_mode : 1
文檔VP8編碼。