Knowledge Base

Preserving for the future: Shell scripts, AoC, and more

split-on-chapters.sh (Source)

#!/bin/sh
# File: split-on-chapters.sh
# Location: /mnt/public/Support/Programs/DVDs
# Author: bgstack15
# Startdate: 2024-02-17-7 14:22
# Title: Split mkv on chapters
# Purpose: oneliner for splitting mkv file into separate files per chapter
# History:
#    2024-02-22 moved -ss and -to before -i
# Usage:
# Reference:
#    man ffmpeg
#    slightly improved over https://superuser.com/questions/795373/split-mkv-based-on-chapters
#    https://superuser.com/questions/795373/split-mkv-based-on-chapters/1830690#1830690
#    https://stackoverflow.com/questions/14005110/how-to-split-a-video-using-ffmpeg-so-that-each-chunk-starts-with-a-key-frame/33188399#33188399
# Improve:
# Dependencies:
# Documentation:
#    This is insufficient:
#       HandBrakeCLI -c 2 -i twoeps.mkv -o 2.mkv # this does not get subtitles, and reencodes which takes a while
#   WARNING! Jellyfin+chromecast might malfunction on a video split in this manner, within the first few seconds of playback, because of the keyframe/chapter mismatch.
split_by_chapter() {
   for word in "${@}" ;
   do
      ffmpeg -i "${word}" 2>&1 | sed -n -r -e "/start.*end.*[0-9]*/{s/.*#[0-9]*:([0-9]*).* ([0-9]*\.[0-9]*).*( [0-9]*\.[0-9]*)/ffmpeg -ss \2 -to\3 -i ${word} -acodec copy -vcodec copy -scodec copy ${word%%.mkv}-chapter\1.mkv \;/g;p;}"
   done
}
split_by_chapter "${@}"