Não consigo encontrar uma maneira confiável de fazer isso com o ffmpeg / avconv - mas posso encontrar uma maneira de fazer isso com HandBrakeCLI .
HandBrakeCLI -c 3 -i whatever.mkv -o 3.mkv
Extrairá o capítulo 3 de um mkv
.
Eu tenho um arquivo MKV longo que quero dividir em seus capítulos individuais.
A execução de ffmpeg -i long.mkv
fornece todas as informações sobre os capítulos incorporados no arquivo:
Duration: 01:23:45.80, start: 0.000000, bitrate: 8116 kb/s
Chapter #0.0: start 0.000000, end 235.000000
Metadata:
title : Chapter 01
Chapter #0.1: start 235.000000, end 450.160000
Metadata:
title : Chapter 02
Chapter #0.2: start 450.160000, end 789.400000
...
Existem 10 capítulos no arquivo - eu quero terminar com 10 arquivos separados.
Parece que -map_chapters
pode ser algo semelhante, mas não consigo encontrar nenhuma documentação sobre isso.
vídeo mkv dividido por capítulos usando o mkvmerge
mkvmerge -o output.mkv --split chapters:all input.mkv
solução de força bruta, hehe:
ffmpeg -i long.mkv | grep 'start.*end.*[0-9]*' | sed -r 's/.*#[0-9]\.([0-9]*).* ([0-9]*\.[0-9]*).*( [0-9]*\.[0-9]*)/ ffmpeg -i long.mkv -ss -to -acodec copy -vcodec copy chapter.mkv/g;'
Você pode adicionar xargs para executar a saída no estilo cowboy:
| xargs -I cmd bash -c 'cmd'
Esta é a minha solução, funciona bem no ubuntu-16.04.02-LTS. Ele é baseado em outra solução publicada, mas melhorou o manuseio de capítulos e os arquivos gerados para cada capítulo.
Esta é uma execução de exemplo:
$ 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
[...]
Este é o script:
$ 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=\
# replace : with nil
gsub(/:/, \"\", chapter)
start=\
# remove everything but 0-9.
gsub(/[^0123456789\.]/, \"\", start)
end=\
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)
}"
O script também está disponível aqui: