अध्यायों पर आधारित स्प्लिट एमकेवी


7

मेरे पास एक लंबी 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 ऐसा ही कुछ हो सकता है - लेकिन मुझे इस पर कोई दस्तावेज नहीं मिल रहा है।


क्या ऑपरेटिंग सिस्टम?
nixda

उबंटू। लेकिन कोई भी GNU / Linux सिस्टम।
Terence Eden

जवाबों:


14

mkvmerge का उपयोग करके अध्यायों द्वारा विभाजित mkv वीडियो

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

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


दुर्भाग्य से, चूंकि MKVmerge केवल keyframes पर विभाजित हो सकता है, यह केवल तभी काम करता है जब प्रत्येक अध्याय के लिए अध्याय समय के रूप में सटीक समय पर एक keyframe हो। यदि नहीं, तो आपके कुछ अध्यायों में अन्य अध्यायों के कुछ भाग शामिल होंगे। अभी भी एक समाधान नहीं मिला है जो कीफ़्रेम की परवाह किए बिना सटीक समय पर काम करता है।
Natsukane

आप कोशिश कर सकते हैं Avidemux (के अंदर) कुंजी फ्रेम के बीच विभाजित करने के लिए GOP )।
Endoro

5

मुझे ffmpeg / avconv के साथ ऐसा करने का एक विश्वसनीय तरीका नहीं मिल रहा है - लेकिन मैं कर सकते हैं इसके साथ करने का एक तरीका खोजें HandBrakeCLI

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

अध्याय 3 को एक से निकालेंगे mkv


ऐसा लगता है कि यह वही करता है जो मैं चाहता हूं, लेकिन क्या यह केवल एक अध्याय निकालने वाला है, या यह पूरे अध्याय को फिर से एनकोड करेगा? क्योंकि यह मेरी समझ है कि हैंडब्रेक टीम ट्रांसकॉडिंग से संबंधित किसी भी चीज को आउट-ऑफ-स्कोप नहीं मानती है, जिससे मुझे संदेह है कि यह एक फाइल को फिर से एनकोड करेगा जिसे मैं केवल ट्रिम करना चाहता हूं।
Tim M.

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'


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##*.}"
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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.