ChatGPTでプログラミング(複数の動画ファイルの形式変換)

# はじめに
以前、こんな記事を書きました。

https://qiita.com/skm_bnn/items/b55c2646a7e4f974af63

簡単にまとめると、mp4 形式の動画ファイル ```input_video.mp4``` を gif 形式の動画ファイル ```output_video.gif``` に変換して保存するという内容です。

これは Qiita の記事に動画ファイルを載せるために作成したプログラムなのですが、利用する際に元動画名を ```input_video.mp4``` に変更する必要があります。複数のgif形式を作成する場面では非常に面倒です。

そこで、ChatGPTの力を借りて、複数のmp4形式の動画をgif形式にまとめて変換するプログラムを作成していきたいと思います。

# 要件定義
元のプログラムは[こちら](https://qiita.com/skm_bnn/items/b55c2646a7e4f974af63#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%AE%9F%E8%A3%85)です。これを次の仕様に変更していきます。

- ```input```フォルダ内にあるmp4形式の動画を全てgif形式に変換する
- 変換されたgif形式の動画は```output```フォルダ内に保存する
- 変換されたgif形式のファイル名は元のmp4形式と同様のものにする

# 実装
ChatGPTで次のテキストを入力します。
```
次のプログラムを./inputディレクトリにあるすべてのmp4ファイルをgif形式に変換して、
./outputディレクトリに保存するプログラムに変更せよ。
生成されるgif形式のファイル名は、変換元のmp4ファイルと同じ名称とする。
例えば、./inputディレクトリにある「sample1.mp4」と「sample2.mp4」は、
プログラムが実行されると、それぞれがgif形式に変換されて、
./outputディレクトリに「sample1.gif」と「sample2.gif」として保存される。

from moviepy.editor import VideoFileClip

# 動画をGIFに変換する関数
def convert_video_to_gif(input_file, output_file, fps=10):
    # 動画ファイルの読み込み
    clip = VideoFileClip(input_file)

    # GIFに変換
    clip.write_gif(output_file, fps=fps)

# スクリプトが直接実行された場合の条件分岐
if __name__ == "__main__":
    # 入力動画ファイル名
    input_file = "input.mp4"

    # 出力GIFファイル名
    output_file = "output_video.gif"

    # GIFのフレームレート
    fps = 5

    # convert_video_to_gif 関数を呼び出して、動画を GIF に変換
    convert_video_to_gif(input_file, output_file, fps)
```

これで、次のプログラムが得られました。
```py: ChatGPTの回答
import os
from moviepy.editor import VideoFileClip

# 動画をGIFに変換する関数
def convert_video_to_gif(input_file, output_file, fps=10):
    # 動画ファイルの読み込み
    clip = VideoFileClip(input_file)

    # GIFに変換
    clip.write_gif(output_file, fps=fps)

# スクリプトが直接実行された場合の条件分岐
if __name__ == "__main__":
    # 入力ディレクトリと出力ディレクトリ
    input_directory = "./input"
    output_directory = "./output"

    # GIFのフレームレート
    fps = 5

    # 入力ディレクトリ内のすべてのmp4ファイルを処理
    for filename in os.listdir(input_directory):
        if filename.endswith(".mp4"):
            # 入力ファイルと出力ファイルのパスを構築
            input_file_path = os.path.join(input_directory, filename)
            output_file_path = os.path.join(output_directory, os.path.splitext(filename)[0] + ".gif")

            # convert_video_to_gif 関数を呼び出して、動画を GIF に変換
            convert_video_to_gif(input_file_path, output_file_path, fps)
```

# テスト
ChatGPTで得られたプログラムを```convertAllVideo.py```というファイル名で保存して、端末で実行してみます。なお、次のコマンドは、[この記事](https://qiita.com/skm_bnn/items/b55c2646a7e4f974af63#%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E5%AE%9F%E8%A3%85)での作業を終えているものとします。

```
# 仮想環境をアクティブにする
videoConvert\Scripts\activate

# プログラムの実行
python convertAllVideo.py

# 仮想環境を非アクティブにする
deactivate
```

次に実行した際に出力されるログを示します。```./output\~.gif``` の ```~``` は元のファイル名(mp4形式)に依存します。
```
$ python convertAllVideo.py
MoviePy - Building file ./output\MeshLambertMaterial.gif with imageio.
MoviePy - Building file ./output\MeshPhongMaterial.gif with imageio.
MoviePy - Building file ./output\MeshPhysicalMaterial.gif with imageio.
MoviePy - Building file ./output\MeshStandardMaterial.gif with imageio.
MoviePy - Building file ./output\MeshToonMaterial.gif with imageio.
```

無事に複数のmp4形式のファイルをgif形式のファイルに変換して、```output```フォルダに保存できました。今回はデバッグなしの一発でChatGPTからプログラムを得ることができました。

# おわりに
次にチャットの内容を示します。

https://chat.openai.com/share/4bf262b3-d7f5-4a84-9e0e-f8b0200bdc73