ムービーファイルから特定のチャプターだけを抜き出す方法

mp4などの動画ファイルから,特定の章(チャプター)を切り出す方法です.

切り出しはffmpegを使うと簡単かつ高速です.音声・画質の劣化もありません.

手順1) チャプター情報の確認

ffmpeg付属のffprobeコマンドを使いチャプターの一覧を確認します

$ ffprobe -i 動画ファイル名 

チャプターの一覧は次のような書式になります

  Chapters:
    Chapter #0:0: start 開始時刻, end 終了時刻
      Metadata:
        title           : タイトル1
    Chapter #0:0: start 開始時刻, end 終了時刻
      Metadata:
        title           : タイトル2

これでチャプターを抽出したいチャプターの開始時刻,終了時刻を確認します

手順2) 切り出し

開始時刻,終了時刻を指定して,ffmpegコマンドを使います

$ ffmpeg  -ss 開始時刻  -to 終了時刻  -i 元動画のファイル名 -c copy -map 0 -map_chapters -1  新しい動画のファイル名

"-c copy"で,動画の再圧縮なしで新しい動画を作成します.これで画像・音声の劣化は回避できます

補足

シェルスクリプトで上記処理を自動化する際は"-show_chapters"や " -print_format csv " オプションを使うと便利です

$ ffprobe -i 元動画のファイル名 -show_chapters

"-show_chapters"を付与すると,以下の出力が得られます

[CHAPTER]
id=0
time_base=1/10000000
start=開始時刻(単位 time_base)
start_time=開始時刻(単位 秒)
end=終了フレーム番号(単位 time_base)
end_time=終了時刻(単位 秒)
TAG:title=タイトル
[/CHAPTER]

ffprobeは詳細情報を大量に /dev/stderr に出力します."2>/dev/null"をつけます

$ ffprobe -i 元動画のファイル名 -show_chapters 2>/dev/null


さらに"-print_format csv"をつけると,カンマ(,)区切りのテキスト形式に書式が変わります

$ ffprobe -i 元動画のファイル名 -show_chapters -print_format csv 2>/dev/null

シェルスクリプトの場合はcutコマンドでパースすると良いでしょう

$ ffprobe -I 元動画のファイル名 -show_chapters -print_format csv  2>/dev/null  | cut -d ',' -f "5,7,8"
$ ffprobe -I 元動画のファイル名 -show_chapters -print_format csv  2>/dev/null  \
    | cut -d ',' -f "5,7,8" \
    | sed -e 's|,| |g' \
    | while read start end title; do 
   echo $start  $end $title
done