はい、承知いたしました。FFmpegを使った動画・音声メタデータの理解と編集について、約5000語の詳細な記事を作成します。
ffmpeg徹底解説:動画・音声メタデータを理解し編集する
デジタルメディアの世界では、動画ファイルや音声ファイルそのものだけでなく、それに付随する「情報」が非常に重要です。この付随情報こそが「メタデータ」であり、ファイルの整理、検索、管理において中心的な役割を果たします。本記事では、コマンドラインから動画・音声ファイルを自在に操る強力なツールであるFFmpegを使い、このメタデータをどのように理解し、編集するかを徹底的に解説します。
FFmpegは、その高い汎用性と強力な機能により、メディア処理の分野で広く利用されています。単なるフォーマット変換やエンコーディングだけでなく、ファイルの内部構造、特にメタデータにアクセスし、操作することも可能です。この記事を通じて、FFmpegを使ったメタデータ管理の基本から応用までを習得し、あなたのメディアファイルをより効率的に、より正確に管理できるようになることを目指します。
第1章:メタデータとは何か?メディアファイルにおけるその重要性
デジタルファイルにおけるメタデータとは、「データについてのデータ」です。動画ファイルや音声ファイルにおいては、ファイルの内容そのもの(映像や音声)に関する追加情報や説明情報が含まれます。
例えば、あなたが持っている音楽ファイルについて考えてみてください。「アーティスト名」「曲名」「アルバム名」「ジャンル」「リリース年」といった情報は、音楽のデータそのものではなく、その音楽を識別し、分類するための情報です。これが音声ファイルにおけるメタデータの一例です。
動画ファイルでも同様に、「タイトル」「監督」「制作年」「撮影日」「場所」「使用コーデック」「解像度」「フレームレート」「ビットレート」「チャプター情報」などがメタデータとして含まれます。
なぜメタデータは重要なのでしょうか?
- 整理と管理: メタデータがあれば、大量のメディアファイルを効率的に整理できます。特定のアーティストの曲だけをリストアップしたり、特定の年に撮影された動画だけを検索したりすることが容易になります。
- 情報の付与: ファイルの内容を説明する情報を付与することで、他のユーザーがファイルの内容を理解しやすくなります。
- 互換性の向上: 一部のメタデータ(例:コーデック情報、解像度)は、プレイヤーソフトウェアやハードウェアがファイルを正しく再生するために不可欠な情報を含んでいます。
- 権利情報の表示: 著作権情報やライセンス情報などを含めることで、ファイルの使用に関する情報を提供できます。
- ワークフローの効率化: 撮影機材や編集ソフトウェアが自動的に付与する技術的なメタデータは、ポストプロダクションのワークフローを効率化するのに役立ちます。
メタデータの種類
メディアファイルのメタデータには、大きく分けて二つのレベルがあります。
- コンテナレベルメタデータ (Format Metadata): ファイル全体(コンテナ)に関連付けられるメタデータです。ファイル全体のタイトル、アーティスト、アルバム、ジャンル、制作年、全体の duração (期間)、全体のビットレートなどがこれにあたります。MP4コンテナ、MKVコンテナ、MP3コンテナなど、ファイル形式(コンテナ)によってサポートされるメタデータの種類や格納方法が異なります。
- ストリームレベルメタデータ (Stream Metadata): ファイル内の個別のストリーム(映像ストリーム、音声ストリーム、字幕ストリームなど)に関連付けられるメタデータです。例えば、特定の音声ストリームの言語、特定の映像ストリームのタイトル(例:「コメンタリー」「特典映像」)、個別のストリームに使用されているコーデックなどがこれにあたります。
メタデータフォーマット/規格
メタデータは、様々な規格やフォーマットでファイルに埋め込まれています。代表的なものとして:
- ID3: 主にMP3ファイルで使われるメタデータ形式。ID3v1, ID3v2.2, ID3v2.3, ID3v2.4などのバージョンがあります。
- QuickTime Tags: MP4やMOVファイルで使われるメタデータ形式。
- Vorbis Comments: Ogg Vorbis, FLAC, Opusファイルなどで使われるメタデータ形式。シンプルで柔軟性が高いのが特徴です。
- Exif: デジタルカメラで撮影された画像ファイル(JPEG, TIFFなど)でよく使われる形式ですが、一部の動画ファイルにも含まれることがあります(例:撮影日時、カメラ情報)。
- Matroska Tags: MKVファイルで使われる独自のタグシステム。非常に柔軟で、様々な種類の情報を格納できます。
これらのメタデータは、ファイル形式(コンテナ)の中に特定の構造で埋め込まれています。FFmpegは、これらの様々なコンテナとメタデータ形式を解釈し、操作する能力を持っています。
なぜFFmpegを使うのか?
メディアファイルのメタデータを扱うためのツールは他にも存在しますが、FFmpegを使用することには以下の利点があります。
- 広範なフォーマットサポート: FFmpegは驚くほど多くのコンテナ形式、コーデック、メタデータ形式をサポートしています。
- コマンドラインツール: コマンドラインから操作できるため、バッチ処理やスクリプトによる自動化が容易です。大量のファイルを一括で処理する場合に威力を発揮します。
- 高精度な情報アクセス: ffprobeという付属ツールを使うことで、ファイルの内部構造やメタデータを詳細かつプログラムフレンドリーな形式で抽出できます。
- 編集の柔軟性: コンテナレベルから特定のストリームレベルまで、様々なレベルでメタデータを編集、追加、削除、コピーできます。
次の章からは、具体的にFFmpeg(とffprobe)を使ってメタデータを操作する方法を見ていきましょう。
第2章:FFmpegの基本操作とメタデータ確認 (ffprobe)
FFmpegを使い始める前に、まずその付属ツールであるffprobe
を使ってメディアファイルの情報を取得する方法を学びましょう。メタデータを編集する前に、どのようなメタデータがファイルに含まれているのかを正確に知ることが重要です。
ffprobe
は、FFmpegと同じパッケージに含まれています。コマンドラインを開き、ffprobe -h
と入力してヘルプが表示されれば、インストールは成功しています。
2.1 ffprobe
の基本的な使い方
最も基本的な使い方は、ファイル名を引数として指定するだけです。
bash
ffprobe input.mp4
このコマンドを実行すると、input.mp4
ファイルに関する様々な情報が表示されます。表示される情報には、以下のようなものが含まれます。
- Input #0: 入力ファイルに関する情報。コンテナ形式、期間 (duration)、開始時間 (start time)、ビットレート (bitrate) など。
- Metadata: コンテナレベルのメタデータ。
title
,artist
,album
,year
などが表示されることがあります。 - Stream #0:0, Stream #0:1, …: 各ストリームに関する情報。ストリームの種類(Video, Audio, Subtitleなど)、コーデック (codec)、解像度 (resolution)、フレームレート (frame rate)、サンプルレート (sample rate)、チャンネル数 (channels) など。
- Metadata: 各ストリームレベルのメタデータ。
language
,title
(ストリームタイトル) などが表示されることがあります。
例:ffprobe input.mp4
の出力例
ffprobe version 5.1.2 Copyright (c) 2007-2022 the FFmpeg developers
built with gcc 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.1)
... (省略)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, [email protected]: 'input.mp4'
Metadata:
major_brand : mp42
minor_version : 0
compatible_brands: mp42isom
creation_time : 2023-10-26T10:00:00.000000Z
title : My Awesome Video
artist : Unknown Artist
comment : This is a test file
Duration: 00:00:30.50, start: 0.000000, bitrate: 1500 kb/s
Stream #0:0[0x1](und): Video: h264 (avc1 / 0x31637661), yuv420p(tv, bt709), 1920x1080 [SAR 1:1 DAR 16:9], 1357 kb/s, 29.97 fps, 30k tbr, 90k tbn (default)
Metadata:
creation_time : 2023-10-26T10:00:00.000000Z
handler_name : VideoHandler
vendor_id : [0][0][0][0]
Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
Metadata:
creation_time : 2023-10-26T10:00:00.000000Z
handler_name : SoundHandler
vendor_id : [0][0][0][0]
language : eng
title : Stereo Audio Track
この出力から、ファイル全体(コンテナ)にtitle
, artist
, comment
, creation_time
などのメタデータがあること、そして音声ストリーム (Stream #0:1
) には language
や title
というストリーム固有のメタデータがあることがわかります。
2.2 出力形式を指定する (-of
)
ffprobe
のデフォルト出力は人間が読むのには適していますが、スクリプトなどで利用するには不便です。-of
オプションを使うと、JSONやXML、INIなどの形式で出力させることができます。これにより、プログラムによる解析が容易になります。
-
JSON形式:
bash
ffprobe -v quiet -print_format json -show_format -show_streams input.mp4-v quiet
: 不要なログ出力を抑制します。-print_format json
: 出力形式をJSONに指定します。-show_format
: コンテナレベルの情報を表示します。-show_streams
: 各ストリームの情報を表示します。
このコマンドは、ファイル全体の情報とすべてのストリーム情報をJSON形式で出力します。メタデータはJSONオブジェクト内の
tags
フィールドなどに含まれます。 -
INI形式:
bash
ffprobe -v quiet -print_format ini -show_format -show_streams input.mp4これはINIファイルのようなセクション分けされたキー=値形式で出力します。
-
デフォルト形式(タグのみ表示):
bash
ffprobe -v quiet -show_entries format_tags=title:stream_tags=language input.mp4-show_entries
: 表示するエントリを指定します。format_tags=title
はコンテナレベルのタグの中からtitle
を取得、stream_tags=language
はストリームレベルのタグの中からlanguage
を取得します。複数のエントリはコロン:
で区切ります。
このコマンドは、指定したメタデータキーの値だけをシンプルに出力します。
2.3 表示する情報をフィルタリングする
-show_format
や -show_streams
は、ファイル全体の情報とすべてのストリーム情報をそれぞれ表示しますが、さらに細かく絞り込むことができます。
-
コンテナ情報のみ:
bash
ffprobe -show_format input.mp4 -
ストリーム情報のみ:
bash
ffprobe -show_streams input.mp4 -
特定の種類のストリーム情報のみ:
-select_streams
オプションでストリームの種類を指定します。v
(映像),a
(音声),s
(字幕),d
(データ) など。bash
ffprobe -show_streams -select_streams a input.mp4 # 音声ストリームのみ
ffprobe -show_streams -select_streams v input.mp4 # 映像ストリームのみ -
特定のインデックスのストリーム情報のみ:
ストリームは
インデックス:種類
またはインデックス
で指定できます。通常、0から始まります。bash
ffprobe -show_streams -select_streams a:0 input.mp4 # 最初の音声ストリームのみ
ffprobe -show_streams -select_streams v:0 input.mp4 # 最初の映像ストリームのみ -
特定のメタデータキーのみを取得する (
-show_entries
)前述の
-show_entries
は、表示する情報フィールドを限定するのに非常に便利です。bash
ffprobe -v quiet -show_entries format_tags=title,artist -of default=nk=1:nw=1 input.mp4format_tags=title,artist
: コンテナレベルのタグの中からtitle
とartist
を表示。-of default=nk=1:nw=1
: デフォルト形式で、キー名 (nk=1
) と値 (nw=1
) のみを表示(余計な行頭の文字列などをなくす)
出力例:
title=My Awesome Video
artist=Unknown Artistストリームレベルの特定のメタデータを取得する場合:
bash
ffprobe -v quiet -show_entries stream_tags=language -select_streams a:0 -of default=nk=1:nw=1 input.mp4stream_tags=language
: ストリームレベルのタグの中からlanguage
を表示。-select_streams a:0
: 最初の音声ストリームに限定。
出力例:
language=eng
ffprobe
の -show_entries
オプションと出力形式 (-of
) を組み合わせることで、必要なメタデータだけを正確に抽出できます。これは、後述するスクリプトによる自動処理において非常に重要なテクニックです。
2.4 よく使われるメタデータキー名
メタデータキーの名前は、コンテナ形式やソフトウェアによって多少異なる場合がありますが、一般的によく使われるキー名には以下のようなものがあります。
コンテナレベル (Format Tags):
title
: タイトルartist
: アーティスト/作者album
: アルバム名genre
: ジャンルyear
: リリース/制作年date
: 日付 (より正確な形式)comment
: コメントcomposer
: 作曲家publisher
: 出版社/配給元encoder
: エンコードに使用したソフトウェアcreation_time
: ファイル作成日時 (多くの場合自動的に付与される技術情報)
ストリームレベル (Stream Tags):
language
: ストリームの言語コード (例:eng
,jpn
)title
: ストリームのタイトル (例: “コメンタリー”, “日本語吹き替え”)handler_name
: ストリームを処理するソフトウェアの名前 (技術情報)
これらのキー名は、ffprobe
の出力で確認できます。もし必要な情報が見つからない場合は、そのファイルに該当するメタデータが含まれていないか、異なるキー名で保存されている可能性があります。
ffprobe
は、メディアファイルにどのような情報が含まれているかを「探る」ための強力なツールです。メタデータの編集に進む前に、まずはこのツールを使いこなして、対象ファイルの構造と既存のメタデータを正確に把握できるようになりましょう。
第3章:FFmpegでのメタデータ編集の基礎
ffprobe
でメタデータの確認方法を学んだら、次はffmpeg
を使って実際にメタデータを編集してみましょう。ffmpeg
コマンドの基本的な構文は以下の通りです。
bash
ffmpeg [入力オプション] -i 入力ファイル [出力オプション] 出力ファイル
メタデータを編集する場合、主なオプションは出力オプションとして指定します。メタデータの編集には、主に以下のオプションが使われます。
-metadata key=value
: メタデータを設定します。-metadata:s[:stream_specifier] key=value
: 特定のストリームのメタデータを設定します。-map_metadata input_file_or_stream
: 既存のメタデータをコピーします。-map_metadata -1
: すべてのメタデータを破棄します。
重要な注意点:
FFmpegでメタデータを編集する場合、通常はファイルを再エンコードする必要はありません。-c copy
オプションを使って、映像や音声ストリームをそのままコピーすることで、高速にメタデータだけを変更できます。
bash
ffmpeg -i input.mp4 -c copy -metadata title="新しいタイトル" output.mp4
ただし、-c copy
を使用できるのは、出力コンテナが入力ストリームのコーデックをサポートしている場合のみです。また、一部のメタデータの変更(特にチャプターなど、ファイルの構造に関わるもの)は、コンテナの再構築が必要になる場合がありますが、多くの場合-c copy
で十分です。
3.1 コンテナレベルメタデータの設定
ファイル全体のメタデータ(タイトル、アーティストなど)を設定するには、出力オプションとして -metadata key=value
を指定します。
例1:ファイルのタイトルとアーティストを設定する
bash
ffmpeg -i input.mp4 -c copy -metadata title="新しい動画タイトル" -metadata artist="動画制作者名" output_with_metadata.mp4
このコマンドは、input.mp4
の映像・音声ストリームをそのままコピーし (-c copy
)、出力ファイル output_with_metadata.mp4
に「新しい動画タイトル」というタイトルと「動画制作者名」というアーティスト情報を設定します。
複数の -metadata
オプションを連ねることで、複数のメタデータ項目を一度に設定できます。
例2:アルバム名、ジャンル、年を設定する(音声ファイルの場合など)
bash
ffmpeg -i input.mp3 -c copy -metadata album="ベストアルバム" -metadata genre="Pop" -metadata year="2023" output_with_metadata.mp3
3.2 ストリームレベルメタデータの設定
特定のストリーム(例:最初の音声ストリーム)に対してメタデータを設定したい場合は、-metadata:s[:stream_specifier] key=value
の形式を使用します。stream_specifier
は、対象のストリームを指定するための識別子です。
ストリーム指定子の一般的な形式:
s
: すべてのストリームs:v
: すべての映像ストリームs:a
: すべての音声ストリームs:s
: すべての字幕ストリームs:d
: すべてのデータストリームs:v:0
: 最初の映像ストリームs:a:1
: 2番目の音声ストリームs:0
: 最初のストリーム(種類に関わらず)s:0:0
: 最初の入力ファイルの最初のストリーム(複数の入力ファイルがある場合)
例3:最初の音声ストリームの言語を設定する
入力ファイルに複数の音声ストリームがある場合に、最初の音声ストリーム(インデックス0)の言語を英語 (eng
) に設定します。
bash
ffmpeg -i input_multi_audio.mkv -c copy -metadata:s:a:0 language="eng" output_audio_lang.mkv
ffprobe
でストリームのインデックスや種類を確認してから指定してください。
例4:すべての音声ストリームに同じ言語を設定する
bash
ffmpeg -i input.mp4 -c copy -metadata:s:a language="jpn" output_all_audio_jpn.mp4
このコマンドは、入力ファイルに含まれる すべて の音声ストリームの言語を日本語 (jpn
) に設定します。
3.3 メタデータの削除
特定のメタデータ項目を削除したい場合は、そのキーに対して空の値を設定します。
bash
ffmpeg -i input.mp4 -c copy -metadata comment= output_no_comment.mp4
このコマンドは、コンテナレベルの comment
メタデータを削除します。ストリームレベルのメタデータを削除したい場合も同様です。
bash
ffmpeg -i input.mkv -c copy -metadata:s:a:0 title= output_no_audio_title.mkv
3.4 既存のメタデータのコピー (-map_metadata
)
デフォルトでは、FFmpegは多くの場合、入力ファイルのメタデータを出力ファイルに引き継ぎません。特にエンコードを行う場合、メタデータは失われることが多いです。既存のメタデータを引き継ぎたい場合は、-map_metadata
オプションを使用します。
-map_metadata
オプションは、どの入力ファイル/ストリームからメタデータをコピーするかを指定します。形式は -map_metadata infile[:metadata_spec]
です。infile
は入力ファイルのインデックス(0から始まる)またはファイル名、metadata_spec
はコピーするメタデータの種類(グローバル、ストリームなど)を指定します。
例5:入力ファイルからすべてのメタデータをコピーする
最も一般的な使い方は、入力ファイル全体のメタデータをすべて出力ファイルにコピーすることです。入力ファイルが一つだけの場合、入力ファイルのインデックスは 0
です。
bash
ffmpeg -i input.mp4 -c:v libx264 -c:a aac -map_metadata 0 output_encoded_with_metadata.mp4
このコマンドは、input.mp4
をH.264ビデオとAACオーディオに再エンコードしますが、同時に -map_metadata 0
によって、入力ファイル(インデックス0)のコンテナレベルおよびストリームレベルのメタデータをすべて出力ファイルにコピーします。
例6:すべてのメタデータを破棄する
逆に、入力ファイルのメタデータを一切出力ファイルに含めたくない場合は、-map_metadata -1
を指定します。
bash
ffmpeg -i input.mp4 -c copy -map_metadata -1 output_no_metadata.mp4
これは、メタデータに個人情報などが含まれている場合に、ファイルを公開する前にきれいにするのに役立ちます。
例7:特定の入力ストリームのメタデータをコピーする
少し複雑なケースとして、例えば入力ファイルにある特定の音声ストリームのメタデータだけを、出力ファイルの対応する音声ストリームにコピーしたい、という場合も考えられます。
ffmpeg
コマンドは複数の入力ファイル (-i
) を扱えます。-map_metadata
の metadata_spec
部分は、g
(グローバル/コンテナ), s
(ストリーム), c
(チャプター), p
(プログラム) など、メタデータのスコープを指定できます。
例えば、入力ファイル input.mkv
の最初の音声ストリーム (a:0
) のメタデータを出力にコピーするには:
bash
ffmpeg -i input.mkv -map 0 -c copy -map_metadata 0:s:a:0 output_copied_stream_metadata.mkv
-map 0
: 入力ファイル0のすべてのストリームを出力に含めることを指定。-map_metadata 0:s:a:0
: 入力ファイル0の、ストリームタイプが音声 (a
) でインデックスが0のストリーム (s:a:0
) のメタデータを、出力ファイルの対応するストリームにコピーします。
これはかなり高度な使い方ですが、特定のストリームのメタデータだけを引き継ぎたい場合に便利です。
3.5 メタデータ編集とエンコーディング
繰り返しになりますが、メタデータの編集だけなら -c copy
を使うのが最も速く、品質劣化もありません。しかし、コーデック変換や解像度変更など、ファイル内容のエンコードも同時に行う場合は、-c copy
は使えません。その場合は、エンコードオプションと共に -map_metadata 0
を指定して、元のメタデータを引き継ぐのが一般的です。
“`bash
元ファイルを再エンコードしつつ、メタデータは全て引き継ぐ
ffmpeg -i input.mov -c:v libx264 -c:a aac -b:v 1000k -ar 44100 -map_metadata 0 output.mp4
元ファイルを再エンコードしつつ、新しいタイトルを設定し、元の他のメタデータも引き継ぐ
後から指定した -metadata オプションが優先されます
ffmpeg -i input.mov -c:v libx264 -c:a aac -map_metadata 0 -metadata title=”変換後の新しいタイトル” output.mp4
“`
-map_metadata 0
を指定した後で -metadata
オプションを使うと、-metadata
で指定した項目が -map_metadata 0
でコピーされた値よりも優先されます。これにより、元のメタデータを引き継ぎつつ、特定の項目だけを上書きすることができます。
第4章:詳細なメタデータ編集テクニック
基本的なメタデータの設定、削除、コピー方法を理解したところで、さらに応用的なテクニックを見ていきましょう。
4.1 複数のメタデータ項目を一度に設定/上書き
複数の -metadata
オプションを並べることで、多くの項目を一度に設定できます。
bash
ffmpeg -i input.mp4 -c copy \
-metadata title="映画のタイトル" \
-metadata director="監督名" \
-metadata year="2023" \
-metadata genre="アクション" \
-metadata comment="この動画はデモ用です。" \
output_rich_metadata.mp4
このように、改行やバックスラッシュ (\
) を使うとコマンドが読みやすくなります。
4.2 特定のストリームの複数メタデータ設定
特定のストリームに複数のメタデータを設定する場合も、-metadata:s[:stream_specifier]
を繰り返します。
bash
ffmpeg -i input.mkv -c copy \
-metadata:s:a:0 language="jpn" \
-metadata:s:a:0 title="日本語オリジナル" \
-metadata:s:a:1 language="eng" \
-metadata:s:a:1 title="英語吹き替え" \
-metadata:s:s:0 language="jpn" \
-metadata:s:s:0 title="日本語字幕" \
output_stream_details.mkv
この例では、最初の音声ストリーム、2番目の音声ストリーム、最初の字幕ストリームにそれぞれ言語とタイトルを設定しています。
4.3 外部ファイルからのメタデータ読み込み (-map_metadata
)
大量のメタデータを設定する場合や、既存のメタデータをテンプレートとして再利用したい場合があります。FFmpegでは、テキストファイルに記述したメタデータを読み込んで適用することができます。これには -map_metadata
オプションを使いますが、入力ファイルではなく、メタデータが記述されたファイルを指定します。
メタデータファイルはINIファイルのような形式で記述します。セクションとして [format]
(コンテナレベル), [stream:n]
(n番目のストリーム), [chapter:n]
(n番目のチャプター) などがあり、その中に key=value
の形式でメタデータを記述します。
例:メタデータファイル metadata.txt
“`ini
[format]
title=新しい動画タイトル
artist=動画制作者名
year=2024
comment=外部ファイルから読み込んだメタデータです。
[stream:0] # 最初のストリーム(通常は映像)
title=メイン映像
[stream:1] # 2番目のストリーム(通常は音声)
language=jpn
title=オリジナル音声
“`
このファイルを使ってメタデータを適用するコマンドは以下のようになります。
bash
ffmpeg -i input.mp4 -i metadata.txt -c copy -map_metadata 1 output_from_file.mp4
-i metadata.txt
: メタデータファイルを2番目の入力ファイルとして指定します(インデックス1)。-map_metadata 1
: 入力ファイル1(metadata.txt
)のすべてのメタデータを、出力ファイルにコピーします。
この方法を使うと、複数のファイルに対して同じメタデータを適用したり、メタデータの一覧を編集したりするのが非常に効率的になります。
4.4 カバーアート(アルバムアート)の埋め込み
音楽ファイル(MP3, FLAC, M4Aなど)や一部の動画ファイル(MP4, MKVなど)では、カバーアート(アルバムアート)をメタデータの一部として埋め込むことができます。これは、多くのメディアプレイヤーでファイルのサムネイルとして表示されるため、非常に便利な機能です。
カバーアートを埋め込むには、カバーアートの画像ファイル(JPEGまたはPNG)を別の入力ファイルとして指定し、それを映像ストリームとしてマップします。そして、そのストリームを「カバーアート」として扱うようにメタデータを設定します。
例:MP3ファイルにカバーアートを埋め込む
bash
ffmpeg -i input.mp3 -i cover.jpg -c copy -map 0 -map 1:v -metadata:s:v title="Album cover" -metadata:s:v handler_name="Album cover" output_with_cover.mp3
-i input.mp3
: 元の音声ファイル(入力0)-i cover.jpg
: カバーアート画像ファイル(入力1)-c copy
: ストリームをコピーします(音声はMP3のまま、画像はそのまま)。-map 0
: 入力0(input.mp3
)のすべてのストリーム(この場合は音声ストリーム)を出力に含めます。-map 1:v
: 入力1(cover.jpg
)の映像ストリームを出力に含めます。画像ファイルはFFmpegによって内部的に短い映像ストリームとして扱われます。-metadata:s:v title="Album cover"
: 追加した映像ストリーム(カバーアート)のタイトルを「Album cover」に設定します。-metadata:s:v handler_name="Album cover"
: 追加した映像ストリームのハンドラ名を「Album cover」に設定します。
これらのストリームレベルメタデータ(title
やhandler_name
に特定の文字列を設定すること)は、多くのプレイヤーがこのストリームを「カバーアート」として認識するために使われます。
例:MP4ファイルにカバーアートを埋め込む
MP4ファイルの場合も基本的な考え方は同じですが、出力コンテナやプレイヤーによっては認識のされ方が異なることがあります。
bash
ffmpeg -i input.mp4 -i cover.jpg -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic output_with_cover.mp4
-i input.mp4
: 元の動画ファイル(入力0)-i cover.jpg
: カバーアート画像ファイル(入力1)-map 0
: 入力0(input.mp4
)のすべてのストリームを出力に含めます。-map 1
: 入力1(cover.jpg
)のすべてのストリーム(映像ストリーム)を出力に含めます。-c copy
: 元の動画・音声ストリームはコピーします。-c:v:1 png
: 入力1(画像)の映像ストリームをPNG形式でエンコードし直します。(元がJPEGでもPNGに変換することで互換性が高まる場合がありますが、-c copy
で元の形式のままでも良いこともあります。-c:v:1 copy
も試してみてください)-disposition:v:1 attached_pic
: 入力1(画像)の映像ストリームを「添付画像」として扱われるようにdispositionフラグを設定します。これはMP4などでカバーアートを埋め込む際の標準的な方法です。
カバーアートの埋め込みは、使用するコンテナ形式(MP3, M4A, MP4, MKVなど)やプレイヤーによって最適な方法や認識されるメタデータキー、dispositionフラグが異なる場合があるため、いくつかのパターンを試す必要があるかもしれません。ffprobe
で埋め込み後のファイルを確認し、画像ストリームが正しく追加され、意図したメタデータやdispositionが付与されているか確認しましょう。
4.5 チャプターマーカーの編集
動画ファイル(特にMKVやMP4)には、チャプターマーカーを埋め込むことができます。これにより、動画を特定の区切り(章)で再生したり、スキップしたりすることが可能になります。チャプター情報もメタデータの一種として扱われます。
チャプター情報を編集するには、チャプターリストを記述したテキストファイルを別途用意し、それを入力ファイルとして指定します。
例:チャプターファイル chapters.txt
チャプターファイルはFFmpeg独自のフォーマットで記述します。時間の指定は HH:MM:SS.mmm
(時:分:秒.ミリ秒) の形式で行います。
“`ini
;FFMETADATA1
[CHAPTER]
TIMEBASE=1/1000
START=0
END=5000
title=イントロ
[CHAPTER]
TIMEBASE=1/1000
START=5000
END=15000
title=第1章
[CHAPTER]
TIMEBASE=1/1000
START=15000
END=30000
title=第2章
[CHAPTER]
TIMEBASE=1/1000
START=30000
END=60000
title=結論
“`
;FFMETADATA1
: ファイル形式のヘッダ。必須です。[CHAPTER]
: 各チャプターの開始を示すセクションヘッダ。TIMEBASE=1/1000
: タイムスタンプの単位。ここでは1ミリ秒 (1/1000秒) を指定しています。START
とEND
の値はこの単位で記述します。START
: チャプターの開始時間 (タイムベース単位)。END
: チャプターの終了時間 (タイムベース単位)。title
: チャプターのタイトル。
このチャプターファイルを使って動画にチャプターを埋め込むコマンドは以下のようになります。
bash
ffmpeg -i input.mp4 -i chapters.txt -map_chapters 1 -c copy output_with_chapters.mp4
-i input.mp4
: 元の動画ファイル(入力0)。-i chapters.txt
: チャプターファイル(入力1)。-map_chapters 1
: 入力ファイル1(chapters.txt
)からチャプター情報を取り出し、出力ファイルにマップします。-c copy
: 動画・音声ストリームはコピーします。
この方法で、動画ファイルに簡単にチャプターを追加したり、既存のチャプターを置き換えたりすることができます。
第5章:スクリプトと自動化
FFmpegの強力な点の1つは、コマンドラインツールであるため、シェルスクリプトなどと組み合わせて処理を自動化できることです。大量のファイルに対して同じメタデータ操作を行いたい場合に非常に役立ちます。
5.1 複数のファイルに対するメタデータ編集
例えば、あるフォルダ内のすべてのMP4ファイルに同じアーティスト名を設定したい場合、以下のようなBashスクリプトが考えられます。
“`bash
!/bin/bash
設定したいアーティスト名
ARTIST_NAME=”私の会社名”
現在のディレクトリにあるすべてのmp4ファイルをループ処理
for file in *.mp4; do
if [ -f “$file” ]; then # ファイルであることを確認
output_file=”${file%.mp4}_tagged.mp4″ # 出力ファイル名を生成 (例: input.mp4 -> input_tagged.mp4)
echo "Processing $file -> $output_file"
# FFmpegコマンドを実行
# 入力ファイルからすべてのメタデータをコピーし、artistのみ上書き
ffmpeg -i "$file" -c copy -map_metadata 0 -metadata artist="$ARTIST_NAME" "$output_file"
if [ $? -eq 0 ]; then # コマンドが成功したか確認
echo "Successfully tagged $file"
else
echo "Error tagging $file" >&2
fi
fi
done
echo “Processing complete.”
“`
for file in *.mp4; do ... done
: 現在のディレクトリにあるすべての.mp4
ファイルに対してループを実行します。if [ -f "$file" ]; then ... fi
: ループで取得した名前が実際のファイルであるかを確認します。output_file="${file%.mp4}_tagged.mp4"
: シェルスクリプトの機能を使って、元のファイル名に_tagged
を付け加えた新しいファイル名を生成します。ffmpeg -i "$file" ... "$output_file"
: 生成した入出力ファイル名を使ってFFmpegコマンドを実行します。変数を使うときはダブルクォートで囲むのが安全です。if [ $? -eq 0 ]; then ... fi
: 直前に実行したコマンドの終了ステータス$?
を確認します。0なら成功、それ以外ならエラーです。
このスクリプトを実行するには、テキストエディタで上記内容を記述し、例えば tag_videos.sh
として保存します。実行権限を与え (chmod +x tag_videos.sh
)、メタデータを編集したいファイルがあるディレクトリで ./tag_videos.sh
と実行します。
5.2 ffprobe
と組み合わせて動的なメタデータ編集
ffprobe
でファイルから情報を抽出し、その情報に基づいて ffmpeg
でメタデータを設定するという、より高度な自動化も可能です。
例えば、各動画ファイルの元のタイトルを取得し、そのタイトルの前に「Archive: 」という文字列を追加して新しいタイトルとして設定する、というスクリプトを考えます。
“`bash
!/bin/bash
現在のディレクトリにあるすべてのmp4ファイルをループ処理
for file in *.mp4; do
if [ -f “$file” ]; then
output_file=”${file%.mp4}_newtitle.mp4″
echo "Processing $file"
# ffprobeで元のタイトルを取得
# -v quiet: 余計な出力を抑える
# -show_entries format_tags=title: フォーマットタグからtitleを取得
# -of default=nk=1:nw=1: キー名と値のみを表示 (例: title=元のタイトル)
original_title=$(ffprobe -v quiet -show_entries format_tags=title -of default=nk=1:nw=1 "$file" | sed 's/title=//')
new_title="Archive: $original_title"
echo "Original Title: '$original_title'"
echo "New Title: '$new_title'"
# 新しいタイトルでFFmpegコマンドを実行
# 元の他のメタデータはコピーし、titleのみ上書き
ffmpeg -i "$file" -c copy -map_metadata 0 -metadata title="$new_title" "$output_file"
if [ $? -eq 0 ]; then
echo "Successfully set new title for $file"
else
echo "Error setting new title for $file" >&2
fi
fi
done
echo “Processing complete.”
“`
original_title=$(ffprobe ... | sed 's/title=//')
:ffprobe
の出力からタイトルを取得し、sed
コマンドを使って先頭のtitle=
部分を削除して値だけを抽出しています。その結果をoriginal_title
という変数に格納しています。new_title="Archive: $original_title"
: 抽出したタイトル文字列の前に「Archive: 」を付加して新しいタイトル文字列を生成します。ffmpeg ... -metadata title="$new_title"
: 生成した新しいタイトルを変数から読み込み、FFmpegコマンドで設定します。
このように、ffprobe
でメタデータを読み取り、シェルスクリプトの文字列操作や条件分岐と組み合わせることで、非常に柔軟かつ強力な自動処理を構築できます。
Windows環境でのスクリプト
WindowsのCommand PromptやPowerShellでも同様の処理は可能ですが、構文が異なります。例えばPowerShellの場合:
“`powershell
設定したいアーティスト名
$artistName = “私の会社名”
現在のディレクトリにあるすべてのmp4ファイルを処理
Get-ChildItem *.mp4 | ForEach-Object {
$file = $.FullName
$outputFile = $.BaseName + “_tagged.mp4”
Write-Host "Processing $file -> $outputFile"
# FFmpegコマンドを実行
# PowerShellでは引数を配列で渡すのが推奨される場合があるが、文字列でも多くの場合動作する
ffmpeg -i "$file" -c copy -map_metadata 0 -metadata artist="$artistName" "$outputFile"
if ($LASTEXITCODE -eq 0) {
Write-Host "Successfully tagged $file"
} else {
Write-Host "Error tagging $file"
-ForegroundColor Red
}
}
Write-Host “Processing complete.”
“`
ffprobe
の出力解析もPowerShellのコマンドレット (Select-String
, ConvertFrom-Json
など) を使って行うことができます。環境に合わせてスクリプトを記述してください。
第6章:よくある問題とトラブルシューティング
FFmpegでのメタデータ編集は強力ですが、いくつかの落とし穴や理解しておくと良い点があります。
6.1 設定したメタデータが表示されない
-
原因1:ビューアがそのメタデータ形式をサポートしていない。
- 特定のプレイヤーソフトウェアやOSのファイルプロパティは、すべてのコンテナ形式やメタデータタグに対応しているわけではありません。例えば、WindowsのエクスプローラはMP4やMP3の一般的なタグは表示しますが、MKVのタグは表示しないことがあります。
ffprobe
を使って、ファイルに実際にメタデータが書き込まれているかを確認するのが最も確実な方法です。ffprobe input_file.ext
を実行して、出力の中に設定したメタデータ(title
,artist
など)が表示されているか確認してください。
-
原因2:メタデータキーの名前が間違っている。
- コンテナによっては、特定のメタデータキー名しか認識しない、あるいは一般的なキー名とは異なる名前を使用していることがあります。例えば、QuickTime/MP4では
title
の代わりに\0xa9ttl
のようなアトム名が内部的に使われることがありますが、FFmpegは一般的なキー名へのマッピングを提供しています。しかし、まれに想定と異なる場合があります。 ffprobe
の出力を見て、既存のファイルでどのようなキー名が使われているかを確認してください。
- コンテナによっては、特定のメタデータキー名しか認識しない、あるいは一般的なキー名とは異なる名前を使用していることがあります。例えば、QuickTime/MP4では
-
原因3:コンテナ形式がそのメタデータに対応していない。
- AVIのような古いコンテナ形式は、メタデータのサポートが非常に限定的です。MP4, MKV, FLAC, Oggなどのモダンなコンテナ形式の方がメタデータサポートは豊富です。
- 使用しているコンテナ形式が、設定しようとしている種類のメタデータをサポートしているか確認してください。必要であれば、サポートの多いコンテナ形式(例:MP4やMKV)に変換することも検討してください(変換時には
-map_metadata 0
を忘れずに)。
-
原因4:メタデータが正しくマップされていない、または破棄されている。
- エンコードを行う際に
-map_metadata 0
オプションを付け忘れると、元のメタデータは引き継がれません。 - 誤って
-map_metadata -1
を指定しているかもしれません。
- エンコードを行う際に
6.2 メタデータ編集後にファイルが再生できなくなった、おかしくなった
-
原因1:
-c copy
が使えない操作だった。- ほとんどのメタデータ編集は
-c copy
で可能ですが、チャプター情報の編集など、コンテナ構造に大きな変更を伴う場合は、コンテナの再多重化 (remux) が必要になり、場合によっては-c copy
だけでは不十分なことがあります。非常にまれですが、特定のメタデータがコンテナの互換性を損なうこともゼロではありません。 -c copy
を使わず、コンテナだけを指定して再多重化してみてください(例:ffmpeg -i input.mkv -map 0 -c copy output.mp4
)。これにより、入力MKVのストリームをそのままMP4コンテナに詰め替えます。この過程でメタデータもコピーされるか確認し、必要であれば-map_metadata
オプションを併用します。
- ほとんどのメタデータ編集は
-
原因2:出力ファイル名が入力ファイル名と同じになっている。
- FFmpegは、入力ファイルと出力ファイルが同じ名前だと警告を出すか、エラーになるか、予期しない動作をする場合があります。出力ファイル名は必ず入力ファイル名と異なるものにしてください。
6.3 文字化けする
- 原因:メタデータの文字コードが正しくない。
- メタデータの文字列は、一般的にUTF-8で記述するのが推奨されます。古いファイルや特定のツールで作成されたファイルでは、Shift_JISや他のエンコーディングが使用されていることがあります。
- FFmpeg自体は多くのエンコーディングに対応していますが、使用しているターミナルやメタデータを確認するビューアがUTF-8以外のエンコーディングに対応していない場合、文字化けが発生します。
- メタデータファイル (
-i metadata.txt
) を作成する際は、必ずUTF-8エンコーディングで保存してください。 - コマンドラインで直接日本語などのマルチバイト文字をメタデータ値として指定する場合、使用しているOSやターミナルの設定によっては正しく扱えないことがあります。この場合も、外部ファイルからの読み込み (
-i metadata.txt -map_metadata 1
) が最も確実な方法です。
6.4 メタデータ編集に時間がかかる
- 原因:再エンコードが発生している。
-c copy
オプションを指定し忘れていませんか?-c copy
がない場合、FFmpegはデフォルトで再エンコードを試みます。これは非常に時間がかかります。- メタデータ編集 だけ が目的であれば、必ず
-c copy
を指定してください。ただし、前述のようにチャプター編集など、一部の操作ではコンテナの再構築に多少の時間がかかることがありますが、これは再エンコードに比べれば圧倒的に高速です。
6.5 特定のキー名が認識されない、または設定できない
- 原因1:コンテナ形式がそのキー名をサポートしていない。
- コンテナ形式によってサポートされるタグの種類は異なります。例えば、MP3 (ID3) では動画固有のタグ(例: 監督
director
)は通常サポートされません。MKVタグは非常に柔軟ですが、MP4/MOVタグは比較的固定されています。
- コンテナ形式によってサポートされるタグの種類は異なります。例えば、MP3 (ID3) では動画固有のタグ(例: 監督
- 原因2:FFmpegがそのキー名へのマッピングを持っていない。
- FFmpegは多くの一般的なメタデータキー名に対応していますが、すべての可能なキー名や、特定のマイナーなソフトウェアが使用する独自のキー名に対応しているわけではありません。
ffprobe
で既存のファイルにどのようなキー名で情報が入っているかを確認するのが第一歩です。もしFFmpegで設定したいキー名が見つからない場合、そのコンテナ/ストリームタイプに対してそのキー名での設定がFFmpegでサポートされていない可能性があります。
トラブルシューティングを行う際は、まず ffprobe
で対象ファイルのメタデータ構造を正確に把握すること、そして FFmpeg コマンドに -v debug
オプションを付けて詳細なログを確認することが重要です。ログには、FFmpegがメタデータをどのように解析し、処理しようとしているかの情報が含まれており、問題解決のヒントになることがあります。
第7章:メタデータ以外の補助情報
FFmpegで扱える情報の中には、厳密にはメタデータではないものの、ファイルに付随する重要な情報としてメタデータと関連付けられることがあるものがあります。
7.1 Disposition (配置フラグ)
各ストリームには「Disposition(配置)」と呼ばれるフラグを設定できます。これは、プレイヤーがそのストリームをどのように扱うべきかを示すヒントのようなものです。例えば、「デフォルトストリーム」「強制ストリーム」「コメンタリー」「クリーンエフェクト」「添付画像(カバーアート)」などのフラグがあります。
カバーアートの埋め込みの例 (-disposition:v:1 attached_pic
) で既に登場しましたが、これも ffmpeg
コマンドの -disposition[:stream_specifier] value
オプションで設定できます。
一般的な disposition フラグ:
default
: プレイヤーがデフォルトで選択すべきストリーム(例:デフォルト音声、デフォルト字幕)。複数のストリームにdefault
フラグを立てることも可能ですが、どのストリームが実際に選択されるかはプレイヤーの実装によります。通常は1つのタイプにつき1つだけ立てます。forced
: プレイヤーが強制的に表示すべきストリーム(例:聴覚障碍者向け字幕)。original
: オリジナルのストリーム。comment
: コメンタリーストリーム。lyrics
: 歌詞ストリーム(主に音声ファイル)。karaoke
: カラオケ用ストリーム。attached_pic
: 添付画像(カバーアートなど)。主にMP4やMKVで使用されます。
例:最初の音声ストリームをデフォルトに設定する
bash
ffmpeg -i input_multi_audio.mkv -c copy -disposition:a:0 default output_default_audio.mkv
既存の disposition フラグをクリアしたい場合は、-disposition:stream_specifier 0
または -disposition:stream_specifier none
を指定します。
“`bash
最初の映像ストリームのデフォルトフラグを解除
ffmpeg -i input.mp4 -c copy -disposition:v:0 none output_no_default_video.mp4
“`
これらの disposition フラグは、ファイルの再生体験に影響を与える重要な情報であり、メタデータ編集と合わせて管理することがよくあります。
7.2 プログラム情報 (Programs)
一部のコンテナ形式(MPEG-TSなど)では、「プログラム」という概念があります。これは、複数のストリーム(例えば、特定の言語の映像・音声・字幕のセット)をグループ化するための構造です。FFmpegでは、-program
オプションを使ってプログラムに関するメタデータを設定できます。
例:プログラムを作成し、メタデータを設定する(通常の使用ではあまり頻繁に使いません)
bash
ffmpeg -i input.ts -c copy -program 1: title="Program 1" -map 0:v:0 -map 0:a:0 -map 0:s:0 \
-program 2: title="Program 2" -map 0:v:0 -map 0:a:1 -map 0:s:1 \
output.ts
この例では、入力TSファイルから2つのプログラムを定義し、それぞれにタイトルを付け、異なる音声/字幕ストリームをマップしています。
7.3 Private Data (プライベートデータ)
コンテナやコーデックによっては、標準的なメタデータや設定項目に含まれない、特定の用途のためのプライベートなデータを格納できる場合があります。FFmpegはこれらのプライベートデータを全て直接操作するための汎用的なオプションを常に提供しているわけではありませんが、特定のフォーマットやコーデックに対して、対応するmuxer/demuxerオプションやbitstreamフィルターを通じてアクセスできる場合があります。これは非常に専門的なトピックであり、FFmpegのドキュメントや各フォーマット/コーデックの仕様を参照する必要があります。
結論:FFmpegでメタデータをマスターする
本記事では、FFmpegおよびその付属ツールであるffprobe
を使った動画・音声メタデータの理解と編集について、基礎から応用までを徹底的に解説しました。
- メタデータの重要性: ファイルの整理、識別、互換性において不可欠な情報であることを理解しました。
ffprobe
による確認:ffprobe
を使って、ファイルの構造や既存のメタデータを詳細に、様々な形式で抽出する方法を学びました。特に-show_entries
と-of
オプションが強力です。ffmpeg
による編集:-metadata
オプションを使ってコンテナレベルやストリームレベルのメタデータを設定・削除する方法、-map_metadata
オプションで既存のメタデータをコピー・破棄・外部ファイルから読み込む方法を習得しました。高速な処理には-c copy
が有効であることを確認しました。- 応用テクニック: カバーアートの埋め込みやチャプターマーカーの編集といった、より実践的なメタデータ操作の方法を学びました。
- 自動化: シェルスクリプトなどと組み合わせることで、大量のファイルを効率的に処理する方法を解説しました。
- トラブルシューティング: メタデータが表示されない、文字化けするといった一般的な問題の原因と解決策を示しました。
- 関連情報: Dispositionやプログラム情報といった、メタデータ以外の補助的な情報についても触れました。
FFmpegは非常に多機能なツールであり、その全てを習得するには時間がかかります。しかし、本記事で解説したメタデータに関する機能だけでも、あなたのメディアファイル管理ワークフローを劇的に改善させることが可能です。
最初は簡単なメタデータの設定から始め、慣れてきたら ffprobe
でより詳細な情報を引き出し、スクリプトを使った自動化に挑戦してみてください。FFmpegの公式ドキュメントは非常に詳細で正確な情報源ですが、網羅的であるため最初は読むのが大変かもしれません。本記事が、その広大な世界への足がかりとなれば幸いです。
FFmpegを使ったメタデータ管理をマスターし、あなたのデジタルメディアライブラリをより豊かに、より扱いやすくしましょう。