-
-
Save KorvinSilver/f3357c31a5c81050928fd0b170019c6f to your computer and use it in GitHub Desktop.
Use ffmpeg to split file by chapters. Python version and bash version
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Author: http://crunchbang.org/forums/viewtopic.php?id=38748#p414992 | |
# m4bronto | |
# Chapter #0:0: start 0.000000, end 1290.013333 | |
# first _ _ start _ end | |
while [ $# -gt 0 ]; do | |
ffmpeg -i "$1" 2> tmp.txt | |
while read -r first _ _ start _ end; do | |
if [[ $first = Chapter ]]; then | |
read # discard line with Metadata: | |
read _ _ chapter | |
ffmpeg -vsync 2 -i "$1" -ss "${start%?}" -to "$end" -vn -ar 44100 -ac 2 -ab 128 -f mp3 "$chapter.mp3" </dev/null | |
fi | |
done <tmp.txt | |
rm tmp.txt | |
shift | |
done |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
import os | |
import re | |
import subprocess as sp | |
from subprocess import * | |
from optparse import OptionParser | |
def parseChapters(filename): | |
chapters = [] | |
command = [ "ffmpeg", '-i', filename] | |
output = "" | |
try: | |
# ffmpeg requires an output file and so it errors | |
# when it does not get one so we need to capture stderr, | |
# not stdout. | |
output = sp.check_output(command, stderr=sp.STDOUT, universal_newlines=True) | |
except CalledProcessError, e: | |
output = e.output | |
for line in iter(output.splitlines()): | |
m = re.match(r".*Chapter #(\d+:\d+): start (\d+\.\d+), end (\d+\.\d+).*", line) | |
num = 0 | |
if m != None: | |
chapters.append({ "name": m.group(1), "start": m.group(2), "end": m.group(3)}) | |
num += 1 | |
return chapters | |
def getChapters(): | |
parser = OptionParser(usage="usage: %prog [options] filename", version="%prog 1.0") | |
parser.add_option("-f", "--file",dest="infile", help="Input File", metavar="FILE") | |
(options, args) = parser.parse_args() | |
if not options.infile: | |
parser.error('Filename required') | |
chapters = parseChapters(options.infile) | |
fbase, fext = os.path.splitext(options.infile) | |
for chap in chapters: | |
print "start:" + chap['start'] | |
chap['outfile'] = fbase + "-ch-"+ chap['name'] + fext | |
chap['origfile'] = options.infile | |
print chap['outfile'] | |
return chapters | |
def convertChapters(chapters): | |
for chap in chapters: | |
print "start:" + chap['start'] | |
print chap | |
command = [ | |
"ffmpeg", '-i', chap['origfile'], | |
'-vcodec', 'copy', | |
'-acodec', 'copy', | |
'-ss', chap['start'], | |
'-to', chap['end'], | |
chap['outfile']] | |
output = "" | |
try: | |
# ffmpeg requires an output file and so it errors | |
# when it does not get one | |
output = sp.check_output(command, stderr=sp.STDOUT, universal_newlines=True) | |
except CalledProcessError, e: | |
output = e.output | |
raise RuntimeError("command '{}' return with error (code {}): {}".format(e.cmd, e.returncode, e.output)) | |
if __name__ == '__main__': | |
chapters = getChapters() | |
convertChapters(chapters) | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
ffmpeg -i "$SOURCE.$EXT" 2>&1 \ # get metadata about file | |
| grep Chapter \ # search for Chapter in metadata and pass the results | |
| sed -E "s/ *Chapter #([0-9]+.[0-9]+): start ([0-9]+.[0-9]+), end ([0-9]+.[0-9]+)/-i \"$SOURCE.$EXT\" -vcodec copy -acodec copy -ss \2 -to \3 \"$SOURCE-\1.$EXT\"/" \ # filter the results, explicitly defining the timecode markers for each chapter | |
| xargs -n 11 ffmpeg # construct argument list with maximum of 11 arguments and execute ffmpeg |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment