ffmpeg:如何包含稍后启动的 dvb 字幕流?

ffmpeg:如何包含稍后启动的 dvb 字幕流?
$ ffmpeg -i fa1.m2t -ss 0:02:22 -to 01:34:17 -map 0:1 -map 0:2 -map 0:6? -c:v libx265 -crf 28 -preset ultrafast -c:a aac -b:a 128k -c:s copy fa1.mkv

这些流包括:

Input #0, mpegts, from 'fa1.m2t':
  Duration: 01:43:54.32, start: 40328.578578, bitrate: 5611 kb/s
  Program 25 
    Stream #0:0[0x33](fin): Subtitle: dvb_teletext ([6][0][0][0] / 0x0006)
    Stream #0:1[0x13a]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(tv, bt709, top first), 1920x1080 [SAR 1:1 DAR 16:9], Closed Captions, 25 fps, 25 tbr, 90k tbn, 50 tbc
    Stream #0:2[0x366](swe): Audio: ac3 ([6][0][0][0] / 0x0006), 48000 Hz, stereo, fltp, 448 kb/s
    Stream #0:3[0x369](dut): Audio: ac3 ([6][0][0][0] / 0x0006), 48000 Hz, stereo, fltp, 192 kb/s (visual impaired)
    Stream #0:4[0xc38](swe): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006)
    Stream #0:5[0xc4f](swe): Subtitle: dvb_subtitle ([6][0][0][0] / 0x0006) (hearing impaired)
File 'fa1.mkv' already exists. Overwrite ? [y/N] y

但我想要的字幕流是#0:6,它开始得晚一些......

Output #0, matroska, to 'fa1.mkv':
  Metadata:
    encoder         : Lavf57.83.100
    Stream #0:0: Video: hevc (libx265), yuv420p, 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 25 fps, 1k tbn, 25 tbc
    Metadata:
      encoder         : Lavc57.107.100 libx265
    Stream #0:1(swe): Audio: aac (LC) ([255][0][0][0] / 0x00FF), 48000 Hz, stereo, fltp, 128 kb/s
    Metadata:
      encoder         : Lavc57.107.100 aac
[mpegts @ 0x561dd54e9ae0] New subtitle stream 0:6 at pos:100252692 and DTS:40471.3s    
frame=  638 fps= 28 q=-0.0 Lsize=    3587kB time=00:00:25.40 bitrate=1156.9kbits/s speed=1.11x  

那么,我怎样才能将此流 #0:6 包含到电影中?它在录制开始时并不存在。

答案1

使用ffmpeg-probesize强制选择ffmpeg在输入文件中搜索足够的字节,并选择-analyzeduration强制其搜索足够的秒数。

ffmpeg 文档,19格式选项解释选项。每个选项都采用整数参数,后缀如M表示百万,G表示十亿。 参数 指定要-probesize搜索多少字节(默认值:5 百万)。 参数-analyzeduration指定要搜索多少微秒(默认值:5 百万微秒,或 5 秒)。在这两种情况下,它们都从输入文件的开头开始测量。当这两个参数中较早的一个到期时,搜索结束。将这些选项放在-i命名输入文件的参数之前。

您的示例显示了有关新流开始的消息:

New subtitle stream 0:6 at pos:100252692 and DTS:40471.3s

pos是字节数。新流为 100,252,692,即刚好超过 1 亿。DTS表示解码时间戳(我相信,根据ffmpeg教程),单位为秒。新流为 40,471.3 秒,而视频开始时的 DTS 约为 40,328.6 秒,因此新流约为 147.7 秒。

因此,您需要在输入视频中搜索至少 1.01 亿字节和 1.5 亿微秒。在 之前插入这些选项-i fa1.m2t,得到:

$ ffmpeg -probesize 101M -analyzeduration 150M -i fa1.m2t -ss 0:02:22 -to 01:34:17 -map 0:1 -map 0:2 -map 0:6? -c:v libx265 -crf 28 -preset ultrafast -c:a aac -b:a 128k -c:s copy fa1.mkv

[注意:新命令未经测试,因为我没有您的输入文件。]

相关内容