ffmpeg-pythonで動画にメタデータを追加する


pythonでffmpegを操作したい場合、ffmpeg-pythonを使うと思います。

ffmpeg.output()にはffmpegのオプションを渡すことができます。そこで、ffmpeg-pythonで動画にメタデータを追加するには、ffmpeg.output()に引数名metadata"key=value"の文字列の形式でメタデータを渡します。

ffmpeg
    .input(input_video_path)
    .output(output_video_path, metadata="title=New Title")
    .run()

ffmpeg.output()は可変長引数を取るので、複数のメタデータを設定したい場合はその分だけ引数を設定します。

ffmpeg
    .input(input_video_path)
    .output(output_video_path, metadata="title=New Title", metadata="title=New Artist", metadata="album=New Album")
    .run()

辞書型の引数を展開することもできます。

ffmpeg
    .input(input_video_path)
    .output(output_video_path, **{"metadata": "title=New Title", "metadata": "artist=New Artist", "metadata": "album=New Album"})
    .run()

辞書型の引数を変数で保持しておきたい場合は少し工夫が必要です。キーをそのままmetadataにすると、キーが重複して上書きされてしまうためです。

キーをユニークにするためには、metadata:g:0のようにグローバルオプションgを付けて、更にその後にユニークなインデックスを振るようにします。グローバルオプションgを付けるとメタデータがファイル全体に適用されますが、メタデータはデフォルトでグローバルになっており、グローバルオプションを明示的に付けても省略した場合と同じ動作になるため、このようにしても無害です。また、グローバルオプションの後のインデックスは無視されます。
なお、グローバルオプションを付けずにインデックスだけを振ってmetadata:0とするとエラーになります。

metadata_dict = {"metadata:g:0": "title=New Title", "metadata:g:1": "artist=New Artist", "metadata:g:2": "album=New Album"}

ffmpeg
    .input(input_video_path)
    .output(output_video_path, **metadata_dict)
    .run()

このハックを使うと、次のように別のファイルからメタデータをコピーすることもできます。

tags = ffmpeg.probe(input_video_path)["format"]["tags"]

metadata_dict = {}
for i, key in enumerate(tags):
    metadata_dict[f"metadata:g:{i}"] = f"{key}={tags[key]}"

ffmpeg
    .input(input_video_path)
    .output(output_video_path, **metadata_dict)
    .run()

参考