Kontener mkv
Kategoria: Artykuły, etykiety: video, audio, mmg, mkvmerge, mkv, film
Dodany: 2014-01-19 18:05
(zmodyfikowany: 2014-01-26 02:54)
Przez: morfik
Wyświetleń: 8629
Wiele osób posiada pliki video i ci co uczą się angielskiego, czy innych języków, niezbyt przepadają za słuchaniem polskiego lektora na filmach -- bo zagłusza całą oryginalną ścieżkę audio no i tłumaczenie jakie dostajemy jest co najmniej śmieszne. Co prawda z samego słuchu ciężko się człowiek uczy, zwłaszcza jak zaczyna naukę nowego języka, dlatego też można sobie dociągnąć polskie napisy. Jeden plik video, jedne napisy, to nic wielkiego, a co w przypadku jeśli chcemy mieć kilka ścieżek audio czy napisów, po jednej dla każdego języka, którego chcemy się nauczyć? Posiadanie wielu plików wprowadza trochę zamętu. Poniżej zostanie opisany sposób na ogarnięcie kolekcji filmowej, tak by został nam się tylko jeden plik na każdy lubiany przez nas film.
Będzie trzeba dociągnąć trochę pakietów, poniżej lista:
sptitude install mkvtoolnix-gui mkvtoolnix vobsub2srt tesseract-ocr-pol tesseract-ocr-fra tesseract-ocr-spa
Mamy przykładowy plik filmowy: 01 - North and South - (summer 1842 - summer 1844).mkv . Zobaczmy co skrywa w środku:
$ mkvmerge -i "01 - North and South - (summer 1842 - summer 1844).mkv"
File '01 - North and South - (summer 1842 - summer 1844).mkv': container: Matroska
Track ID 0: video (MPEG-4p10/AVC/h.264)
Track ID 1: audio (AAC)
Track ID 2: subtitles (VobSub)
Track ID 3: subtitles (VobSub)
Track ID 4: subtitles (VobSub)
Track ID 5: subtitles (SubRip/SRT)
Chapters: 23 entries
Możemy też zobaczyć więcej szczegółów i zamiast -i sprecyzować opcję -I:
$ mkvmerge -I "01 - North and South - (summer 1842 - summer 1844).mkv"
File '01 - North and South - (summer 1842 - summer 1844).mkv': container: Matroska [duration:5583088500000 segment_uid:9c796174bceeb6a93afa8cbc6da5731b is_providing_timecodes:1]
Track ID 0: video (MPEG-4p10/AVC/h.264) [number:1 uid:553933625 codec_id:V_MPEG4/ISO/AVC codec_private_length:47 codec_private_data:014d401effe10020674d401eeca05a1ef5ffe00100012d418041900000030010002bf200f162d96001000468efbc80 language:eng pixel_dimensions:718x480 display_dimensions:638x480 default_track:1 forced_track:0 enabled_track:1 packetizer:mpeg4_p10_video default_duration:33366534]
Track ID 1: audio (AAC) [number:2 uid:618205836 codec_id:A_AAC codec_private_length:2 codec_private_data:1188 language:eng default_track:1 forced_track:0 enabled_track:1 audio_sampling_frequency:48000 audio_channels:1]
Track ID 2: subtitles (VobSub) [number:3 uid:1500043313 codec_id:S_VOBSUB codec_private_length:349 codec_private_data:73697a653a20373230783438300a6f72673a20302c20300a7363616c653a20313030252c20313030250a616c7068613a20313030250a736d6f6f74683a204f46460a66616465696e2f6f75743a2035302c2035300a616c69676e3a204f4646206174204c45465420544f500a74696d65206f66667365743a20300a666f7263656420737562733a204f46460a70616c657474653a203437343734372c206633663366312c203134313431342c206664666466642c206438363030372c206533393732382c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337630a637573746f6d20636f6c6f72733a204f46462c2074726964783a20303030302c20636f6c6f72733a203030303030302c203030303030302c203030303030302c203030303030300a00 language:eng default_track:0 forced_track:0 enabled_track:1]
Track ID 3: subtitles (VobSub) [number:4 uid:1468010306 codec_id:S_VOBSUB codec_private_length:349 codec_private_data:73697a653a20373230783438300a6f72673a20302c20300a7363616c653a20313030252c20313030250a616c7068613a20313030250a736d6f6f74683a204f46460a66616465696e2f6f75743a2035302c2035300a616c69676e3a204f4646206174204c45465420544f500a74696d65206f66667365743a20300a666f7263656420737562733a204f46460a70616c657474653a203437343734372c206633663366312c203134313431342c206664666466642c206438363030372c206533393732382c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337630a637573746f6d20636f6c6f72733a204f46462c2074726964783a20303030302c20636f6c6f72733a203030303030302c203030303030302c203030303030302c203030303030300a00 language:fre default_track:0 forced_track:0 enabled_track:1]
Track ID 4: subtitles (VobSub) [number:5 uid:656633113 codec_id:S_VOBSUB codec_private_length:349 codec_private_data:73697a653a20373230783438300a6f72673a20302c20300a7363616c653a20313030252c20313030250a616c7068613a20313030250a736d6f6f74683a204f46460a66616465696e2f6f75743a2035302c2035300a616c69676e3a204f4646206174204c45465420544f500a74696d65206f66667365743a20300a666f7263656420737562733a204f46460a70616c657474653a203437343734372c206633663366312c203134313431342c206664666466642c206438363030372c206533393732382c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337632c203763376337630a637573746f6d20636f6c6f72733a204f46462c2074726964783a20303030302c20636f6c6f72733a203030303030302c203030303030302c203030303030302c203030303030300a00 language:spa default_track:0 forced_track:0 enabled_track:1]
Track ID 5: subtitles (SubRip/SRT) [number:6 uid:1025152577 codec_id:S_TEXT/UTF8 codec_private_length:0 language:eng default_track:0 forced_track:0 enabled_track:1]
Chapters: 23 entries
Mamy w pliku sześć ścieżek -- video, audio, napisy w wersji angielskiej, francuskiej oraz hiszpańskiej (format VobSub). Dodatkowo są też drugie napisy angielskie, tym razem w formacie SubRip/SRT, no i rozdziały (zakładki na filmie).
Wyciągnijmy zatem całą zawartość kontenera do osobnych plików:
$ mkvextract tracks "01 - North and South - (summer 1842 - summer 1844).mkv" 0:video 1:audio 2:eng 3:fra 4:spa 5:eng2
Extracting track 0 with the CodecID 'V_MPEG4/ISO/AVC' to the file 'video'. Container format: AVC/h.264 elementary stream
Extracting track 1 with the CodecID 'A_AAC' to the file 'audio'. Container format: raw AAC file with ADTS headers
Extracting track 2 with the CodecID 'S_VOBSUB' to the file 'eng'. Container format: VobSubs
Extracting track 3 with the CodecID 'S_VOBSUB' to the file 'fra'. Container format: VobSubs
Extracting track 4 with the CodecID 'S_VOBSUB' to the file 'spa'. Container format: VobSubs
Extracting track 5 with the CodecID 'S_TEXT/UTF8' to the file 'eng2'. Container format: SRT text subtitles
Writing the VobSub index file 'eng.idx'.
Writing the VobSub index file 'fra.idx'.
Writing the VobSub index file 'spa.idx'.
Progress: 100%
Dodatkowo trzeba wyciągnąć metadane opisujące dźwięk i obraz, bez tego będą problemy z odtwarzaniem filmu:
$ mkvextract timecodes_v2 "01 - North and South - (summer 1842 - summer 1844).mkv" 0:video.txt 1:audio.txt
Progress: 100%
No i jeszcze wyciągnijmy rozdziały:
$ mkvextract chapters "01 - North and South - (summer 1842 - summer 1844).mkv" > chapters.xml
Nie każdy film posiada wszystkie z powyższych, także jakby czegoś brakowało to bez obaw.
Ten film akurat nie ma polskich napisów w kontenerze, ale można je dociągnąć przez qnapi. Pozostaje tylko problem z kodowaniem. Co prawda qnapi umożliwia przekodowanie pobieranych napisów ale co zrobić w przypadku gdy już posiadamy jakieś napisy i mają one inne kodowanie niż utf-8?
Napisy można przekonwertować przy pomocy iconv -- w polsce są używane chyba 3 rodzaje kodowań - utf-8, windows-1250 i iso8859-2. Jeśli mamy krzaki przy ustawieniu kodowania na utf-8, musimy zmienić kodowanie pliku jedną z poniższych linijek:
$ iconv -f iso8859-2 -t utf8 "01 - North and South - (summer 1842 - summer 1844).txt" -o pol.srt
$ iconv -f windows-1250 -t utf8 "01 - North and South - (summer 1842 - summer 1844).txt" -o pol.srt
Czasami file może nam coś więcej powiedzieć o pliku:
$ file "01 - North and South - (summer 1842 - summer 1844).txt"
01 - North and South - (summer 1842 - summer 1844).txt: Non-ISO extended-ASCII text, with CRLF line terminators
Ale w tym przypadku na nic się on zbytnio nie zda.
Z kontenera .mkv wyciągnęliśmy jeden format napisów w SRT, pozostałe trzy mają format VobSub, a tego nie odtwarza mi smplayer. Vlc nawet łapie ten format napisów ale ich czcionka czy jakość pozostawia wiele do życzenia. Przekonwertujmy zatem wszystkie napisy do formatu SRT:
Oczywiście w zależności od tego na jakich językach będziemy operować, trzeba dociągnąć odpowiednie pakiety. Gdy już je mamy, przerabiamy napisy:
$ vobsub2srt --langlist ./eng
Languages:
0: en
$ vobsub2srt --langlist ./fre
Languages:
0: fr
$ vobsub2srt --langlist ./spa
Languages:
0: es
$ vobsub2srt eng
Wrote Subtitles to 'eng.srt'
$ vobsub2srt spa
Wrote Subtitles to 'spa.srt'
$ vobsub2srt fre
Wrote Subtitles to 'fre.srt'
Polskie napisy, które będziemy pobierać, prawdopodobnie będą miały format SRT, mimo, że będą zapisane w pliku z rozszerzeniem .txt . Tak jest w tym przypadku. Jeśli jednak trafią się napisy w formacie innym niże SRT, możemy je łatwo przekonwertować np. przy pomocy gnome-subtitles .
Mamy zatem wyodrębnioną ścieżkę video, ścieżkę audio, rozdziały oraz 4 wersje napisów. Czas to posklejać:
$ "mkvmerge" -o "./01 - North and South - (summer 1842 - summer 1844).mkv.fix" \
> "--aac-is-sbr" "0:1" \
> "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "--timecodes" "0:./audio.txt" "-a" "0" "-D" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "./audio" ")" \
> "--sub-charset" "0:UTF-8" "--language" "0:eng" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "./eng.srt" ")" \
> "--sub-charset" "0:UTF8" "--language" "0:fre" "--default-track" "0:no" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "./fre.srt" ")" \
> "--sub-charset" "0:UTF8" "--language" "0:pol" "--default-track" "0:no" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "./pol.srt" ")" \
> "--sub-charset" "0:UTF-8" "--language" "0:spa" "--default-track" "0:no" "--forced-track" "0:no" "-s" "0" "-D" "-A" "-T" "--no-global-tags" "--no-chapters" "(" "./spa.srt" ")" \
> "--language" "0:eng" "--default-track" "0:yes" "--forced-track" "0:no" "--timecodes" "0:./video.txt" "-d" "0" "-A" "-S" "-T" "--no-global-tags" "--no-chapters" "(" "./video" ")" \
> "--track-order" "5:0,0:0,1:0,3:0,2:0,4:0" \
> "--chapter-language" "eng" "--chapters" "./chapters.xml"
mkvmerge v6.7.0 ('Back to the Ground') 64bit built on Jan 9 2014 11:05:23
'./audio': Using the demultiplexer for the format 'AAC'.
'./eng.srt': Using the demultiplexer for the format 'SRT subtitles'.
'./fre.srt': Using the demultiplexer for the format 'SRT subtitles'.
'./pol.srt': Using the demultiplexer for the format 'SRT subtitles'.
'./spa.srt': Using the demultiplexer for the format 'SRT subtitles'.
'./video': Using the demultiplexer for the format 'AVC/h.264'.
'./audio' track 0: Using the output module for the format 'AAC'.
'./eng.srt' track 0: Using the output module for the format 'text subtitles'.
'./fre.srt' track 0: Using the output module for the format 'text subtitles'.
'./pol.srt' track 0: Using the output module for the format 'text subtitles'.
'./spa.srt' track 0: Using the output module for the format 'text subtitles'.
'./video' track 0: Using the output module for the format 'AVC/h.264 (unframed)'.
The file './01 - North and South - (summer 1842 - summer 1844).mkv.fix' has been opened for writing.
'./video' track 0: Extracted the aspect ratio information from the MPEG-4 layer 10 (AVC) video data and set the display dimensions to 718/540.
Progress: 100%
The cue entries (the index) are being written...
Muxing took 1 minute 51 seconds.
Składanie kontenera .mkv dużo prościej odbywa się przez gui -- mmg. Sprawdzamy jeszcze czy kontener ma wszystko co chcieliśmy by miał:
$ mkvmerge -I "01 - North and South - (summer 1842 - summer 1844).mkv.fix"
File '01 - North and South - (summer 1842 - summer 1844).mkv.fix': container: Matroska [duration:5583087000000 segment_uid:1ad821ab54deea131d9870fc37c063ce is_providing_timecodes:1]
Track ID 0: video (MPEG-4p10/AVC/h.264) [number:1 uid:5542766029373557832 codec_id:V_MPEG4/ISO/AVC codec_private_length:47 codec_private_data:014d401effe10020674d401eeca05a1ef5ffe00100012d418041900000030010002bf200f162d96001000468efbc80 language:eng pixel_dimensions:718x480 display_dimensions:718x540 default_track:1 forced_track:0 enabled_track:1 packetizer:mpeg4_p10_video default_duration:33000000]
Track ID 1: audio (AAC) [number:2 uid:5497098133708685637 codec_id:A_AAC codec_private_length:5 codec_private_data:118856e580 language:eng default_track:1 forced_track:0 enabled_track:1 default_duration:21000000 audio_sampling_frequency:48000 audio_channels:1]
Track ID 2: subtitles (SubRip/SRT) [number:3 uid:15137279790666575565 codec_id:S_TEXT/UTF8 codec_private_length:0 language:eng default_track:1 forced_track:0 enabled_track:1]
Track ID 3: subtitles (SubRip/SRT) [number:4 uid:14594798366566068182 codec_id:S_TEXT/UTF8 codec_private_length:0 language:pol default_track:0 forced_track:0 enabled_track:1]
Track ID 4: subtitles (SubRip/SRT) [number:5 uid:4699787031062832735 codec_id:S_TEXT/UTF8 codec_private_length:0 language:fre default_track:0 forced_track:0 enabled_track:1]
Track ID 5: subtitles (SubRip/SRT) [number:6 uid:11943351849052802566 codec_id:S_TEXT/UTF8 codec_private_length:0 language:spa default_track:0 forced_track:0 enabled_track:1]
Chapters: 23 entries
Teraz już tylko wystarczy wrzucić film do smplayera czy vlc i sprawdzić czy działa prawidłowo. U mnie wszystko jak najbardziej w porządku.
Gdy staramy się przeformatować swoją kolekcję filmów tak by wszystkie pliki były w kontenerach .mkv, czasami się może zdarzyć, że będziemy mieli do czynienia z innymi kontenerami. Póki co natrafiłem na kontener QuickTime/MP4 . Przy wypisywaniu informacji za pomocą mkvmerge -i nie zostaną pokazane wszystkie ścieżki. Tak u mnie się prezentuje kontener QuickTime/MP4 w mkvmerge:
$ mkvmerge -i film.mp4
File 'film': container: QuickTime/MP4
Track ID 0: video (MPEG-4p10/AVC/h.264)
Track ID 1: audio (AAC)
Chapters: 45 entries
Jedyne czego brakuje to napisów, a te są w dość egzotycznym formacje -- można sprawdzić za pomocą mediainfo:
Text #1
ID : 3
Format : Timed Text
Codec ID : tx3g
Duration : 3h 5mn
Bit rate mode : Variable
Bit rate : 36 bps
Stream size : 48.5 KiB (0%)
Title : *srt#trackID=1:lang=en@GPAC0.5.1-DEV-rev4283
Language : English
Encoded date : UTC 2013-10-23 14:19:12
Tagged date : UTC 2013-10-23 14:19:12
Trzeba te napisy jakoś wyciągnąć i przekonwertować do formatu SRT. Do tego celu musimy doinstalować pakiet gpac:
# aptitude install gpac
Podglądamy plik przy pomocy MP4Box:
$ MP4Box -info film.mp4
* Movie Info *
Timescale 600 - Duration 03:16:02.900
5 track(s)
Fragmented File: no
File suitable for progressive download (moov before mdat)
File Brand isom - version 1
Created: GMT Wed Oct 23 14:07:50 2013
File has root IOD (9 bytes)
Scene PL 0xff - Graphics PL 0xff - OD PL 0xff
Visual PL: AVC/H264 Profile (0x15)
Audio PL: AAC Profile @ Level 2 (0x29)
No streams included in root OD
Chapters:
Chapter #1 - 00:00:00.000 - "Foreword"
Chapter #2 - 00:01:30.090 - "Awaiting Achilles"
Chapter #3 - 00:08:16.329 - ""Is There No One Else?""
Chapter #4 - 00:11:06.332 - "Secret Lovers"
Chapter #5 - 00:18:22.101 - "Brothers' Pledges"
Chapter #6 - 00:25:33.365 - "Greatest War"
Chapter #7 - 00:27:41.493 - "Recruiter Odysseus"
Chapter #8 - 00:33:23.335 - "Glory and Doom"
Chapter #9 - 00:36:39.864 - "Royal Welcome"
Chapter #10 - 00:40:01.566 - "They're Coming for Me"
Chapter #11 - 00:44:50.187 - "Immortality Is Yours"
Chapter #12 - 00:52:32.316 - "Beach Combat"
Chapter #13 - 00:58:00.143 - "Too Early in the Day"
Chapter #14 - 01:03:48.992 - "No Need to Fear"
Chapter #15 - 01:07:41.224 - "Spoils of War"
Chapter #16 - 01:12:36.352 - "The Way I Love Helen"
Chapter #17 - 01:17:55.838 - "Power, Not Love"
Chapter #18 - 01:21:31.720 - "Soldiers Obey"
Chapter #19 - 01:23:55.864 - "Gathering Forces"
Chapter #20 - 01:28:49.324 - "Brave Offer"
Chapter #21 - 01:32:23.371 - "Paris vs. Menelaus"
Chapter #22 - 01:36:58.146 - "Battle Cry"
Chapter #23 - 01:41:39.093 - "Greek Retreat"
Chapter #24 - 01:44:56.957 - "Weak Morale"
Chapter #25 - 01:48:15.322 - "Everyone Dies"
Chapter #26 - 01:54:20.687 - "Born for This War"
Chapter #27 - 01:57:26.039 - "Priam's Order"
Chapter #28 - 02:00:05.698 - "Flaming Attack"
Chapter #29 - 02:03:47.086 - "Hector's Adversary"
Chapter #30 - 02:08:40.212 - "Tragic Mistake"
Chapter #31 - 02:10:42.668 - "Night of Torments"
Chapter #32 - 02:15:10.436 - "Summoned to Fight"
Chapter #33 - 02:20:47.773 - "Now You Know"
Chapter #34 - 02:23:08.246 - "Hector vs. Achilles"
Chapter #35 - 02:26:25.110 - "Desecrating the Dead"
Chapter #36 - 02:28:29.734 - "A Father's Plea"
Chapter #37 - 02:34:48.446 - "Achilles' Word"
Chapter #38 - 02:37:28.939 - "Inspirations and Honors"
Chapter #39 - 02:41:20.170 - "Parting Gift"
Chapter #40 - 02:45:40.764 - "Troy Under Siege"
Chapter #41 - 02:51:09.759 - "We Will Be Together"
Chapter #42 - 02:55:39.028 - "Royal Bloodshed"
Chapter #43 - 02:58:42.712 - "Brought to Hell"
Chapter #44 - 03:02:24.433 - "I Walked With Giants"
Chapter #45 - 03:05:12.601 - "End Credits"
Track # 1 Info - TrackID 1 - TimeScale 24000 - Media Duration 03:16:02.751
Media Info: Language "Undetermined" - Type "vide:avc1" - 282024 samples
Visual Track layout: x=0 y=0 width=1280 height=528
MPEG-4 Config: Visual Stream - ObjectTypeIndication 0x21
AVC/H264 Video - Visual Size 1280 x 528
AVC Info: 1 SPS - 1 PPS - Profile High @ Level 4.1
NAL Unit length bits: 32
Pixel Aspect Ratio 1:1 - Indicated track size 1280 x 528
Chroma format 1 - Luma bit depth 8 - chroma bit depth 8
Self-synchronized
Track # 2 Info - TrackID 2 - TimeScale 48000 - Media Duration 03:16:02.901
Media Info: Language "English" - Type "soun:mp4a" - 551386 samples
MPEG-4 Config: Audio Stream - ObjectTypeIndication 0x40
MPEG-4 Audio AAC LC - 2 Channel(s) - SampleRate 48000
Synchronized on stream 1
Track # 3 Info - TrackID 3 - TimeScale 1000 - Media Duration 03:05:05.671
Media Info: Language "English" - Type "text:tx3g" - 2748 samples
3GPP/MPEG-4 Timed Text - Size 1280 x 528 - Translation X=0 Y=0 - Layer 0
Track # 4 Info - TrackID 4 - TimeScale 1000 - Media Duration 03:06:09.928
Media Info: Language "Romanian; Moldavian; Moldovan" - Type "text:tx3g" - 2689 samples
3GPP/MPEG-4 Timed Text - Size 1280 x 528 - Translation X=0 Y=0 - Layer 0
Track # 5 Info - TrackID 5 - TimeScale 1000 - Media Duration 03:05:05.619
Media Info: Language "Russian" - Type "text:tx3g" - 2796 samples
3GPP/MPEG-4 Timed Text - Size 1280 x 528 - Translation X=0 Y=0 - Layer 0
I jak widzimy powyżej, mamy trochę więcej ścieżek niż nam pokazał mkvmerge. Teraz już tylko pozostało nam wyciągnąć napisy:
$ MP4Box -srt 3 film.mp4
Conversion done
Zostaną one przekonwertowane do formatu SRT czyli tak jak tego chcieliśmy na początku.