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
задан 29 December 2018 в 12:50

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, или чуть более чем 100 миллионов. DTS средство, Декодирующее Метку времени (я верю на ffmpeg учебное руководство), и, находится в секундах. Новый поток в 40 471,3 секунды, по сравнению с DTS приблизительно 40 328,6 секунд в начале видео, таким образом, новый поток составляет приблизительно 147,7 секунд в.

Так, Вы хотите искать по крайней мере 101 миллион байтов и 150 миллионов микросекунд во входное видео. Вставьте эти опции перед -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

[Примечание: новая команда не протестировала, так как у меня нет Вашего входного файла.]

1
ответ дан 7 December 2019 в 15:09

Другие вопросы по тегам:

Похожие вопросы: