フィルタで扱う:Meta | ニコラボ
色空間など:色関係の設定のまとめ
カバーアート:mp4, mp3, flacにカバーアートを付ける

特徴

  • メタデータは直接コマンドに書き込むと、メタデータを書き込んだファイルを読み込む2種類の方法がある
  • メタデータファイルは UTF-8 でエンコードされた INI 形式のテキストファイルで構成される
  • ファイル読み込みの場合にはヘッダに識別番号を付けてコマンドに識別番号を指定する
  • メタデータの指定方法はkey=value
  • チャプターやストリーム毎にメタデータを指定できる
  • 先頭に [CHAPTER] や [STREAM] を宣言してチャプターやストリームを指定する
  • チャプターでタイムベースを指定できる。指定していない場合はミリ秒とする
    • 例:TIMEBASE=num/den
      チャプターの開始と終了の時間を指定する。演算はできないので予め計算しておく(数値は正の整数)
    • 例:START=num, END=num
  • コメントには “;” , “#” が使える
  • 特殊文字(“=”, “;”, “#”, “” と改行)はバックスラッシュ()でエスケープする

チャプターをつくるPythonスクリプト

How to Add Chapters to MP4s with FFmpeg – Kyle Howellsより時間とチャプター名からチャプターをつくるPythonスクリプト。

開始時間のChapters.txtを作成。

0:23:20 Start
0:40:30 First Performance
0:40:56 Break
1:04:44 Second Performance
1:24:45 Crowd Shots
1:27:45 Credits

helper.pyのコード。

import re
chapters = list()
with open('chapters.txt', 'r') as f:
for line in f:
x = re.match(r"(\d):(\d{2}):(\d{2}) (.*)", line)
hrs = int(x.group(1))
mins = int(x.group(2))
secs = int(x.group(3))
title = x.group(4)
minutes = (hrs * 60) + mins
seconds = secs + (minutes * 60)
timestamp = (seconds * 1000)
chap = {
"title": title,
"startTime": timestamp
}
chapters.append(chap)
text = ""
for i in range(len(chapters)-1):
chap = chapters[i]
title = chap['title']
start = chap['startTime']
end = chapters[i+1]['startTime']-1
text += f"""
[CHAPTER]
TIMEBASE=1/1000
START={start}
END={end}
title={title}
"""
with open("FFMETADATAFILE", "a") as myfile:
myfile.write(text)
view raw helper.py hosted with ❤ by GitHub

以下を実行すると、FFMETADATAFILEが作成される。下のコマンドでは.ini拡張子がついているのでそれを外せばmp4にチャプターを付けられる。
python helper.py

メタデータ(チャプター)ファイルの例。

;FFMETADATA1
major_brand=M4V
minor_version=0
compatible_brands=M4V M4A mp42mp41isom
encoder=Lavf58.22.100
[CHAPTER]
TIMEBASE=1/10000000
START=0
END=610200000
title=Avant
[CHAPTER]
TIMEBASE=1/10000000
START=610200000
END=1510270000
title=Opening
[CHAPTER]
TIMEBASE=1/10000000
START=1510270000
END=6540710000
title=A Part
[CHAPTER]
TIMEBASE=1/10000000
START=6540710000
END=12438690000
title=B Part
[CHAPTER]
TIMEBASE=1/10000000
START=12438690000
END=13830080000
title=Ending
[CHAPTER]
TIMEBASE=1/10000000
START=13830080000
END=14351133330
title=C Part

metadataの指定方法。

  • metadatametadata:gならグローバル値
  • metadata:s:vならストリーム部の映像のすべて
  • metadata:s:a:0ならストリーム部の音声の1番目だけ
  • metadata:s:s:1ならストリーム部の字幕の2番目だけ

2ファイル以上で-metadataでメタデータを追加するには-mapでストリームを選択した順番が-metadataの指定順になる。

コマンド例

出力コンテナによっては表示されないメタデータがあるので以下の表を参考にする。

ファイルに追加されているメタデータを出力する。
ffmpeg -i input -f ffmetadata ffmetadata.ini

動画にチャプターを追加する。
ffmpeg -i video.mp4 -i chapter.ini -map_metadata 1 -map_chapters 1 -c copy video_with_chapter.mp4

逆についているチャプターを削除するには-map_chapters -1にする。
ffmpeg -i video.mp4 -map_chapters -1 -c copy video_without_chapter.mp4

ffmpeg – How to remove tx3g stream from m4a file – Stack Overflow

チャプターをXML形式で出力する。
ffprobe -i input -show_chapters -of xml > chapters.xml

ffprobe の使い方

ファイルに追加されているすべてのメタデータを出力する。
ffmpeg -i input -map_metadata 0 -map_metadata:s:v 0:s:v -map_metadata:s:a 0:s:a -c copy -f ffmetadata ffmetadata.txt

メタデータを直接コマンドで指定する。
ffmpeg -i input -metadata "key"="value" -c copy output

タイトルを付ける。
ffmpeg -i input -metadata "title"="hogehoge" -c copy output

最初の値はグルーバル値に、2番目の値はすべての映像ストリームに、3番目の値は最初の音声ストリームだけに指定する。
ffmpeg -i input -metadata key1=value1 -metadata:s:v key2=value2 -metadata:s:a:0 key3=value3 -c copy out.mkv

メタデータファイルをファイルに追加する。
ffmpeg -i input -i ffmetadata.ini -map_metadata 1 -c copy output

主音声と副音声に MPC-HC などで表示される名前を追加する。言語指定はISO 639-2形式の3文字指定
以下のコマンドは1入力に映像と主音声があり、2入力に副音声を入力する場合。2入力は映像と音声付きの動画でも可能。
ffmpeg -i video+audio.mp4 -i sub-audio.m4a -map 0 -map 1:a -metadata:s:a:0 language="jpn" -metadata:s:a:0 title="main" -metadata:s:a:1 language="eng" -metadata:s:a:1 title="dub" -c copy output.mp4

さらに日本語と英語の字幕を追加する。ass 字幕は mp4 コンテナには入れられない。
ffmpeg -i video+audio.mp4 -i sub-audio.m4a -i subtitle-jpn.ass -i subtitle-eng.ass -map 0 -map 1:a -map 2 -map 3 -metadata:s:a:0 language="jpn" -metadata:s:a:0 title="main" -metadata:s:a:1 language="eng" -metadata:s:a:1 title="dub" -metadata:s:s:0 language="jpn" -metadata:s:s:1 language="eng" -c copy -c:s ass output.mkv

mp4 に入れるなら mov_text 字幕を使う。
ffmpeg -i movie.mp4 -i subtitle-jpn.ass -i subtitle-eng.ass -map 0 -map 1 -map 2 -metadata:s:a:0 language="jpn" -metadata:s:a:0 title="main" -metadata:s:s:0 language="jpn" -metadata:s:s:1 language="eng" -c copy -c:s mov_text output.mp4

グローバル値の encoder 名を書き換える。通常なら Lavf58.30.100 のようになる。
ffmpeg -i input -metadata:g encoding_tool=myapp -c copy output.mp4

回転のメタデータをつける。ビューワが対応していれば指定した値で回転する。
ffmpeg -i input -metadata:s:v:0 rotate="90" -c copy output.mp4

エンコードするときにメタデータを見て自動で回転させないには-noautorotateをつける。
ffmpeg -noautorotate -i input -c:a copy output.mp4

ffmpeg – mp4 And Rotation – Remove Flags But Set Rotation – Stack Overflow

回転のメタデータをつける。0度にすれば回転しない。
ffmpeg -i input -metadata:s:v:0 rotate="0" -c copy output.mp4

Rotation Metadata in Video Files Created by Mobile Devicesより。

スマホと回転メタデータの関係

H.264のCodec IDをisom (isom/iso2/avc1/mp41)からmp42(isom/iso2/avc1/mp41)に変更する。
ffmpeg -i input.mp4 -c copy -brand mp42 output.mp4

H.265のCodec IDをhev1からhvc1に変更する。
ffmpeg -i input.mp4 -c copy -tag:v hvc1 output.mp4

MP4にはiTunes tagsのメタデータの制限があるので-movflags +use_metadata_tagsをつけると任意のタグをつけられる。
video – How to add new — and non-defined — metadata to an MP4 file? – Super User

MP4に任意のメタデータを追加する。
ffmpeg -i input.mp4 -c copy -metadata xyz="+22.9835+113.3621/" -metadata com.android.version=1 -metadata com.android.manufacturer="Xiaomi" -metadata com.android.model="Mi 10 Pro" -movflags +use_metadata_tags output.mp4

メタデータの削除。
ffmpeg -i input -map_metadata -1 -c copy output

ffmpeg metadata copy (all) – Stack Overflow

公式ドキュメント:FFmpeg Formats Documentation : Metadata

メタデータの対応表

グローバル値(-metadata:g foo=bar)につけて結果を調べているが一部ストリーム値で指定している。

ffmpegのkey設定 mp4 mp3 ts ffmpeg の表示例 mediainfo の表示例
album String ✔ ✔ ✔ album Album
album_artist String ✔ ✔ ✔ album_artist Album/Performer
artist String ✔ ✔ ✔ artist Performer
author String ✔ author author
comment String ✔ ✔ ✔ comment Comment
compatible_brands String ✔ compatible_brands compatible_brands
composer String ✔ ✔ ✔ composer Composer
copyright String ✔ ✔ ✔ copyright Copyright
date String ✔ ✔ ✔ date Recorded date
description String ✔ ✔ ✔ description Description
disc String ✔ disc Part/Position
encoded_by String ✔ encoded_by Encoded by
Encoding settings String ✔ Encoding settings Encoding settings
encoding_tool String ✔ encoder Writing application
episode_id String ✔ episode_id episode_id
episode_id String ✔ ✔ episode_id Part_ID
episode_sort int8 ✔ ✔ episode_sort part
gapless_playback int8 ✔ ✔ gapless_playback
genre String ✔ ✔ ✔ genre Genre
grouping String ✔ ✔ ✔ grouping Grouping
hd_video int8 ✔ ✔ hd_video hd_video
location String ✔ location location
language String ✔ ✔ ✔ language Language
lyrics String ✔ lyrics USLT
lyrics String ✔ ✔ lyrics Lyrics
make String ✔ make make
media_type int8 ✔ ✔ media_type
model String ✔ model model
network int8 ✔ network network
network int8 ✔ ✔ network TVNetworkName
publisher String ✔ publisher Publisher
season_number int8 ✔ ✔ season_number Season
service_name String ✔ service_name Service name
service_provider String ✔ service_provider Service provider
show String ✔ show show
show String ✔ show Movie name
show String ✔ show Collection
synopsis String ✔ synopsis synopsis
synopsis String ✔ ✔ synopsis LongDescription
TBPM String ✔ TBPM BPM
TIT1 String ✔ TIT1 Grouping
TIT3 String ✔ TIT3 Track name/More
title String ✔ ✔ title Movie name
title String ✔ title Track name
TKEY String ✔ TKEY Initial key
track int8 ✔ track Track name/Position

関連記事

libx264やlibx265で使ったエンコードオプションを消す

libx264はエンコードした後のファイルでも消すことができる。
ffmpeg -i 264.mp4 -bsf:v filter_units=remove_types=6 -c copy output.mp4

FFmpeg Bitstream Filters Documentation : filter_units

NALについて。

libx265はエンコードした後のファイルでは消すことができないのでエンコードするときに非表示にする。
ffmpeg -i input -c:v libx265 -x265-params no-info=1 -c:a copy output.mp4

ffmpeg – How to Remove a frame from an HEVC bitstream? – Stack Overflow

HDR10+/Dolby Visionのメタデータを消す

ffmpeg -i input.mkv -bsf:v filter_units=remove_types=39 -c copy output.mkv

Dropping HDR10+/Dolby Vision metadata : ffmpeg

Atomsのメタデータを消す

Dolby TrueHDを保持したままAtomsのメタデータを消す。
ffmpeg -i Atmos.thd -bsf:a truehd_core -c:a copy No-Atmos.thd

Atomsのメタデータを消してac3にエンコードする。
ffmpeg -i Atmos.thd -c:a ac3 -b:a 640k -center_mixlev 0.707 No-Atmos5.1.ac3

Down Sizing ATMOS or TrueHD 7.1 [Archive] – Doom9’s Forum

One thought on “ffmpeg でメタデータを加える”

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)