
この 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 ソースを GIF ではなく MP4 に変換しても、品質の低下はそのまま残ります。
-vf
そして、バグのあるフレーム レートを修正するオプションを追加する必要がありました。バグのある変換は下にあります。
なぜこうなった?
答え1
元の WebM 入力ファイルにはアルファ (透明度) チャネルがあります。
考えられる解決策は、半透明のビデオを黒い背景に重ねることです。
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
アルファを無視すると、オブジェクトの周囲の透明度を徐々に変化させることで滑らかさが生み出されるため、ビデオはピクセル化されます。
-c:v libvpx-vp9
-libvpx-vp9
デコーダーを使用します。デフォルトのデコーダーはアルファ (透明度) チャネルを無視するため、これが必要です。color=black:rate=40[b]
- 40fps で一定の公称解像度の黒いビデオを作成します。[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"
- 質問のように、スケール生成パレットを使用して使用します。
入力のアルファ(透明度)チャンネルに関する注意:
を実行すると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
データは、アルファ (透明度) チャネルが存在することを示します。
これはある種の「特別な」設定だと思います(通常、アルファチャンネルがある場合、ピクセル形式は yuv420p ではなく yuva420p になるはずです)。これに関する
ドキュメントがいくつかあります。alpha_mode : 1
VP8エンコーディング。