はじめに:散らばった動画ファイルを一瞬で整理!

この記事は、デジタルカメラやスマートフォンでたくさんの動画を撮影するものの、ファイル名が「IMG_XXXX.MP4」や「VID_YYYY.MP4」のままで、後からいつ撮影したものか分からなくなり、動画整理に頭を抱えている方、Pythonでファイル整理を自動化してみたい方を対象としています。

この記事を読むことで、MP4動画ファイルに含まれる「撮影日時」のメタデータを取得し、その情報をもとにファイル名を自動的に「YYYYMMDD_HHMMSS.mp4」のような形式に変更するPythonスクリプトの作成方法と実行方法がわかります。これにより、手作業では手間がかかる大量の動画ファイルの整理が劇的に効率化され、思い出の動画を時系列で簡単に管理できるようになります。手動でのファイル名変更に時間を費やす日々とはもうお別れしましょう!

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。

  • Pythonの基本的な文法: 変数、リスト、ループ(for文)、関数の定義など。
  • コマンドライン操作の基礎: ターミナルやコマンドプロンプトでの基本的なコマンド実行。
  • ファイルのパス: 絶対パスと相対パスの概念。

なぜファイル名を撮影日時にしたいのか?動画整理の課題とメリット

スマートフォンやデジタルカメラで動画を撮影すると、ほとんどの場合、デフォルトのファイル名(例: IMG_20240728_103000.mp4のように日時が含まれる場合もありますが、多くは連番形式)で保存されます。しかし、異なるデバイスで撮影したり、一度PCに取り込んだ後にバックアップを繰り返したりすると、ファイル名から撮影日時が判別できなくなりがちです。

このような状況では、以下のような課題が発生します。

  • 時系列での整理が困難: どの動画がいつ撮影されたものか一目で判断できず、古い動画を探すのに時間がかかります。
  • バックアップ時の管理が煩雑: 複数のフォルダに同じようなファイル名が散らばり、最新の動画がどれか混乱することがあります。
  • 動画の検索性低下: 特定のイベントや時期の動画を見たいときに、ファイル名だけでは検索しづらいです。

そこで、ファイル名を撮影日時に変更することで、これらの課題を解決し、以下のような大きなメリットが得られます。

  • 一目瞭然の時系列管理: ファイル名を見れば、いつ撮影された動画かすぐに分かります。
  • 整理の効率化: フォルダ分けやバックアップが容易になり、整理にかかる手間が大幅に削減されます。
  • 検索性の向上: 特定の期間の動画をファイル名で絞り込むなど、目的の動画を見つけやすくなります。
  • 永続的な情報の保持: ファイルシステム上の作成日や更新日はコピーや移動で変わる可能性がありますが、ファイル名に日時を含めることで、その情報を永続的に保持できます。

本記事では、この撮影日時情報を動画ファイルから正確に抽出し、ファイル名に反映させるための強力なツール「exiftool」とPythonを組み合わせた自動化スクリプトを作成します。

Pythonとexiftoolを活用!MP4動画ファイル名変更スクリプトの作成

ここからは、実際にPythonスクリプトを作成し、MP4動画のファイル名を撮影日時に基づいて変更する具体的な手順を解説します。

ステップ1:必要なツールの準備とPython環境のセットアップ

まずは、スクリプトを実行するために必要なツールを準備しましょう。

1. Pythonのインストール

Pythonがインストールされていない場合は、以下の公式サイトからダウンロードしてインストールしてください。

インストール時に「Add Python to PATH」にチェックを入れることをお忘れなく。

2. exiftoolのインストール

exiftoolは、画像、動画、音声ファイルなど、様々なファイルのメタデータを読み書きできる強力なコマンドラインツールです。MP4動画の撮影日時情報を取得するために使用します。

  • Windowsの場合: ExifToolの公式サイト から「Windows Executable」をダウンロードします。ダウンロードしたexiftool(-k).exeファイルをexiftool.exeにリネームし、システムのPATHが通っているディレクトリ(例: C:\Windowsや別途作成したツール用ディレクトリ)に配置します。

  • macOSの場合: Homebrewを使っている場合、ターミナルで以下のコマンドを実行します。 bash brew install exiftool Homebrewを使っていない場合は、公式サイトからPerl版をダウンロードし、PATHを設定してください。

  • Linuxの場合: Debian/Ubuntuベースのシステムでは、以下のコマンドでインストールできます。 bash sudo apt update sudo apt install libimage-exiftool-perl その他のディストリビューションでも、パッケージマネージャーを使ってインストール可能です。

3. 必要なPythonライブラリのインストール(任意)

今回のスクリプトでは、ファイルの処理状況を表示するためのtqdmライブラリを使用すると便利です。必須ではありませんが、インストールすることをおすすめします。

Bash
pip install tqdm

ステップ2:ファイル名変更スクリプトの作成

以下のPythonスクリプトを、任意のテキストエディタでrename_videos.pyという名前で保存してください。

Python
import os import subprocess import re from datetime import datetime from tqdm import tqdm # 進捗バー表示用、任意 def get_creation_date(filepath): """ exiftoolを使用して動画ファイルの撮影日時(CreateDate)を取得する。 複数の日付タグを試行し、最初に見つかったものを返す。 """ date_tags = [ '-CreateDate', # 一般的な作成日時 '-TrackCreateDate', # 動画トラックの作成日時 '-MediaCreateDate', # メディアの作成日時 '-QuickTime:CreateDate' # QuickTime/MP4固有の作成日時 ] # exiftoolコマンドを生成 # -d "%Y%m%d_%H%M%S" で日付フォーマットを指定 # -s でタグ名のみ表示 # -coordw でタグ名も出力 command_base = ['exiftool', '-s', '-coordw'] for tag in date_tags: try: # 各タグに対してexiftoolを実行 command = command_base + [tag, filepath] result = subprocess.run(command, capture_output=True, text=True, check=True) if result.stdout: # 出力例: CreateDate : 2023:01:15 14:30:05+09:00 # ここから日付部分を抽出 match = re.search(r'\d{4}:\d{2}:\d{2} \d{2}:\d{2}:\d{2}', result.stdout) if match: date_str = match.group(0) # フォーマットを 'YYYY:MM:DD HH:MM:SS' から 'YYYYMMDD_HHMMSS' に変換 dt_obj = datetime.strptime(date_str, '%Y:%m:%d %H:%M:%S') return dt_obj.strftime('%Y%m%d_%H%M%S') except subprocess.CalledProcessError as e: # exiftoolがエラーを返した場合(例: タグが存在しない) pass except Exception as e: print(f"[{filepath}] 日時取得中に予期せぬエラーが発生しました: {e}") pass return None # 適切な日付情報が見つからなかった場合 def rename_video_files(directory): """ 指定されたディレクトリ内のMP4ファイルのファイル名を撮影日時に基づいて変更する。 """ if not os.path.isdir(directory): print(f"エラー: 指定されたディレクトリ '{directory}' は存在しません。") return print(f"'{directory}' 内のMP4動画ファイルを処理します...") video_files = [f for f in os.listdir(directory) if f.lower().endswith('.mp4') and os.path.isfile(os.path.join(directory, f))] if not video_files: print("処理対象のMP4ファイルが見つかりませんでした。") return for filename in tqdm(video_files, desc="処理中", unit="ファイル"): old_filepath = os.path.join(directory, filename) # 新しいファイル名候補を取得 new_name_base = get_creation_date(old_filepath) if new_name_base: # 拡張子を取得 _, ext = os.path.splitext(filename) # 新しいファイル名 (重複回避処理を含む) new_filename = f"{new_name_base}{ext.lower()}" counter = 1 while os.path.exists(os.path.join(directory, new_filename)): new_filename = f"{new_name_base}({counter}){ext.lower()}" counter += 1 new_filepath = os.path.join(directory, new_filename) try: os.rename(old_filepath, new_filepath) # tqdmは標準出力と干渉するので、printは控えめに # print(f" リネーム: '{filename}' -> '{new_filename}'") except OSError as e: print(f"エラー: '{filename}' のリネームに失敗しました: {e}") else: print(f"警告: '{filename}' の撮影日時情報を取得できませんでした。スキップします。") print("\nすべてのMP4動画ファイルの処理が完了しました。") if __name__ == "__main__": # スクリプトを実行するディレクトリを指定 # 例: current_directory = os.getcwd() # スクリプト実行場所 # 例: target_directory = "C:\\Users\\YourUser\\Videos\\CameraRoll" # Windowsの絶対パス # 例: target_directory = "/Users/YourUser/Movies/CameraRoll" # macOS/Linuxの絶対パス # ここに処理したい動画ファイルが入っているディレクトリのパスを設定してください target_directory = input("処理したいMP4動画ファイルが入っているディレクトリのパスを入力してください: ") rename_video_files(target_directory)

スクリプトの解説

  • get_creation_date(filepath)関数:
    • exiftoolコマンドをsubprocess.run()で実行し、動画ファイルから撮影日時情報を抽出します。
    • CreateDateTrackCreateDateMediaCreateDateQuickTime:CreateDateなど、複数の日時タグを順番に試行し、最初に見つかった有効な日付を返します。これはMP4ファイルのメタデータの構造が多様であるためです。
    • 取得した日付文字列をYYYYMMDD_HHMMSS形式に整形します。
    • exiftoolが見つからない場合や、日時情報が取得できない場合はNoneを返します。
  • rename_video_files(directory)関数:
    • 指定されたディレクトリ内の.mp4(大文字小文字問わず)ファイルをリストアップします。
    • tqdmを使って、処理の進捗をプログレスバーで表示します。(任意の部分)
    • 各ファイルに対してget_creation_dateを呼び出し、新しいファイル名を決定します。
    • ファイル名重複回避: もし同じ名前のファイルが既に存在する場合、(1)(2)といった連番を新しいファイル名に追加し、重複を避けます。
    • os.rename()を使って、実際のファイル名を変更します。
    • エラーが発生した場合は、その内容を表示して処理を続行します。
  • if __name__ == "__main__":ブロック:
    • スクリプトが直接実行された際に呼び出されます。
    • input()関数を使って、ユーザーに処理対象ディレクトリのパスを入力させます。

ステップ3:スクリプトの実行

  1. 上記で保存したrename_videos.pyファイルと同じディレクトリに、ターミナルまたはコマンドプロンプトで移動します。
  2. 以下のコマンドを実行します。 bash python rename_videos.py
  3. スクリプトが実行されると、「処理したいMP4動画ファイルが入っているディレクトリのパスを入力してください: 」というプロンプトが表示されます。
  4. 動画ファイルが格納されているディレクトリの絶対パスを入力し、Enterキーを押します。
    • 例 (Windows): C:\Users\YourUser\Videos\CameraRoll
    • 例 (macOS/Linux): /Users/YourUser/Movies/CameraRoll
  5. スクリプトが指定されたディレクトリ内のMP4ファイルを処理し始め、進捗バーが表示されます。完了すると、メッセージが表示されます。

これで、指定したディレクトリ内のMP4動画ファイルの名前が、撮影日時に基づいて自動的に変更されているはずです。

ハマった点やエラー解決

1. exiftoolが見つからないエラー (FileNotFoundError: [WinError 2] 指定されたファイルが見つかりません。 など)

  • 原因: exiftoolがシステムPATHに通っていない、またはexiftool.exeの名前が正しくない。
  • 解決策:
    • Windowsの場合、ダウンロードしたexiftool(-k).exeexiftool.exeにリネームし、PATHが通っているディレクトリ(例: C:\Windows\System32や自分で作成しPATHに追加したディレクトリ)に移動したか確認してください。
    • macOS/Linuxの場合、brew install exiftoolsudo apt install libimage-exiftool-perlが正常に完了しているか、またはexiftoolコマンドがターミナルで直接実行できるか確認してください。
    • which exiftool (macOS/Linux) または where exiftool (Windows) をコマンドラインで実行し、exiftoolのパスが表示されるか確認してください。

2. 撮影日時情報が取得できないファイルがある (警告: 'filename.mp4' の撮影日時情報を取得できませんでした。スキップします。)

  • 原因: 一部の動画ファイルには、exiftoolが解釈できる形式の撮影日時メタデータが含まれていない場合があります。古い形式の動画や、特定の編集ソフトで処理されたファイルで発生することがあります。
  • 解決策: スクリプトは撮影日時が取得できないファイルをスキップするように設計されています。もしそのようなファイルをどうしてもリネームしたい場合は、ファイルシステム上の作成日時や更新日時を利用するロジックを追加検討する必要があります。ただし、これらの日時はファイルコピーなどで容易に変わってしまうため、本来の撮影日時とは異なる場合があります。

3. ファイル名の重複によるエラー(稀)

  • 原因: スクリプトにはファイル名重複回避ロジック(連番追加)が含まれていますが、非常に稀に(例えば、同じ秒数に複数の動画が開始し、かつ連番まで衝突するようなケース)問題が発生する可能性はゼロではありません。
  • 解決策: 現状のスクリプトはほとんどのケースに対応できます。もしリネーム後に特定のファイルだけファイル名が変わっていないなどがあれば、手動で確認・修正が必要になる場合があります。

4. Windowsでのパスの区切り文字

  • 原因: Windowsではパスの区切り文字に\を使いますが、Pythonの文字列リテラルではエスケープ文字として解釈されることがあります。
  • 解決策:
    • パス文字列の前にrを付けてRAW文字列として扱う(例: r"C:\Users\YourUser\Videos")。
    • \の代わりに/を使用する(例: "C:/Users/YourUser/Videos")。
    • 最も推奨されるのはos.path.join()を使用することです。これはOSに適した区切り文字を自動で挿入してくれます。本スクリプトではos.path.join()を使用しているため、ユーザーは入力時に\または/どちらを使っても問題ありません。

まとめ

本記事では、Pythonと強力なメタデータツールexiftoolを組み合わせることで、MP4動画ファイルのファイル名を撮影日時に基づいて自動的に変更する方法を解説しました。

  • exiftoolコマンドを利用することで、動画ファイル内に埋め込まれた詳細な撮影日時(メタデータ)を正確に取得できることを学びました。
  • Pythonのsubprocessモジュールを使って、外部コマンドであるexiftoolをスクリプトから実行し、その出力を処理する手順を実践しました。
  • ファイル名が重複した場合の連番追加ロジックなど、実用的なファイル整理スクリプトの作成方法を習得しました。

この記事を通して、手作業での時間のかかる動画ファイル整理作業が劇的に効率化され、大切な思い出の動画を時系列で分かりやすく管理できるようになるという大きなメリットを得られたことと思います。散らばっていた動画が、あなたの手によって整然と並び、振り返るのが楽しくなることでしょう。

今後は、複数のサブディレクトリに対応させたり、写真ファイル(JPEG/RAW)にも応用したり、さらには処理の進捗をGUIで表示するなどの発展的な内容についても記事にする予定です。

参考資料