82889


## 質問

`FFmpeg`を使ってキャプチャしたパソコンの動画からGIFを作っているのですが、`paletteuse`を使って綺麗なGIFを作ると、GIFの中でマウスカーソルが透明な❑として表示されてしまいます。その理由と修正方法を知りたいです。

## 手順

① 「palette.png」を作成する

[code]

    ffmpeg -i input.avi -vf palettegen palette.png
    
[/code]

② 「palette.png」を動画に適用して、  
GIFを生成する

[code]

    ffmpeg -an -i input.avi -i palette.png -filter_complex "paletteuse" output.gif
    
[/code]


CC BY-SA 4.0
2021-10-04T19:51:53.433
82874
2021-10-05T11:30:41.043
question
ffmpeg
FFmpegのpaletteuseを使いGiFを生成すると、マウスカーソルが透明になってしまう


GIFおよびGIFアニメーションというファイル形式の特性を理解してオプションを指定する必要があります。  
GIFは次のような特徴があります。

  * パレット形式で、１枚の画像に最大で256色しか利用できない。
  * １ファイル内で複数の画像を保持できる。 
    * GIFアニメーションは画像間の表示タイミングを指定することで動画のような表示を実現している。
  * グローバルパレットとローカルパレットが存在する。 
    * グローバルパレットは全ての画像に適用される。そのため、全ての画像で256色を分け合うことになる。
    * ローカルパレットは１枚１枚の画像を256色で表現する。しかし、１枚ごとにパレットが付属するためファイルサイズが膨大になる。
  * 透過機能がある。 
    * GIFアニメーションの場合、前フレームと同じ内容の場合、透過させることで色数を節約すると共にファイルサイズも削減できる。

その上で、これらを制御するffmpegのオプションも理解する必要があります。

  * [16.2 GIF](https://ffmpeg.org/ffmpeg-all.html#GIF)
  * [39.169 palettegen](https://ffmpeg.org/ffmpeg-all.html#palettegen-1)
  * [39.170 paletteuse](https://ffmpeg.org/ffmpeg-all.html#paletteuse)

* * *

「キャプチャしたパソコンの動画」をエンコードする前提で、グローバルパレットを使うかローカルパレットを使うかで大きく方針が異なります。

## 共通する内容

通常の動画と異なり、１フレーム１画像で保持しているため、フレームレートに比例してファイルサイズが肥大化します。必要なければ事前にフレームレートを下げることをお勧めします。  
画面サイズの縮小も一部有効ですが、縮小の際にディザリングが行われると、ディザリングされた中間色を表現しようと色数が奪われ、結果的に画質が劣化することがあります。

## グローバルパレットを使う

GIFエンコーダーの`transdiff`は既定で有効で、動画で前フレームから変化がない部分は透過させることになります。パレット生成の際はその前提でpalettegenを使用する必要があります。その意味で`stats_mode`は既定値`full`ではなく`diff`を指定した方がよいでしょう。

## ローカルパレットを使う

palettegenは動画全体に対して１枚のパレットを生成するため、ローカルパレットでは役に立ちません。GIFエンコーダーの`global_palette=0`で生成しましょう。


CC BY-SA 4.0
2021-10-05T11:30:41.043
82889
2021-10-05T11:30:41.043
4236
82874
answer