Policy of Truth

~ただしいことを信条にしたらあかん~

mp4ファイルにチャプタを打つ

車で見るようにスペースシャワーのランキング番組をmp4に変換してるんだけど…
番組自体が2時間とか3時間とかあるので、選曲とかが難しい…
チャプタとかが打ってあれば適当にスキップできるからね。

ということで、スキップ用にチャプタをつける作業をしてみた。
1.無音区間を見つる(FFmpegを使う)

ffmpeg -i input.mp4 -af silencedetect=noise=-30dB:d=4 -f null - 2> silencedetect.log

・noiseは無音判定の閾値(-30dB以下を無音とみなす)
・dは無音状態が続く最低秒数(4秒以上の無音を検出)
・無音区間のデータはsilencedetect.logに書き出す。

こんな感じです。検出時間は2秒だと検出数が多すぎる。4秒だと曲間で引っかからないことあるけど。まぁよし。

2.無音データを編集する

[silencedetect @ 0x592249e9cd80] silence_start: 419.799trate=N/A speed=30.2x
[silencedetect @ 0x592249e9cd80] silence_end: 429.216 | silence_duration: 9.41671
[silencedetect @ 0x592249e9cd80] silence_start: 729.155trate=N/A speed=27.8x
[silencedetect @ 0x592249e9cd80] silence_end: 745.09 | silence_duration: 15.9356
[silencedetect @ 0x592249e9cd80] silence_start: 1040.16trate=N/A speed=27.3x
[silencedetect @ 0x592249e9cd80] silence_end: 1063.42 | silence_duration: 23.2562
[silencedetect @ 0x592249e9cd80] silence_start: 1247.69trate=N/A speed=26.8x
[silencedetect @ 0x592249e9cd80] silence_end: 1265.09 | silence_duration: 17.395

こんな感じで、無音のスタートとエンドの秒数が書かれたデータがsilencedetect.logにできる。

今回はこのエンドのポイントにチャプターを打つことにするので、silence_endだけをまとめたテキストを作成。

[silencedetect @ 0x5fd1ebb84f00] silence_end: 429.216 | silence_duration: 9.41671
[silencedetect @ 0x5fd1ebb84f00] silence_end: 745.09 | silence_duration: 15.9356
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1063.42 | silence_duration: 23.2562
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1265.09 | silence_duration: 17.3959
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1955.02 | silence_duration: 9.70956
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1966.82 | silence_duration: 5.96956
[silencedetect @ 0x5fd1ebb84f00] silence_end: 1974.17 | silence_duration: 7.34687

3.FFmpeg用のチャプタファイルを作成
FFmpegに読み込ませるチャプタファイルを作成する。書式はこんな感じ。

;FFMETADATA1

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

[CHAPTER]
TIMEBASE=1/1000
START=429216
END=745090
title=Chapter 2

[CHAPTER]
TIMEBASE=1/1000
START=745090
END=1063420
title=Chapter 3

実際には2で作成した、silence_endだけをまとめたテキストをAIにチャプタ情報ファイルを生成して
とお願いすれば簡単につくれる。chapters.txtとして用意しておく。

4.FFmpeg用のチャプタファイルを作成

ffmpeg -i input.mp4 -i chapters.txt -map_metadata 1 -codec copy output_with_chapters.mp4

これでinput.mp4にチャプタを打ったoutput_with_chapters.mp4が出来上がります。