unityroom向けのgifアイコン作成  ( Clipchamp + FFmpeg )

# はじめに
こんにちは、unityエンジニアのchappyです。

[unityroom](https://unityroom.com/)でゲームを公開する際、目を引くgifアニメーションのアイコンを設定することができますよね。
私が投稿した[Medal Shooter](https://unityroom.com/games/medalshooter)はAndroid版と同じ静止画アイコンを利用していましたが、gifアイコンに差し替える事でアクセス数を伸ばすことが出来ました。

gifアイコンの作り方は色々ありますが、この記事では[Microsoft Clipchamp](https://www.microsoft.com/ja-jp/microsoft-365/clipchamp)と[FFmpeg](https://www.ffmpeg.org/)を使った作成方法をご紹介します。

>unityroomのアイコン仕様
512KBまで
縦横 512px推奨
 
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/cf9c2e19-8321-42f7-a9f5-a89380794a76.png" width="200">　![icon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/166e0bf1-2c9f-4f25-aaa1-eede07a561dd.gif)
左：初期アイコン　右：差し替えたgifアイコン
圧倒的にgifアイコンの方が目につきやすく、遊んでみたいと思いますよね。

# 事前準備
- [Microsoft Clipchamp](https://www.microsoft.com/ja-jp/microsoft-365/clipchamp)をインストール
    - Windows11なら標準搭載
- [FFmpeg](https://www.ffmpeg.org/)をコマンドラインで実行可能な状態にする
- 作成したゲームのキャプチャ動画を用意
    - 今回はAndroid実機でキャプチャした縦長の動画を利用しました
    - PC上でキャプチャした横長の動画でも大丈夫です

# 作業手順 (ざっくり)
1. Clipchampに動画を読み込むよ
1. 5秒ぐらいのいい感じの区間を探すよ
1. 正方形にして保存するよ
1. FFmpegで容量落としつつgif化するよ

# 作業手順 (しっかり)
### Clipchampで指定区間の動画を正方形で切り抜く
1. Clipchampを起動し、「新しいビデオを作成」を選択
![home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/ac3bb6a5-cba2-40e1-84bf-7758c1760edb.png)
　
1. メディアのインポートからファイルを選択、またはドラッグ&ドロップで動画を読み込む
![import.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/caf6cb36-387e-469f-9f84-5e546310b844.png)
　
1. タイムラインに追加
![addtimeline.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/0ed5f668-af8d-467e-bfe1-03446c714145.png)
　
1. 切り出す区間を探す
動画を再生したり、シークバーを動かしたり、右下の拡大縮小ボタンで細かいフレームをタイムラインに表示させつつ良き区間を探します。
今回はゲームとして訴求したい射撃や、ローグライクのスキル選択が詰まった区間に当たりを付けました。
![seek.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/24498195-b8e1-4b8a-809a-09e524d21b57.png)
　
1. タイムラインの端をドラッグして必要な区間に絞り込む
![trimtime.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/29d5ad27-953a-4e37-962c-36bdeaeed1e2.png)
　
1. 「このギャップを削除」を押して空白の区間を削除
![deletegap.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/ea5b3d06-bcf6-477f-bca9-d8258029581c.png)
　
1. 「サイズ」メニューから「スクエア」を選択
![size.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/7d8627c8-aae1-49e9-857a-769e13e28c7c.png)
　
1. 動画をクリックして出てくるメニューから「クロップ」を選択
![crop.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/5469f14a-e652-4595-a34e-ae9519d27c60.png)
　
1. アイコンにしたい領域を選んで「完了」を押す
※この時点ではピッタリ正方形にする必要はありません
![crop2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/994b4d75-ae21-4bd0-8701-a3305ed0a000.png)
　
1. 「フィットさせる」ボタンを選択
![fit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/1e8b4682-90d4-49a1-9d91-065001d88591.png)
　
1. 再度「クロップ」を行いピッタリ正方形になるよう調整する
今回は少し縦幅が不足したので、上下に少しずつクロップ領域を動かします。
![cropfit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/1d72c684-6068-4bd9-be9b-3508f40e4bd9.png)
　
1. 右上の「エクスポート」から480pで書き出しを行う
FFmpegでフレーム間引きなどをしつつgifに変換するので、ここではmp4で書き出します。
高画質の動画から変換した方が最終的な品質は高いかもしれませんが、時間が掛かるうえに誤差レベルだと思うため、処理が速い480pを選択しています。
![export.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/d5aa81d6-de49-4662-bb2e-83eb6de14b5f.png)

## FFmpegで容量を落としつつgifに変換
### 実行コマンド
```
$ ffmpeg -i icon.mp4 -vf "fps=10,scale=512:-1:flags=lanczos" -loop 0 icon.gif
```
上記のコマンドで画質を指定しつつmp4からgifに変換します。
何も分からんコマンドを実行するのは怖いと思うので一応解説を記載します。
|オプション|意味|備考|
|-|-|-|
|`-i icon.mp4`|入力ファイル名の指定|カレントディレクトリにicon.mp4がある前提だよ|
|`-vf "fps=10,scale=512:-1:flags=lanczos"`|品質の指定|-vfはVideoFilterの略らしいよ|
|`-loop 0`|ループ回数指定 0なら無限||
|`icon.gif`|出力ファイル名||
|`-y`|ファイル上書きの確認無視||

※`-y`が無い場合、コマンド実行時にicon.gifが既に存在していると上書き確認をされます。
万一のファイル破壊を防ぐためにコマンドから外してありますが、実行ごとに上書き確認されて煩わしい人は安全確認のうえ付けて下さい。

### 品質の調整
上記のまま実行した場合、おそらく容量が512kbを超えてしまったかと思います。
unityroomのアイコンサイズ上限である512kbに収めるため、fpsとscaleオプションを調整していきます。

その名の通りですが、fpsでフレームレートを、scaleで画像サイズを指定出来ます。
unityroomで他の作品を参考にしつつ、限界まで削っていきましょう！

**サイズ削減のポイント**
- 動画は5秒ぐらいを目指そう
    - あんまり長くてもunityroomで伝わりづらいよ
    - 長すぎたり容量的に全く無理そうならClipchampに戻って尺を削減
- scaleを落とすと容量を削りやすいよ
    - (圧縮があるので違うけど)scaleを1/2にしたら画像サイズは1/4
- fpsを下げるとカクつくけど、gifだしまあそんなもんだよ


自分は以下の調整を行い、490kbまで削る事が出来ました。
- 尺6秒
- scale=200
- fps=9
![icon.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/687803/166e0bf1-2c9f-4f25-aaa1-eede07a561dd.gif)

## おわりに
unityroomにはたくさんのゲームがあるので、自分の作品を手にとって貰うためにアイコンのgifアニメーション化はとても重要だと思います。
ぜひ皆さんもgifアニメを作成して訴求力を向上させましょう！