ChatGPTでFFmpegのコマンドを教えてもらう

## はじめに
この投稿は、私が所属するKDDIテクノロジーで行っているアドベントカレンダーの19日目の記事となります。
会社では映像配信やXRサービスの開発・支援を行っています。

さて、去年もアドベントカレンダーで[FFmpegでiOSのスライドショーっぽく編集する](https://qiita.com/AKN619/items/224ca279f8d9f7d954f6)っていうのをやったんですが、今年はChatGPTにFFmpegのコマンドを教えてもらいます。
今までコマンドをいちいち調べていたのですが、ChatGPTはFFmpegのコマンドも書けるようなので代わりに書いてもらって確認していきましょう。

## 環境情報
Windows 11
FFmpeg 4.3（去年と変わってないな）
ChatGPT 3.5（お金払ってないな）

## まずは出来るか聞いてみる
さて、ChatGPT君や。君はFFmpegのコマンドを生成できるのかね？
![chatgpt1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66708/b482df42-4a51-3644-a9f6-c773d6ad4aaa.png)
![chatgpt2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66708/5f4665fa-34dc-a14e-08f9-685dc9d889ac.png)
無茶苦茶やる気やん！これは期待できますね。

## 昨年やった奴をChatGPTに書いてもらう
ではまずフェードアウトを試してみますか。前回やった作例はこんな感じ
```text:フェードアウト
ffmpeg -loop 1 -i test1.jpg -vf "fade=t=out:st=4.5:d=0.5" -c:v libx264 -t 5 -s "1440x1920" fadeout.mp4
```
静止画test1.jpgをループ再生して、4.5秒の位置から0.5秒かけてフェードアウトしていく感じで動画にするというコマンドになっていますね。早速ChatGPT君に聞いてみましょう。

![chatgpt3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66708/20c01eac-e1d7-4078-41de-430d79133478.png)
```text:bash
ffmpeg -loop 1 -t 5 -framerate 30 -i test1.jpg -vf "fade=out:st=4.5:d=0.5" -c:v libx264 -pix_fmt yuv420p -an -r 30 fadeout.mp4
```
細かな指定は違うものの、ほぼ思い通りのコマンドが出来ました。実際にFFmpegで試してみてもちゃんと出来ています。

## 条件が複雑になると…
ここまでは良かったんですが、xfade等の面倒なフィルタを使うと途端にエラーが出るようなコマンドを出してくるようになります。

試したのは昨年もやったクロスフェードをさせるというもの。
```text:スワイプライト
ffmpeg -loop 1 -t 5 -i test1.jpg -loop 1 -t 5 -i test2.jpg -filter_complex "[0][1]xfade=transition=wiperight:duration=1:offset=4,format=yuv420p" wiperight.mp4
```
以下をChatGPT君に条件指定して出して来た答えが以下
>ffmpegで以下の条件のコマンドを生成してください
・test1.jpgとtest2.jpgの2枚の画像を使います
・test1.jpgを5秒ループ再生し、右から左にスライドさせて0.5秒かけてtest2.jpgに変えます
・wiperight.mp4として動画出力してください

出てきた失敗例
```text:bash
ffmpeg -loop 1 -t 5 -framerate 30 -i test1.jpg -loop 1 -t 0.5 -framerate 30 -i test2.jpg -filter_complex "[0:v]xfade=transition=slide:duration=0.5:offset=4.5[sld];[sld]loop=loop=-1:size=1500:start=0[bg]" -map "[bg]" -c:v libx264 -pix_fmt yuv420p -an -r 30 wiperight.mp4
```
xfadeのトランジションに[slideは無い](https://trac.ffmpeg.org/wiki/Xfade)のよ。(slideleft/sliderightもしくはwipeleft/wiperightならある。)
しかも後半部に時間指定がないことにより、xfadeのオプション指定が合っていても無限エンコードが続く書き方。これはマズい。

そこで追加で条件指定
>・transitionにslideという命令は無いのでwiperightに変えて下さい
>・後半部に時間指定が無いので、エンコードが無限に続きます。動画を10秒で切るようなコマンドに変更できますか？

返ってきた答え
```text:bash
ffmpeg -loop 1 -t 5 -framerate 30 -i test1.jpg -loop 1 -t 0.5 -framerate 30 -i test2.jpg -filter_complex "[0:v]xfade=transition=wiperight:duration=0.5:offset=4.5,scale=1440x1920,trim=duration=10[bg]" -map "[bg]" -c:v libx264 -pix_fmt yuv420p -an -r 30 wiperight.mp4
```
むーん、エラーは出なくなりエンコードも止まるようになったが、wiperightの指定が5秒で止まるのでスワイプした瞬間に動画が止まる。
一撃で欲しいコマンドにたどり着くことは難しいけど、そんなオプションねーよ！とかの突っ込みでもちゃんとしたコマンドに変化したりすること、判断するのに必要な情報量は出てくるので最初っからコマンド調べまくるよりは幾分か楽になる気がする。慣れてきたら。

## 終わりに
FFmpegのコマンドをChatGPTに作ってもらうのは十分に試す価値があると思いました。
結局検証が必要にはなりますが、それはCopilotでコードを書くのと変わらないでしょう。

後から探したら同じようなことを実施されている先駆者がいたので敬意を表してリンクを貼っておきます。
[ChatGPTにffmpegコマンドを作らせてみた
](https://qiita.com/ktsuchi/items/523181bc1526d6a3a22d)（@ktsuchi氏）

最後にChatGPT君もありがとう！
![chatgpt4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66708/54bbd943-825c-e516-54c0-f19d73a3d873.png)

知らんのかい！（ChatGPTの回答が100％で無いことの戒めとして語尾に「知らんけど。」を付けさせている民）