動画ファイルのメタデータ5 -チャプター追加(FFmpeg-Python)-

2026-08-26

動画

動画ファイルのメタデータ3 -チャプター追加(XMedia Recode)-
動画ファイルのメタデータ4 -チャプター追加(FFmpeg)- の続き

関連記事
  1. 動画ファイルのメタデータ1 -確認方法-
  2. 動画ファイルのメタデータ2 -縦横変更方法(FFmpeg)-

前記事で参考情報1に従って、FFmpegを使い動画ファイルにチャプターを付加(メタデータだけ付加して再エンコードなし)できた。ただ、参考情報1にはPythonスクリプトを使ってチャプター情報(テキストファイル)の作成を簡単にする方法が書いてあるのでやってみた。
基本真似しただけだが、参考情報1のWebがなくなった場合に備えてコードもコピーしておく。問題あったらコメントでご指摘ください。
ただし日本語タイトルに供えて、UTF-8の設定等を変更している

必要条件等(参考情報1に記載の内容+α)
  • 'chapters.txt'(チャプターの設定ファイル)と'FFMETADATAFILE'(元の動画ファイルからメタデータを書き出したもの)(と動画ファイル)は同じフォルダにあること
    (ファイル名もそのまま。Pythonスクリプトに埋め込まれている)
    (ややこしので、Pythonのスクリプトと動画ファイル、'chapters.txt'、'FFMETADATAFILE'は同じフォルダに置く)
  • 1行に、H:MM:SS形式の時刻と(スペースを空けて)タイトルが記入されていること。
    UTF-8形式
  • 出力は、元のFFMETADATAFILEに追加される
  • 元の動画にはチャプターがないこと
  • It expects an final END chapter which is ignored, but provides the end point for the last real chapter.
    (意味がよくわからないけどたぶん)最後の行のチャプターは無視されるが、実際のチャプター(最後から2行目のチャプター)の終了時間を提供するためにある

FFMETADATAFILE作成
ffmpeg -i INPUT.mp4 -f ffmetadata FFMETADATAFILE 
できたファイル(FFMETADATAFILE)の中身は以下

 

;FFMETADATA1
major_brand=mp42
minor_version=0
compatible_brands=isommp42
encoder=Lavf61.7.100


チャプターデータ作成
以下のようなファイルを作成。参考情報1とちょっと違うけど、これがよさそう

 

00:00:00
00:01:24 タイトル1
00:04:32 タイトル2
00:42:15 dummy
* 00:00:00はタイトルなしだが、00:00:00の後ろにスペースあり。スクリプトの正規表現のマッチングのため必要 
* 最後の行は、動画の長さ時間。タイトル2のチャプターの終わりの時刻を記載するためのもので、dummyというタイトルは記入されない

Pythonスクリプト
参考情報1から以下を修正 
・UTF-8を指定(日本語対応のため)  
・時間が2桁であった場合に対応(10時間以上の動画はないと思うけど) 
・ファイル名は"FFmpegChapter.py"にした

 

import re
chapters = list()

with open('chapters.txt', 'r', encoding='utf-8') as f:
   for line in f:
      print(line)
      x = re.match(r"(\d{1,2}):(\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", encoding='utf-8') as myfile:
    myfile.write(text)

Pythonスクリプトを実行して、チャプターを追加したFFMETADATAFILEを作成

python FFmpegChapter.py
*スクリプト、動画ファイル、'chapters.txt'、'FFMETADATAFILE'は同じフォルダに置いて実行する。 
できたファイル(FFMETADATAFILE)の中身は以下

 

;FFMETADATA1
major_brand=mp42
minor_version=0
compatible_brands=isommp42
encoder=Lavf61.7.100

[CHAPTER]
TIMEBASE=1/1000
START=0
END=83999
title=

[CHAPTER]
TIMEBASE=1/1000
START=84000
END=271999
title=タイトル1

[CHAPTER]
TIMEBASE=1/1000
START=272000
END=2534999
title=タイトル2


FFmpegで動画ファイルにメタデータ(FFMETADATAFILE)を追加
ffmpeg -i INPUT.mp4 -i FFMETADATAFILE -map_metadata 1 -codec copy OUTPUT.mp4

結果確認
  • ffmpegでメタデータ書き出し
    ffmpeg -i OUTPUT.mp4 -f ffmetadata FFMETADATAFILE_OUTPUT
    できたファイルの中身は以下

    ;FFMETADATA1
    major_brand=isom
    minor_version=512
    compatible_brands=isomiso2avc1mp41
    encoder=Lavf61.7.100
    [CHAPTER]
    TIMEBASE=1/1000
    START=0
    END=84000
    title=
    [CHAPTER]
    TIMEBASE=1/1000
    START=84000
    END=272000
    title=タイトル1
    [CHAPTER]
    TIMEBASE=1/1000
    START=272000
    END=2534999
    title=タイトル2
    
    
  • MPC-BEのプロパティー確認

確かにチャプターが付加できている。
最後に実際に再生して確認する。