2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2023-12-18

はじめに

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

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

環境情報

Windows 11
FFmpeg 4.3(去年と変わってないな)
ChatGPT 3.5(お金払ってないな)

まずは出来るか聞いてみる

さて、ChatGPT君や。君はFFmpegのコマンドを生成できるのかね?
chatgpt1.png
chatgpt2.png
無茶苦茶やる気やん!これは期待できますね。

昨年やった奴をChatGPTに書いてもらう

ではまずフェードアウトを試してみますか。前回やった作例はこんな感じ

フェードアウト
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

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等の面倒なフィルタを使うと途端にエラーが出るようなコマンドを出してくるようになります。

試したのは昨年もやったクロスフェードをさせるというもの。

スワイプライト
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として動画出力してください

出てきた失敗例

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は無いのよ。(slideleft/sliderightもしくはwipeleft/wiperightならある。)
しかも後半部に時間指定がないことにより、xfadeのオプション指定が合っていても無限エンコードが続く書き方。これはマズい。

そこで追加で条件指定

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

返ってきた答え

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コマンドを作らせてみた
@ktsuchi氏)

最後にChatGPT君もありがとう!
chatgpt4.png

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

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?