web-dev-qa-db-ja.com

章に基づいてMKVを分割する

個々の章に分割したい長い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は似たようなものに見えるかもしれませんが、ドキュメントは見つかりません。

8
Terence Eden

私はffmpeg/avconvでこれを行う信頼できる方法を見つけることができません-しかし、私はcanこれを行う方法を見つけます HandBrakeCLI

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

mkvから第3章を抽出します。

6
Terence Eden

mkvmergeを使用してmkvビデオを章ごとに分割する

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

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

15
Endoro

ブルートフォースソリューション、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 \2 -to\3 -acodec copy -vcodec copy chapter\1.mkv/g;'

Xargsを追加して、カウボーイスタイルで出力を実行できます:| xargs -I cmd bash -c 'cmd'

4
gabriel_agm

これは私の解決策です。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##*.}"
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)
}"

スクリプトはこちらからも入手できます。

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

0
Nachbars Lumpi