フィルタで扱う: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のコード。

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

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

metadataの指定方法。

  • metadata、metadata: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 input.mp4 -c:v libx264 -c:a copy -map_metadata 0:g -movflags use_metadata_tags -map_metadata 0 output.mp4

How to increase audio volume in a .mov file while preserving all original EXIF data and metadata using FFmpeg and possibly exiftool? : ffmpeg

動画にチャプターを追加する。もしくはffmetadata.iniに差し替える。
ffmpeg -i video.mp4 -i chapter.ini -map_metadata 1 -map_chapters 1 -c copy video_with_chapter.mp4

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

ffmpeg – How to remove tx3g stream from m4a file – Stack Overflow : web.archive.org
Changed behaviour of -map_metadata : ffmpeg

チャプターを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

特定言語の音声や字幕だけを出力するには-mapで個別に指定する。言語指定はISO 639-2形式の3文字指定。
ffmpeg -i input -map 0:v -map 0:a:m:language:eng -map 0:s:m:language:eng -c copy output

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

主音声と副音声にMPC-HCなどで表示される名前を追加する。
以下のコマンドは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

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

コンテナが対応していればside_data_listのrotationにメタデータを追加、編集し、再エンコードなしに反時計回りの度数指定で映像を回転できる。主な用途はスマホ、アクションカムなどで撮影した動画、画像の回転補正。
ffmpeg -display_rotation:v:0 90 -i input -c copy output.mp4

-display_hflip、-display_vflipが併用されたときは-display_rotationで回転した後に適用する。hflipは水平方向、vflipは垂直方向に回転する。
ffmpeg -display_rotation:v:0 90 -display_hflip -i input -c copy output.mp4

ffmpeg Documentation : Video Options

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

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

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

handler_nameを消す。
ffmpeg -i input -metadata:s:a:0 handler_name='' -empty_hdlr_name 1 -c copy output

How to stop ffmpeg from adding “handler_name” to metadata – Super User

iPhoneのメタデータ関係。
Convert iPhone videos and keep all metadata? : ffmpeg

公式ドキュメント: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のエンコード設定を表示

ffmpeg -hide_banner -i input.mp4 -vf showinfo=udu_sei_as_ascii=1 -frames:v 1 -f null -

x264のcabac以降の設定だけをinput.txtに出力
ffmpeg -hide_banner -i input -vf showinfo=udu_sei_as_ascii=1 -frames:v 1 -f null - 2>&1 | grep "User Data=x264" | sed "s/.*\(cabac=1.*\)/\1/" > input.txt

libx264やlibx265のエンコード設定を消す

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

FFmpeg Bitstream Filters Documentation : filter_units

-bsf:v filter_units=remove_types=6はH.264形式のclosed captions (EIA-608) を除くことができるが、MPEG-2では-bsf:v filter_units=remove_types=178を使うようだ。

ffmpeg – Removing EIA-608 Closed Captions from H.264 without reencode – Stack Overflow

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

libx265でエンコードしたファイルのエンコードオプションではなく、コンソール上に表示されるエンコードオプションを消す。
ffmpeg -i input -c:v libx265 -x265-params log-level=0 -c:a copy output.mp4

FFmpeg loglevel is quiet, but SVT-AV1 encoder still writes : ffmpeg

x265-info-removeを使うと.hevcファイルから消すことができる。mp4やmkvファイルは扱えない。
x265-info-remove all inputFile.hevc outputFile.hevc

Releases · HG3112/x265-info-remove
x265 – A question on -info and -repeat-headers – Doom9’s Forum

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

GPSメタデータを保持する

FFmpegではiPhoneなどのすべてのメタデータを扱えないのでexiftoolを使う。

exiftool -m -overwrite_original -api LargeFileSupport=1 -Keys:All= -tagsFromFile input.MOV -Keys:All output.mov

ExifTool by Phil Harvey
Convert iPhone videos and keep all metadata? : ffmpeg

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

コメントを残す

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

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