Перейти к содержимому

Сплит MKV на основе глав

6

У меня есть длинный файл MKV, который я хочу разделить на отдельные главы.

Запуск ffmpeg -i long.mkvдает мне всю информацию о главах, встроенных в файл:

 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 ... 

В файле 10 глав - я хочу получить 10 отдельных файлов.

Похоже, что- -map_chaptersто похожее - но я не могу найти документацию по этому вопросу.

12 204 просмотра
Terence Eden спросил 12 лет назад
T 411

4 ответа

14

разделить MKV видео по главам, используя MKVMERGE

mkvmerge -o output.mkv --split chapters:all input.mkv 

https://www.bunkus.org/videotools/mkvtoolnix/doc/mkvmerge.html

удивительно, спасибо

chiliNUT · 10 лет назад · 0

К сожалению, поскольку MKVmerge может разбиваться только на ключевые кадры, это работает только в том случае, если есть ключевой кадр в то же время, что и время главы для каждой главы. Если нет, некоторые или все ваши главы будут содержать части других глав. До сих пор не найдено решение, которое работает в точное время независимо от ключевых кадров.

Natsukane · 7 лет назад · 0

Вы можете попробовать Avidemux разделить ключевые кадры (внутри GOP).

Endoro · 7 лет назад · 0
Endoro ответил 11 лет назад
E 1 703
5
Принятый ответ

Я не могу найти надежный способ сделать это с помощью ffmpeg / avconv - но я могу найти способ сделать это с HandBrakeCLI .

 HandBrakeCLI -c 3 -i whatever.mkv -o 3.mkv 

Извлечу главу 3 из mkv.

Terence Eden ответил 12 лет назад
T 411
3

Решение проблемы грубой силы, хе-хе:

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 \2 -to\3 -acodec copy -vcodec copy chapter\1.mkv/g;' 

Вы можете добавить xargs для запуска вывода в ковбойском стиле: | xargs -I cmd bash -c 'cmd'

gabriel_agm ответил 12 лет назад
G 268
0

Это моё решение, оно хорошо работает на Ubuntu-16.04.02-LTS. Он основан на другом опубликованном решении, но улучшил обработку глав и сгенерированных файлов для каждой главы.

Это пример выполнения:

$ 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 [...] 

Это скрипт:

$ 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="$" 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) }" 

Сценарий также доступен здесь:

https://github.com/dpsenner/mkv-split-chapters

Nachbars Lumpi ответил 9 лет назад
N 101