2013-10-05 103 views
18

這是我所知道的一個DVD圖像轉換到另一個videoformat程序(VG MP4)爲MKV:轉換DVD影像字幕使用avconv

  1. 串聯VIDEO_TS文件夾內的VTS_01_ñ.VOB文件( n> = 0)轉換爲單個VOB文件。
  2. 使用avconvffmpeg爲了將該VOB轉換成另一種格式。

到目前爲止好,但現在我想將DVD影像轉換字幕。據我所知MKV格式支持字幕,所以它似乎是一個明顯的選擇。或者,我可以使用任何其他格式的硬字幕(字幕作爲視頻圖像的一部分)。

然而,DVD的圖像在字幕編碼爲dvdsub,我得到以下錯誤

Only SUBTITLE_ASS type supported. 
Subtitle encoding failed 

但是,運行avconv -codecs當我得到:

... 
DES dvdsub   DVD subtitles 
... 

而且-c:s copy開關,而其防止命令失敗,似乎不會產生玩家可以理解的副標題。

那麼,如何使用avconv來創建ass字幕dvdsub

我的VOB文件有八個字幕通道和兩個音頻通道。 Ubuntu視頻應用程序不顯示任何字幕,並且只有第一個音頻通道似乎正在工作,DVD映像可能被破壞。

Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49 
av_interleaved_write_frame(): Invalid argument 

預先感謝您對如何解決這些問題的任何想法:

另一個文件,雙層DVD,使用-c:s copy開關進一步顯示,當顯示字幕編碼錯誤,但是。

(我正在使用Ubuntu,其中ffmpegavconv的別名。我知道可以安裝真正的ffmpeg,但到目前爲止我還沒有這樣做。)


更新:命令和控制檯輸出:

命令

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB > ~/temp/mymovie.VOB 
cd ~/temp 
avconv -i mymovie.VOB 

輸出

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers 
    built on Mar 30 2013 22:20:06 with gcc 4.7.2 
[mpeg @ 0x1a64d40] max_analyze_duration reached 
Input #0, mpeg, from 'mymovie.VOB': 
    Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s 
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc 
    Stream #0.1[0x20]: Subtitle: dvdsub 
    Stream #0.2[0x21]: Subtitle: dvdsub 
    Stream #0.3[0x22]: Subtitle: dvdsub 
    Stream #0.4[0x23]: Subtitle: dvdsub 
    Stream #0.5[0x24]: Subtitle: dvdsub 
    Stream #0.6[0x25]: Subtitle: dvdsub 
    Stream #0.7[0x26]: Subtitle: dvdsub 
    Stream #0.8[0x27]: Subtitle: dvdsub 
    Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
    Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
At least one output file must be specified 

命令

avconv -i mymovie.VOB mymovie.mkv 

輸出

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers 
    built on Mar 30 2013 22:20:06 with gcc 4.7.2 
[mpeg @ 0x1cdad40] max_analyze_duration reached 
Input #0, mpeg, from 'mymovie.VOB': 
    Duration: 00:00:01.95, start: 0.280633, bitrate: -2147483 kb/s 
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 7500 kb/s, 29.97 fps, 29.97 tbr, 90k tbn, 59.94 tbc 
    Stream #0.1[0x20]: Subtitle: dvdsub 
    Stream #0.2[0x21]: Subtitle: dvdsub 
    Stream #0.3[0x22]: Subtitle: dvdsub 
    Stream #0.4[0x23]: Subtitle: dvdsub 
    Stream #0.5[0x24]: Subtitle: dvdsub 
    Stream #0.6[0x25]: Subtitle: dvdsub 
    Stream #0.7[0x26]: Subtitle: dvdsub 
    Stream #0.8[0x27]: Subtitle: dvdsub 
    Stream #0.9[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
    Stream #0.10[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
File 'mymovie.mkv' already exists. Overwrite ? [y/N] y 
[buffer @ 0x1ce23c0] w:720 h:480 pixfmt:yuv420p 
Output #0, matroska, to 'mymovie.mkv': 
    Metadata: 
    encoder   : Lavf53.21.1 
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 29.97 tbc 
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 
    Stream #0.2: Subtitle: ass, 200 kb/s 
Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) 
    Stream #0:9 -> #0:1 (ac3 -> libvorbis) 
    Stream #0:1 -> #0:2 (dvdsub -> ass) 
Press ctrl-c to stop encoding 
[ass @ 0x1ce0140] Only SUBTITLE_ASS type supported. 
Subtitle encoding failed 

命令

avconv -i mymovie.VOB -c:s copy mymovie.mkv 

輸出刪去。

命令

avconv -i mymovie.mkv 

輸出

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers 
    built on Mar 30 2013 22:20:06 with gcc 4.7.2 
[matroska,webm @ 0xbc1d40] Estimating duration from bitrate, this may be inaccurate 
Input #0, matroska,webm, from 'mymovie.mkv': 
    Metadata: 
    ENCODER   : Lavf53.21.1 
    Duration: 01:05:09.47, start: 0.000000, bitrate: N/A 
    Stream #0.0: Video: mpeg4 (Simple Profile), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 29.97 fps, 29.97 tbr, 1k tbn, 30k tbc (default) 
    Stream #0.1: Audio: vorbis, 48000 Hz, 5.1, s16 (default) 
    Stream #0.2: Subtitle: dvdsub (default) 
At least one output file must be specified 

現在,對於雙層: 命令

cat VTS_01_1.VOB VTS_01_2.VOB VTS_01_3.VOB VTS_01_4.VOB VTS_01_5.VOB VTS_01_6.VOB VTS_01_7.VOB VTS_01_8.VOB > ~/temp/mylongmovie.VOB 
cd ~/temp 
avconv -i mylongmovie.VOB mylongmovie.mkv 

輸出

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers 
    built on Mar 30 2013 22:20:06 with gcc 4.7.2 
[mpeg @ 0x13c2d40] max_analyze_duration reached 
Input #0, mpeg, from 'Cosmos-0203.VOB': 
    Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s 
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc 
    Stream #0.1[0x20]: Subtitle: dvdsub 
    Stream #0.2[0x21]: Subtitle: dvdsub 
    Stream #0.3[0x22]: Subtitle: dvdsub 
    Stream #0.4[0x23]: Subtitle: dvdsub 
    Stream #0.5[0x24]: Subtitle: dvdsub 
    Stream #0.6[0x25]: Subtitle: dvdsub 
    Stream #0.7[0x26]: Subtitle: dvdsub 
    Stream #0.8[0x27]: Subtitle: dvdsub 
    Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
    Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y 
[buffer @ 0x13ca3c0] w:720 h:480 pixfmt:yuv420p 
Output #0, matroska, to 'mylongmovie.mkv': 
    Metadata: 
    encoder   : Lavf53.21.1 
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc 
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 
    Stream #0.2: Subtitle: ass, 200 kb/s 
Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) 
    Stream #0:9 -> #0:1 (ac3 -> libvorbis) 
    Stream #0:1 -> #0:2 (dvdsub -> ass) 
Press ctrl-c to stop encoding 
[ass @ 0x13d19c0] Only SUBTITLE_ASS type supported. 
Subtitle encoding failed 

命令

avconv -i mylongmovie.VOB -c:s copy mylongmovie.mkv 

輸出

avconv version 0.8.6-6:0.8.6-1ubuntu2, Copyright (c) 2000-2013 the Libav developers 
    built on Mar 30 2013 22:20:06 with gcc 4.7.2 
[mpeg @ 0xce1d40] max_analyze_duration reached 
Input #0, mpeg, from 'mylongmovie.VOB': 
    Duration: 00:00:30.24, start: 0.280633, bitrate: 2103365 kb/s 
    Stream #0.0[0x1e0]: Video: mpeg2video (Main), yuv420p, 720x480 [PAR 8:9 DAR 4:3], 8000 kb/s, 27.46 fps, 59.94 tbr, 90k tbn, 59.94 tbc 
    Stream #0.1[0x20]: Subtitle: dvdsub 
    Stream #0.2[0x21]: Subtitle: dvdsub 
    Stream #0.3[0x22]: Subtitle: dvdsub 
    Stream #0.4[0x23]: Subtitle: dvdsub 
    Stream #0.5[0x24]: Subtitle: dvdsub 
    Stream #0.6[0x25]: Subtitle: dvdsub 
    Stream #0.7[0x26]: Subtitle: dvdsub 
    Stream #0.8[0x27]: Subtitle: dvdsub 
    Stream #0.9[0x81]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
    Stream #0.10[0x80]: Audio: ac3, 48000 Hz, 5.1, s16, 448 kb/s 
File 'mylongmovie.mkv' already exists. Overwrite ? [y/N] y 
[buffer @ 0xce93c0] w:720 h:480 pixfmt:yuv420p 
Output #0, matroska, to 'mylongmovie.mkv': 
    Metadata: 
    encoder   : Lavf53.21.1 
    Stream #0.0: Video: mpeg4, yuv420p, 720x480 [PAR 8:9 DAR 4:3], q=2-31, 200 kb/s, 1k tbn, 59.94 tbc 
    Stream #0.1: Audio: libvorbis, 48000 Hz, 5.1, s16 
    Stream #0.2: Subtitle: dvdsub 
Stream mapping: 
    Stream #0:0 -> #0:0 (mpeg2video -> mpeg4) 
    Stream #0:9 -> #0:1 (ac3 -> libvorbis) 
    Stream #0:1 -> #0:2 (copy) 
Press ctrl-c to stop encoding 
[matroska @ 0xce4b40] Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49 
av_interleaved_write_frame(): Invalid argument 
+0

@LordNeckbeard命令和輸出插入 –

+1

轉換DVD到MKV:**與**編碼使用手剎,**沒有**編碼MakeMKV。 – Endoro

+0

@Endoro:** MakeMKV **爲我工作。雖然我會喜歡一個完整的開源解決方案(這需要安裝二進制文件),但這完全可以滿足我的迫切需求。如果你把它寫成答案,我會加註它,並且(如果沒有給出'avconv'答案)接受它。謝謝。 –

回答

4

如果你需要一個優質的保存解決方案,您應該嘗試MakeMKV
如果要壓縮視頻軌道或將MPEG-2轉換爲H.264,可以使用handbrake

+0

** MakeMKV **爲我工作。謝謝。 ** Handbrake **在完成第一次轉換之前正在導致系統關機。 –

+0

@CarlosEugenioThompsonPinzón你試過了[Nightly build](http://handbrake.fr/nightly.php)嗎? – Endoro

33

簡短回答:跳到部分完整命令行並從this site下載ffmpeg。因爲(a)答案仍然丟失,(b)avconv似乎是今天ubuntu系統的默認設置,所以我計劃回答如何使用avconv來解決這個問題。但是,目前看起來目前太麻煩了 - 至少對於我的測試用例來說。

的ffmpeg設置

既然你問任何avconvffmpeg,我剛剛得知avconvffmpeg(見this answer的討論),我下載的ffmpeg當前版本從this site爲叉上述答案解釋說。 Windows版本也可用。對於典型的當前64位Linux版本,直接鏈接將是this page。它包含每日構建。所以向下滾動,直到看到最新最好的,下載並用例如tar xzvf ffmpeg.static.64bit.2014-02-14.tar.gz。靜態構建的優點在於它具有較少的依賴關係,如果不是的話。解壓tarfile在當前目錄中創建了兩個新的可執行文件ffmpegffprobe

基本命令行

現在我們可以用這個最新的ffmpegmymovie.vob*內的所有數據流複製到不同的格式。例如:

./ffmpeg -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv 

此命令行

  • 從輸入文件讀取-i filename
  • 拷貝視頻流在其中-c:v copy
  • 拷貝音頻流在其中-c:a copy
  • 拷貝字幕其中-c:s copy
  • a第二,而不是僅僅使用第一各的,它使用,並複製所有這些-map 0
  • 輸出文件outputfile

讓我們擴展上面的命令行要解決一些可能的錯誤的工具,或損壞輸入文件,或只是關於.vob文件的細節。

解決方法錯誤Can't write packet with unknown timestamp

添加的選項-fflags +genpts輸入文件之前。

./ffmpeg -fflags +genpts -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv 

選項中ffmpeg總是隻影響當前選項命名的輸入或輸出文件。這兩個選項必須影響輸入文件,所以他們必須先來。

此替代方法在this bug ticket中進行了介紹,在所有情況下可能都無效。

缺少的部分或全部字幕

這是處理.vob文件,並覆蓋在ffmpeg FAQ時非常典型的行爲。視頻容器文件類型(例如.avi.mp4.mkv)具有列出文件所有內容的標題(文件開頭的數據)。這使得玩家和轉換工具可以輕鬆瞭解期望的數據類型。 .vob文件沒有這樣的顯式標題。所以當ffmpegavconv開始時,他們會看到前幾千字節。在vob文件中,字幕可能會很晚纔開始。在我的測試用例中,第一個字幕會在幾秒鐘後出現,所以這些工具在啓動時看不到它。下面是在這些情況下編碼期間的典型輸出示例:

Output #0, matroska, to 'test.mkv': 
    Metadata: 
    encoder   : Lavf55.32.101 
    Stream #0:0: Video: mpeg2video (mpg2/0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc 
    Stream #0:1: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, 5.1(side), 448 kb/s 
    Stream #0:2: Audio: dts ([1] [0][0]/0x2001), 48000 Hz, 5.1(side), 768 kb/s 
    Stream #0:3: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, 5.1(side), 448 kb/s 
    Stream #0:4: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, stereo, 224 kb/s 
Stream mapping: 
    Stream #0:0 -> #0:0 (copy) 
    Stream #0:1 -> #0:1 (copy) 
    Stream #0:2 -> #0:2 (copy) 
    Stream #0:3 -> #0:3 (copy) 
    Stream #0:4 -> #0:4 (copy) 
Press [q] to stop, [?] for help 
[mpeg @ 0x31f2540] New subtitle stream 0:5 at pos:16945166 and DTS:22.2473s 
[mpeg @ 0x31f2540] New subtitle stream 0:6 at pos:16951310 and DTS:22.2473s 
[mpeg @ 0x31f2540] New subtitle stream 0:7 at pos:16957454 and DTS:22.2873s 
[mpeg @ 0x31f2540] New subtitle stream 0:8 at pos:16963598 and DTS:22.2873s 
[mpeg @ 0x31f2540] New subtitle stream 0:9 at pos:18405390 and DTS:25.4873s 
[mpeg @ 0x31f2540] New subtitle stream 0:10 at pos:18417678 and DTS:25.4873s 
[mpeg @ 0x31f2540] New subtitle stream 0:11 at pos:264593422 and DTS:288.207sts/s  
[mpeg @ 0x31f2540] New subtitle stream 0:12 at pos:264597518 and DTS:288.207s 
frame=24694 fps=7322 q=-1.0 Lsize= 859345kB time=00:16:27.74 bitrate=7127.1kbits/s  
video:632823kB audio:224996kB subtitle:0 data:0 global headers:0kB muxing overhead 0.177935% 

可以看出,在實際編碼期間找到了新的字幕流。如果嘗試添加-map 5選項以包含該流,則ffmpeg會在啓動期間抱怨此流號碼不存在。

解決方法是告訴ffmpeg在文件的開頭分析更多字節以查找所有流。

嘗試添加選項-analyzeduration 1000000k -probesize 1000000k之前的輸入文件。

嘗試增加數字,如果流仍未找到。在我的測試中,這些數字足夠大。然後輸出變爲:

Input #0, mpeg, from 'mymovie.vob': 
    Duration: 00:59:39.90, start: 0.287267, bitrate: 5915 kb/s 
    Stream #0:0[0x1e0]: Video: mpeg2video (Main), yuv420p(tv, bt470bg), 720x576 [SAR 64:45 DAR 16:9], max. 9800 kb/s, 25 fps, 25 tbr, 90k tbn, 50 tbc 
    Stream #0:1[0x80]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s 
    Stream #0:2[0x89]: Audio: dts (DTS), 48000 Hz, 5.1(side), fltp, 768 kb/s 
    Stream #0:3[0x82]: Audio: ac3, 48000 Hz, 5.1(side), fltp, 448 kb/s 
    Stream #0:4[0x83]: Audio: ac3, 48000 Hz, stereo, fltp, 224 kb/s 
    Stream #0:5[0x20]: Subtitle: dvd_subtitle 
    Stream #0:6[0x21]: Subtitle: dvd_subtitle 
    Stream #0:7[0x22]: Subtitle: dvd_subtitle 
    Stream #0:8[0x23]: Subtitle: dvd_subtitle 
    Stream #0:9[0x24]: Subtitle: dvd_subtitle 
    Stream #0:10[0x25]: Subtitle: dvd_subtitle 
    Stream #0:11[0x26]: Subtitle: dvd_subtitle 
    Stream #0:12[0x27]: Subtitle: dvd_subtitle 
File 'test.mkv' already exists. Overwrite ? [y/N] y 
Output #0, matroska, to 'test.mkv': 
    Metadata: 
    encoder   : Lavf55.32.101 
    Stream #0:0: Video: mpeg2video (mpg2/0x3267706D), yuv420p, 720x576 [SAR 64:45 DAR 16:9], q=2-31, max. 9800 kb/s, 25 fps, 1k tbn, 90k tbc 
    Stream #0:1: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, 5.1(side), 448 kb/s 
    Stream #0:2: Audio: dts ([1] [0][0]/0x2001), 48000 Hz, 5.1(side), 768 kb/s 
    Stream #0:3: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, 5.1(side), 448 kb/s 
    Stream #0:4: Audio: ac3 ([0] [0][0]/0x2000), 48000 Hz, stereo, 224 kb/s 
    Stream #0:5: Subtitle: dvd_subtitle 
    Stream #0:6: Subtitle: dvd_subtitle 
    Stream #0:7: Subtitle: dvd_subtitle 
    Stream #0:8: Subtitle: dvd_subtitle 
    Stream #0:9: Subtitle: dvd_subtitle 
    Stream #0:10: Subtitle: dvd_subtitle 
    Stream #0:11: Subtitle: dvd_subtitle 
    Stream #0:12: Subtitle: dvd_subtitle 

完整的命令行

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob -c:v copy -c:a copy -c:s copy -map 0 mymovie.mkv 

任何一個副本可以與編解碼器實際轉換,並有可能壓縮,數據所取代。但是,如果它只是三大副本,則命令可以簡化爲:

./ffmpeg -fflags +genpts -analyzeduration 1000000k -probesize 1000000k -i mymovie.vob -c copy -map 0 mymovie.mkv 

所有這些選項也被avconv支持。但是,這個工具似乎仍然有一些字幕的問題。如果您看到此錯誤:

[matroska @ 0x383aee60] Application provided invalid, non monotonically increasing dts to muxer in stream 7: 58280 >= 58280 
av_interleaved_write_frame(): Invalid argument 

您可以通過下載最新ffmpeg,並使用該工具來代替,正如我上面所解釋的解決方法。

+1

根據我的經驗,ffmpeg在一些輸入上完全扼流(產生無效文件和/或掛起),但我用mkvmerge成功地將它們轉換(重新合併)爲MKV格式,並且它生成了完全正確的文件。雖然我沒有測試它是否也傳輸字幕,但我相信它也應該照顧它們。 –