multimedia.media_inf のソースコード
"""
メディアファイルのメタデータを抽出して表示するスクリプト。
概要:
指定されたパターンに合致する動画・音声ファイルの詳細なメタデータ情報を取得し、標準出力に表示します。
詳細説明:
このスクリプトは `pymediainfo` ライブラリを利用して、動画ファイル(.mp4)や音声ファイル(.mp3, .wav, .flac)といった
メディアファイルのメタデータ(ファイルサイズ、再生時間、ビットレート、エンコード形式、解像度、サンプリングレートなど)
を解析します。
初期設定ではカレントディレクトリ内の特定の拡張子のファイルを検索しますが、コマンドライン引数で検索パターンを
上書きすることが可能です。見つかった各ファイルについて、一般的な情報、動画トラックの情報、音声トラックの情報を
整形して表示します。
関連リンク:
:doc:`media_inf_usage`
"""
import os
import sys
import glob
from pymediainfo import MediaInfo
#media_patterns = ['**/*.mp4', '**/*.mp3', '**/*.wav', '**/*.flac']
media_patterns = ['*.mp4', '*.mp3', '*.wav', '*.flac']
argv = sys.argv[1:] # コマンドライン引数を取得
if len(argv) >= 1:
media_patterns = argv
[ドキュメント]
def get_media_details(file_path):
"""
指定されたメディアファイルの詳細情報を取得し、整形して標準出力に表示します。
概要:
メディアファイルパスを受け取り、`pymediainfo` を使用してそのメタデータを解析し、主要な情報を表示します。
詳細説明:
ファイルパスからMediaInfoオブジェクトを生成し、General、Video、Audioの各トラックを走査します。
各トラックからファイルサイズ、再生時間、ビットレート、コーデック、解像度、フレームレート、サンプリングレート、
チャンネル数などの情報を抽出し、適切な単位に変換して表示します。
情報が存在しない場合や型が異なる場合は "N/A" と表示され、エラーが発生した場合はその旨を報告します。
:param file_path: str: 解析するメディアファイルの絶対パスまたは相対パス。
:returns: None: ファイル情報を標準出力に表示するだけで、値を返しません。
"""
try:
media_info = MediaInfo.parse(file_path)
print(f"\n--- ファイル: {file_path} ---")
found_audio = False
found_video = False
for track in media_info.tracks:
if track.track_type == "General":
# 各属性が存在し、かつ数値型であることを確認してからフォーマットする
if track.file_size is not None and isinstance(track.file_size, (int, float)):
print(f" ファイルサイズ: {track.file_size / (1024 * 1024):.2f} MB")
else:
print(" ファイルサイズ: N/A")
if track.duration is not None and isinstance(track.duration, (int, float)):
sec = track.duration / 1000
min = sec / 60.0
hour = int(min / 60.0)
min = int(min - hour * 60)
sec = int(sec - min * 60 - hour * 60 * 60)
print(f" Duration: {hour:02d}:{min:02d}:{sec:02d}")
else:
print(" Duration: N/A")
if track.overall_bit_rate is not None and isinstance(track.overall_bit_rate, (int, float)):
print(f" Overall Bit Rate: {track.overall_bit_rate / 1000:.2f} kbps")
else:
print(" Overall Bit Rate: N/A")
if track.format: # formatは文字列なのでそのまま表示
print(f" コンテナ形式: {track.format}")
else:
print(" コンテナ形式: N/A")
elif track.track_type == "Video":
found_video = True
print("\n [動画トラック情報]")
if track.codec_id:
print(f" エンコード形式 (Codec ID): {track.codec_id}")
else:
print(" エンコード形式 (Codec ID): N/A")
if track.format:
print(f" エンコード形式 (Format): {track.format}")
else:
print(" エンコード形式 (Format): N/A")
if track.bit_rate is not None and isinstance(track.bit_rate, (int, float)):
print(f" Bit Rate (平均): {track.bit_rate / 1000:.2f} kbps")
else:
print(" Bit Rate (平均): N/A")
# ここにbit_rate_modeを追加
if track.bit_rate_mode:
print(f" Bit Rate Mode: {track.bit_rate_mode}")
else:
print(" Bit Rate Mode: N/A (または不明)")
if track.width is not None and isinstance(track.width, int): # widthは整数
print(f" Width: {track.width}px")
else:
print(" Width: N/A")
if track.height is not None and isinstance(track.height, int): # heightも整数
print(f" Height: {track.height}px")
else:
print(" Height: N/A")
if track.frame_rate is not None and isinstance(track.frame_rate, (int, float)):
print(f" Frame Rate: {track.frame_rate:.2f} fps")
else:
print(" Frame Rate: N/A")
if track.display_aspect_ratio is not None and isinstance(track.display_aspect_ratio, (int, float)):
print(f" Aspect Ratio: {track.display_aspect_ratio:.2f}")
else:
print(" Aspect Ratio: N/A")
elif track.track_type == "Audio":
found_audio = True
print("\n [音声トラック情報]")
if track.codec_id:
print(f" エンコード形式 (Codec ID): {track.codec_id}")
else:
print(" エンコード形式 (Codec ID): N/A")
if track.format:
print(f" エンコード形式 (Format): {track.format}")
else:
print(" エンコード形式 (Format): N/A")
if track.bit_rate is not None and isinstance(track.bit_rate, (int, float)):
print(f" Bit Rate (平均): {track.bit_rate / 1000:.2f} kbps")
else:
print(" Bit Rate (平均): N/A")
# ここにbit_rate_modeを追加
if track.bit_rate_mode:
print(f" Bit Rate Mode: {track.bit_rate_mode}")
else:
print(" Bit Rate Mode: N/A (または不明)")
if track.sampling_rate is not None and isinstance(track.sampling_rate, (int, float)):
print(f" Sampling Rate: {track.sampling_rate / 1000:.1f} kHz")
else:
print(" Sampling Rate: N/A")
if track.channel_s is not None and isinstance(track.channel_s, int): # channel_sは整数
print(f" Channels: {track.channel_s}")
else:
print(" Channels: N/A")
if not found_video and not found_audio:
print(" 注意: 動画または音声トラックが見つかりませんでした。")
except Exception as e:
print(f"エラー: {file_path} の情報取得中にエラーが発生しました - {e}")
[ドキュメント]
def main():
"""
プログラムのエントリポイントであり、メディアファイルの検索と詳細情報の表示を制御します。
概要:
設定されたパターンまたはコマンドライン引数で指定されたパターンに基づいてメディアファイルを検索し、
見つかった各ファイルの詳細情報を `get_media_details` 関数で表示します。
詳細説明:
スクリプトが実行されると、まず `media_patterns` リストに基づいて、現在のディレクトリまたは指定された
パスから動画・音声ファイルを検索します。`sys.argv` を介してコマンドライン引数が与えられた場合、
`media_patterns` はその引数で上書きされます。
見つかったファイルのリストは重複が排除され、ソートされてから `get_media_details` に渡されます。
ファイルが見つからない場合は、適切なメッセージが表示されます。
処理完了後、ユーザーがEnterキーを押すまでプログラムは終了しません。
:returns: None: 処理結果を標準出力に表示するだけで、値を返しません。
"""
print("media_patterns: ", media_patterns)
found_files = []
for pattern in media_patterns:
found_files.extend(glob.glob(pattern, recursive=True))
if not found_files:
print("指定されたパターンにマッチする動画・音声ファイルは見つかりませんでした。")
print("検索パターンを確認してください。例: '**/*.mp4', 'C:/Users/YourUser/Music/*.mp3'")
return
# print(f"--- {len(found_files)} 個のメディアファイルを検出しました ---")
for file_path in sorted(list(set(found_files))):
get_media_details(file_path)
input("\nPress ENTER to terminate>>\n")
if __name__ == "__main__":
main()