Tách MKV dựa trên các chương


7

Tôi có một tệp MKV dài mà tôi muốn chia thành các chương riêng lẻ.

Chạy ffmpeg -i long.mkvcho tôi tất cả thông tin về các chương được nhúng trong tệp:

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

Có 10 chương trong tệp - Tôi muốn kết thúc với 10 tệp riêng biệt.

Nó trông giống như -map_chapterscó thể tương tự - nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về nó.


Hệ điều hành nào?
nixda

Ubuntu. Nhưng bất kỳ hệ thống GNU / Linux.
Terence Eden

Câu trả lời:


14

chia video mkv theo chương bằng mkvmerge

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

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


Thật không may, vì MKVmerge chỉ có thể phân tách trên các khung hình chính, nên điều này chỉ hoạt động nếu có một khung hình chính vào thời gian chính xác như thời gian chương cho mỗi chương. Nếu không, một số hoặc tất cả các chương của bạn sẽ chứa các phần của các chương khác. Vẫn chưa tìm thấy giải pháp hoạt động vào thời gian chính xác bất kể khung hình chính.
Natsukane

Bạn có thể thử Avidemux để phân chia giữa các khung chính (bên trong GOP ).
Endoro

6

Tôi không thể tìm thấy một cách đáng tin cậy để làm điều này với ffmpeg / avconv - nhưng tôi có thể tìm ra cách để làm điều này với HandBrakeCLI .

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

Sẽ trích xuất chương 3 từ một mkv.


Điều này có vẻ như nó làm những gì tôi muốn, nhưng nó thực sự chỉ trích xuất một chương, hoặc điều này sẽ mã hóa lại toàn bộ chương? Bởi vì tôi hiểu rằng nhóm Handbrake coi bất cứ điều gì không liên quan đến chuyển mã là ngoài phạm vi, điều này khiến tôi nghi ngờ điều này sẽ mã hóa lại một tệp mà tôi chỉ muốn cắt.
Tim M.

4

giải pháp vũ phu, 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;'

Bạn có thể thêm xargs để chạy đầu ra theo kiểu cao bồi: | xargs -I cmd bash -c 'cmd'


0

Đâ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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.