Đây là giải pháp của tôi, nó hoạt động tốt trên ubfox-16.04.02-LTS. Nó dựa trên một giải pháp được đăng khác nhưng đã cải thiện việc xử lý các chương và các tệp được tạo cho mỗi chương.
Đây là một thực thi mẫu:
$ mkv-split-chapters some-mkv-file.mkv
Filename: some-mkv-file
Extension: mkv
Filedir: .
ffmpeg -i some-mkv-file.mkv -ss 0.000000 -to 394.800000 -acodec copy -vcodec copy ./some-mkv-file-#00.mkv
[...]
ffmpeg -i some-mkv-file.mkv -ss 394.800000 -to 767.160000 -acodec copy -vcodec copy ./some-mkv-file-#01.mkv
[...]
ffmpeg -i some-mkv-file.mkv -ss 757.160000 -to 1216.720000 -acodec copy -vcodec copy ./some-mkv-file-#02.mkv
[...]
Đây là kịch bản:
$ cat /usr/local/bin/mkv-split-chapters
#!/bin/bash
file="$1"
if [ -z "$file" ]; then
echo "Missing file argument!"
exit 1
fi
filename=$(basename "$file")
fileextension="${filename##*.}"
filename="${filename%.*}"
filedir=$(dirname "$file")
echo "Filename: $filename"
echo "Extension: $fileextension"
echo "Filedir: $filedir"
ffmpeg -i $file 2>&1 | grep 'Chapter' | grep 'start' | grep ', end' | awk "{
chapter=\$2
# replace : with nil
gsub(/:/, \"\", chapter)
start=\$4
# remove everything but 0-9.
gsub(/[^0123456789\.]/, \"\", start)
end=\$6
command=sprintf(\"ffmpeg -i $file -ss %s -to %s -acodec copy -vcodec copy $filedir/$filename-%s.$fileextension\n\", start, end, chapter)
print(command)
system(command)
}"
Kịch bản cũng có sẵn ở đây:
https://github.com/dpsenner/mkv-split-ch chương