プログラム media_inf.py の技術ドキュメント

プログラムの動作

media_inf.py は、指定されたディレクトリまたはパスにある動画および音声メディアファイルの詳細情報を取得し、標準出力に表示するためのPythonスクリプトです。このプログラムは、メディアファイルの技術的な特性(ファイルサイズ、再生時間、ビットレート、解像度、エンコード形式など)を一覧表示する目的で使用されます。

主な機能

  • ファイル検索: コマンドライン引数で指定されたファイルパターン(例: *.mp4, **/*.mp3)に基づいて、メディアファイルを検索します。引数が指定されない場合は、デフォルトのパターン(*.mp4, *.mp3, *.wav, *.flac)を使用します。

  • メディア情報の解析: pymediainfo ライブラリを使用して、検出された各メディアファイルから詳細なメタデータを抽出します。

  • 詳細情報の表示: 各ファイルの「General(全体)」「Video(動画)」「Audio(音声)」トラックの情報を整理して表示します。表示される情報には以下が含まれます。

    • 全体情報: ファイルサイズ、再生時間、総合ビットレート、コンテナ形式。

    • 動画トラック: エンコード形式(Codec ID, Format)、平均ビットレート、ビットレートモード、幅、高さ、フレームレート、アスペクト比。

    • 音声トラック: エンコード形式(Codec ID, Format)、平均ビットレート、ビットレートモード、サンプリングレート、チャンネル数。

  • エラーハンドリング: ファイルの読み込みや情報取得中にエラーが発生した場合でも、プログラムがクラッシュすることなく、エラーメッセージを表示して処理を継続します。

解決する課題

メディアファイルの技術的な詳細を手動で確認することは、特に多数のファイルがある場合に時間と労力がかかります。media_inf.py は、このプロセスを自動化し、必要な情報を迅速かつ一貫した形式で提供することで、ユーザーの負担を軽減します。これにより、メディアファイルの品質管理、整理、トラブルシューティングなどが効率的に行えます。

原理

media_inf.py は主に pymediainfo ライブラリを利用してメディアファイルの情報を解析します。このライブラリは、C++で書かれた強力なメディア情報ライブラリ「MediaInfo (libmediainfo)」へのPythonバインディングです。

  1. ファイル検索: glob モジュールが提供する glob.glob() 関数を使用し、指定されたシェルスタイルのワイルドカードパターンにマッチするファイルを検索します。recursive=True オプションにより、サブディレクトリも再帰的に検索することが可能です。

  2. メディア情報の解析: pymediainfo.MediaInfo.parse(file_path) メソッドが呼び出されると、指定されたメディアファイルのヘッダー情報やメタデータブロックが読み込まれ、内部的に解析されます。この解析結果は、media_info オブジェクトとして返されます。このオブジェクトは複数の「トラック」を持つことができます。

  3. トラックの識別と情報抽出: media_info オブジェクトには、ファイル内の各データストリーム(例: 全体情報、動画ストリーム、音声ストリーム)に対応する track オブジェクトのリストが含まれています。 プログラムは各 track オブジェクトをループ処理し、その track.track_type 属性に基づいて情報を分類します。

    • track.track_type == "General": ファイル全体に関する情報(ファイルサイズ、再生時間、総合ビットレート、コンテナ形式など)を抽出します。

    • track.track_type == "Video": 動画ストリームに関する情報(解像度、フレームレート、エンコード形式など)を抽出します。

    • track.track_type == "Audio": 音声ストリームに関する情報(サンプリングレート、チャンネル数、エンコード形式など)を抽出します。

  4. 単位変換とフォーマット: 抽出された生データは、より人間が読みやすい形式に変換されます。

    • ファイルサイズ: バイトからメガバイト (MB) に変換されます。 $\( \text{FileSize (MB)} = \frac{\text{track.file\_size}}{1024 \times 1024} \)$

    • 再生時間: ミリ秒から HH:MM:SS 形式に変換されます。 $\( \text{Seconds} = \frac{\text{track.duration}}{1000} \)$ そこから時間、分、秒が計算されます。

    • ビットレート: ビット/秒 (bps) からキロビット/秒 (kbps) に変換されます。 $\( \text{BitRate (kbps)} = \frac{\text{track.bit\_rate}}{1000} \)$

    • サンプリングレート: ヘルツ (Hz) からキロヘルツ (kHz) に変換されます。 $\( \text{SamplingRate (kHz)} = \frac{\text{track.sampling\_rate}}{1000} \)$

これらの処理を通じて、media_inf.py はメディアファイルの多岐にわたる技術情報を効率的に取得・表示します。

必要な非標準ライブラリとインストール方法

media_inf.py の実行には、pymediainfo という非標準ライブラリが必要です。このライブラリは、Python環境に pip コマンドを使用してインストールできます。

pymediainfo のインストール

コマンドプロンプトまたはターミナルを開き、以下のコマンドを実行してください。

pip install pymediainfo

これにより、pymediainfo ライブラリとその依存関係が自動的にインストールされます。

必要な入力ファイル

本プログラムは、分析対象となるメディアファイルを必要とします。

  • ファイルの種類: サポートされる一般的な形式は、以下の通りです。

    • 動画ファイル: .mp4 など

    • 音声ファイル: .mp3, .wav, .flac など 実際には pymediainfo ライブラリがサポートするあらゆる形式のメディアファイルを処理できます。

  • ファイルの場所:

    • スクリプトが実行されるカレントディレクトリ、またはコマンドライン引数で指定されたパス。

    • プログラムはワイルドカード(*, **)を使用してファイルを検索するため、複数のファイルを指定したり、サブディレクトリ内のファイルを再帰的に検索したりできます。

生成される出力ファイル

media_inf.py は、いかなるファイルも生成しません。 分析結果はすべて、実行中のコンソール(標準出力)にテキスト形式で表示されます。

コマンドラインでの使用例 (Usage)

media_inf.py は、コマンドライン引数として一つ以上のファイル検索パターンを受け入れます。

基本的な実行形式

python media_inf.py [file_pattern_1] [file_pattern_2] ...
  • [file_pattern_1], [file_pattern_2] などは、検索対象となるメディアファイルのパスやワイルドカードパターンです。

引数なしの場合

引数を指定せずに実行した場合、プログラムはデフォルトのパターンを使用してカレントディレクトリ(およびサブディレクトリ)からメディアファイルを検索します。

python media_inf.py

デフォルトパターン: *.mp4, *.mp3, *.wav, *.flac

引数ありの場合

特定のファイル形式やディレクトリ内のファイルを指定して検索する場合、引数としてパターンを渡します。

  • カレントディレクトリの全ての .mp4 ファイルを検索:

    python media_inf.py "*.mp4"
    
  • カレントディレクトリの全ての .mp3 および .wav ファイルを検索:

    python media_inf.py "*.mp3" "*.wav"
    
  • 特定のディレクトリ内の全ての .mp4 ファイルを検索(例: C:/Users/YourUser/Videos):

    python media_inf.py "C:/Users/YourUser/Videos/*.mp4"
    

    または

    python media_inf.py "/home/user/music/**/*.flac"
    

    ** はサブディレクトリを再帰的に検索します)

注意: ワイルドカードを含むパターンを引数として渡す場合、シェルによって展開されるのを防ぐため、パターンをダブルクォーテーション(")で囲むことを推奨します。

コマンドラインでの具体的な使用例

ここでは、いくつかの具体的なシナリオでの media_inf.py の使用例と、その出力例を説明します。 以下のファイルが存在するディレクトリで実行することを想定します。

.
├── video_sample.mp4
├── audio_track.mp3
└── sub_dir
    └── another_audio.wav

例1: 引数なしで実行(デフォルトパターンを使用)

python media_inf.py

実行結果の説明

このコマンドは、デフォルトのメディアパターン(*.mp4, *.mp3, *.wav, *.flac)を使用して、カレントディレクトリとサブディレクトリからファイルを検索します。上記の例では、video_sample.mp4, audio_track.mp3, sub_dir/another_audio.wav が検出され、それぞれの詳細情報が表示されます。

出力例

media_patterns:  ['*.mp4', '*.mp3', '*.wav', '*.flac']

--- ファイル: audio_track.mp3 ---
  ファイルサイズ: 3.50 MB
  Duration: 00:01:30
  Overall Bit Rate: 320.00 kbps
  コンテナ形式: MPEG Audio

  [音声トラック情報]
    エンコード形式 (Codec ID): MPEG Audio
    エンコード形式 (Format): MPEG Audio
    Bit Rate (平均): 320.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 44.1 kHz
    Channels: 2

--- ファイル: sub_dir/another_audio.wav ---
  ファイルサイズ: 15.00 MB
  Duration: 00:01:00
  Overall Bit Rate: 2000.00 kbps
  コンテナ形式: Wave

  [音声トラック情報]
    エンコード形式 (Codec ID): PCM
    エンコード形式 (Format): PCM
    Bit Rate (平均): 1536.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 48.0 kHz
    Channels: 2

--- ファイル: video_sample.mp4 ---
  ファイルサイズ: 123.45 MB
  Duration: 00:03:30
  Overall Bit Rate: 5000.00 kbps
  コンテナ形式: MPEG-4

  [動画トラック情報]
    エンコード形式 (Codec ID): avc1
    エンコード形式 (Format): AVC
    Bit Rate (平均): 4500.00 kbps
    Bit Rate Mode: VBR
    Width: 1920px
    Height: 1080px
    Frame Rate: 29.97 fps
    Aspect Ratio: 1.78

  [音声トラック情報]
    エンコード形式 (Codec ID): mp4a-40-2
    エンコード形式 (Format): AAC
    Bit Rate (平均): 128.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 48.0 kHz
    Channels: 2

Press ENTER to terminate>>

例2: 特定のファイルタイプのみを検索

カレントディレクトリの .mp4 ファイルのみを検索する場合。

python media_inf.py "*.mp4"

実行結果の説明

このコマンドは、video_sample.mp4 のみ検出します。audio_track.mp3another_audio.wav は検索対象外となるため、情報は表示されません。

出力例

media_patterns:  ['*.mp4']

--- ファイル: video_sample.mp4 ---
  ファイルサイズ: 123.45 MB
  Duration: 00:03:30
  Overall Bit Rate: 5000.00 kbps
  コンテナ形式: MPEG-4

  [動画トラック情報]
    エンコード形式 (Codec ID): avc1
    エンコード形式 (Format): AVC
    Bit Rate (平均): 4500.00 kbps
    Bit Rate Mode: VBR
    Width: 1920px
    Height: 1080px
    Frame Rate: 29.97 fps
    Aspect Ratio: 1.78

  [音声トラック情報]
    エンコード形式 (Codec ID): mp4a-40-2
    エンコード形式 (Format): AAC
    Bit Rate (平均): 128.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 48.0 kHz
    Channels: 2

Press ENTER to terminate>>

例3: 複数の異なるパターンを指定して検索

カレントディレクトリの .mp3 ファイルと、sub_dir 内の全ての .wav ファイルを検索する場合。

python media_inf.py "*.mp3" "sub_dir/*.wav"

実行結果の説明

このコマンドは、audio_track.mp3sub_dir/another_audio.wav を検出します。video_sample.mp4 は指定パターンにマッチしないため、情報は表示されません。

出力例

media_patterns:  ['*.mp3', 'sub_dir/*.wav']

--- ファイル: audio_track.mp3 ---
  ファイルサイズ: 3.50 MB
  Duration: 00:01:30
  Overall Bit Rate: 320.00 kbps
  コンテナ形式: MPEG Audio

  [音声トラック情報]
    エンコード形式 (Codec ID): MPEG Audio
    エンコード形式 (Format): MPEG Audio
    Bit Rate (平均): 320.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 44.1 kHz
    Channels: 2

--- ファイル: sub_dir/another_audio.wav ---
  ファイルサイズ: 15.00 MB
  Duration: 00:01:00
  Overall Bit Rate: 2000.00 kbps
  コンテナ形式: Wave

  [音声トラック情報]
    エンコード形式 (Codec ID): PCM
    エンコード形式 (Format): PCM
    Bit Rate (平均): 1536.00 kbps
    Bit Rate Mode: CBR
    Sampling Rate: 48.0 kHz
    Channels: 2

Press ENTER to terminate>>