gpt4 book ai didi

ffmpeg - 使用avconv将带字幕的DVD图像转换为MKV

转载 作者:行者123 更新时间:2023-12-01 22:18:07 25 4
gpt4 key购买 nike

这是我知道的将DVD图像转换为另一种视频格式(例如MP4)的过程:

  • VTS_01_文件夹内的.VOB n个VIDEO_TS文件(对于n> = 0)连接为单个VOB文件。
  • 使用avconvffmpeg将该VOB转换为另一种格式。

  • 到目前为止,到目前为止还不错,但是现在我想将DVD图像 字幕进行转换。据我所知,MKV格式支持字幕,因此这似乎是一个显而易见的选择。另外,我可能会在硬字幕(字幕作为视频图像的一部分)中使用任何其他格式。

    但是,DVD镜像中的字幕编码是 dvdsub,并且出现以下错误
    Only SUBTITLE_ASS type supported.
    Subtitle encoding failed

    但是,当运行 avconv -codecs时,我得到:
    ...
    DES dvdsub DVD subtitles
    ...

    以及 -c:s copy开关虽然可以防止命令失败,但似乎并不会产生播放器可以理解的字幕。

    因此,如何使用 assdvdsub创建 avconv字幕?

    我的VOB文件具有八个字幕通道和两个音频通道。 Ubuntu视频应用程序不显示任何字幕,并且只有第一个音频通道似乎可以正常工作,DVD图像是否可能损坏。

    对于双层DVD,另一个文件显示字幕编码错误,但是当使用 -c:s copy开关时,它进一步显示:
    Application provided invalid, non monotonically increasing dts to muxer in stream 2: 49 >= 49
    av_interleaved_write_frame(): Invalid argument

    预先感谢您提供有关解决这些问题的任何想法。

    (我正在使用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

    最佳答案

    简短答案:跳至部分完整命令行,然后从this site下载ffmpeg

    最初,我计划用avconv回答如何执行此操作,因为(a)答案仍不存在,并且(b)avconv似乎是当今ubuntu系统上的默认设置。但是,似乎目前尚无法解决此问题-至少对于我的测试用例而言。

    ffmpeg设置

    由于您询问avconvffmpeg,并且我刚刚了解到avconvffmpeg的分支(请参阅this answer进行讨论),因此我从this site下载了ffmpeg的当前版本,如上述答案所述。 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
  • ,而不是仅使用第一个,而是使用并复制所有-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)具有 header (文件开头的数据),列出文件的所有内容。这使得播放器和转换工具很容易知道需要什么样的数据。 .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并改用该工具来解决。

    关于ffmpeg - 使用avconv将带字幕的DVD图像转换为MKV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19200790/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com