FFmpeg で GIF に変換すると、ビデオがピクセル化されるのはなぜですか?

FFmpeg で GIF に変換すると、ビデオがピクセル化されるのはなぜですか?

この 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 : 1VP8エンコーディング

関連情報