動画保存後にメタデータを追加する方法

概要

動画にメタデータを追加することは、ビデオコンテンツの管理や分類、検索性の向上に役立ちます。例えば、ビデオに関連する情報(タイトル、制作会社、制作日、ジャンルなど)をメタデータとして追加することで、後からこのビデオを検索したり、他のビデオと一緒に分類したりするのが容易になります。

出力結果

OpenCVで動画保存時にメタデータを追加

プログラム全体

#解説1 import cv2 from moviepy.editor import VideoFileClip #解説2 # UVCカメラを開始 cap = cv2.VideoCapture(0) #解説3 # フレームレートを取得 fps = 30 # ビデオライターを作成 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output_no_metadata.mp4', fourcc, fps, (640, 480)) #解説4 while(cap.isOpened()): ret, frame = cap.read() if ret==True: out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break #解説5 # カメラとビデオライターを解放 cap.release() out.release() cv2.destroyAllWindows() #解説7 # moviepyを使用してメタデータを追加 clip = VideoFileClip('output_no_metadata.mp4') clip = clip.set_duration(clip.duration) # 必要に応じて他のメタデータもここで設定できます clip.write_videofile('output_with_metadata.mp4', codec='libx264', audio_codec='aac', ffmpeg_params=["-metadata", "title=ビデオタイトル" , "-metadata", "artist=会社名", "-metadata", "album=アルバム名", "-metadata", "genre=ジャンル", "-metadata", "date=2023-07-18", "-metadata", "track=1"])

解説

解説1: モジュールのインポート

import cv2 from moviepy.editor import VideoFileClip

この部分では、プログラムで使用するライブラリをインポートしています。cv2はOpenCVのPythonライブラリで、画像処理や動画処理を行うための機能が提供されています。VideoFileClipAudioFileClipは、moviepy.editorライブラリからインポートされており、それぞれ動画ファイルと音声ファイルを扱うためのクラスです。

Pythonのmoviepy.editorモジュールをインストールするには、Pythonのパッケージ管理ツールであるpipを使用します。以下のコマンドをターミナル(Windowsの場合はコマンドプロンプトまたはPowerShell)に入力して実行します。

pip install moviepy

このコマンドはmoviepyパッケージ全体をインストールします。moviepy.editorはその中の一部です。

なお、Pythonの環境によっては、pipではなくpip3を使用する必要があるかもしれません。また、パーミッションの問題が発生する場合は、コマンドの先頭にsudoを追加する(LinuxやmacOSの場合)か、コマンドプロンプトを管理者として実行する(Windowsの場合)必要があります。

解説2: UVCカメラの起動

cap = cv2.VideoCapture(0)

ここでは、UVCカメラを開いて、その映像を取得するためのオブジェクトを作成しています。cv2.VideoCapture(0)という関数は、引数にUVCカメラのIDを取り、そのカメラにアクセスするためのVideoCaptureオブジェクトを返しています。ここでの0は、通常はシステムに接続されているデフォルトのカメラ(通常は内蔵カメラ)を指しますが、使用しているカメラによって割り振られる番号が異なりますのでご注意ください。

解説3: ビデオライターの作成

fps = 30 fourcc = cv2.VideoWriter_fourcc(*'mp4v') out = cv2.VideoWriter('output_no_metadata.mp4', fourcc, fps, (640, 480))

この部分では、動画ファイルを作成するためのビデオライターを設定しています。fpsはフレームレートを、fourccは動画ファイルのコーデックを指定しています。cv2.VideoWriter`はビデオライターのインスタンスを作成します。引数には出力ファイル名、コーデック、フレームレート、フレームサイズを指定します。

fps = 30 fpsでは1秒あたり30フレームの動画を作成することを意味しています。
fourcc = cv2.VideoWriter_fourcc(*'mp4v') fourccはビデオコーデックを指定するためのものです。ここでは'mp4v'を指定しています。'mp4v'はMPEG-4ビデオコーデックを表します。fourccは、ビデオデータの圧縮形式を指定するために使用されます。
out = cv2.VideoWriter('output_no_sound.mp4', fourcc, fps, (640, 480)) VideoWriterオブジェクトを作成します。第一引数には出力ファイル名(ここでは'output_no_sound.mp4')、第二引数にはfourcc(ビデオコーデック)、第三引数にはfps(フレームレート)、第四引数にはフレームのサイズ(ここでは幅640ピクセル、高さ480ピクセル)を指定します。この例では、'output_no_sound.mp4'という名前のMPEG-4ビデオファイルを作成し、そのフレームレートを30fps、フレームのサイズを640x480に設定しています。このように、VideoWriterを使用することで、カメラから取得した映像を指定したビデオコーデックとフレームレートで動画ファイルとして保存することができます。

解説4: フレームの読み込みと保存

while(cap.isOpened()): ret, frame = cap.read() if ret==True: out.write(frame) cv2.imshow('frame',frame) if cv2.waitKey(1) & 0xFF == ord('q'): break else: break

カメラが正常に開いている間に、while文のループ処理をしています。ループ処理の中で、cap.read()を使ってカメラからフレームを取得します。その際に正常に画像を取得できていれば、out.write(frame)を使ってcv2.VideoWriterオブジェクトを使って、output_no_sound.mp4のビデオファイルに書き込む処理を行っています。また、cv2.imshow('frame',frame)は取得したフレームを画面に表示します。 cv2.waitKey(1) & 0xFF == ord('q')は、'q'キーが押されたらループ処理から抜け出します。

解説5: リソースの解放

cap.release() out.release() cv2.destroyAllWindows()

ここでは、使用したリソースを解放しています。cap.release()でカメラを解放し、out.release()でビデオライターを解放します。cv2.destroyAllWindows()で開いたウィンドウを全て閉じます。

解説6: メタデータの追加

clip = VideoFileClip('output_no_metadata.mp4') clip = clip.set_duration(clip.duration) clip.write_videofile('output_with_metadata.mp4', codec='libx264', audio_codec='aac', ffmpeg_params=["-metadata", "title=ビデオタイトル" , "-metadata", "artist=会社名", "-metadata", "album=アルバム名", "-metadata", "genre=ジャンル", "-metadata", "date=2023-07-18", "-metadata", "track=1"])

ここでは、moviepyを使用してビデオファイルにメタデータを追加しています。まず、VideoFileClipでビデオファイルを読み込みます。次に、set_durationでビデオの長さ(duration)を設定します。最後に、write_videofileでビデオファイルを書き出します。この際、ffmpeg_paramsを使用して、メタデータを追加しています。

ここでは、解説4で作成した動画ファイル('output_no_metadata.mp4')にメタデータを追加し、新しい動画ファイル('output_with_metadata.mp4')として保存しています。 VideoFileClip('output_no_metadata.mp4')で既存の動画ファイルを読み込み、VideoFileClipオブジェクトを作成します。 次に、clip.set_duration(clip.duration)で動画の長さ(duration)を設定します。ここでは元の動画の長さをそのまま設定していますが、このメソッドを使えば動画の長さを任意の値に変更することも可能です。 最後に、clip.write_videofile()メソッドを使って新しい動画ファイルを書き出します。このメソッドの引数には、出力するファイル名、ビデオとオーディオのコーデック、そしてffmpegのパラメータを指定します。

補足:

上記のサンプルコードで指定しているffmpegのパラメータ["-metadata", "title=ビデオタイトル", "-metadata", "artist=会社名", "-metadata", "album=アルバム名", "-metadata", "genre=ジャンル", "-metadata", "date=2023-07-18", "-metadata", "track=1"]は、動画ファイルに追加するメタデータを指定しています。これにより、動画のタイトル、制作会社、アルバム名、ジャンル、制作日、トラック番号などの情報が動画ファイルに埋め込まれます。

ffmpegを使ってmp3やmp4等のメタデータ(タグ情報)を編集する場合、ffmpegで設定できるメタデータはとても数が多いのでその他のメタデータは下記を参照してください。
https://www.ffmpeg.org/doxygen/4.1/group__metadata__api.html#details