ffmpeg обнаруживает аудиопотоки в случайном порядке

ffmpeg обнаруживает аудиопотоки в случайном порядке

У меня есть программа, которая подключается к живому потоку MPEG-TS и передает его в ffmpeg, который преобразует его в MPEG-DASH.

Входной TS имеет три аудио PID. (Точные аудио PID будут отличаться в зависимости от идентификатора программы и источника потока, поэтому их нельзя жестко закодировать в командной строке). Например:

0x67 Spanish Dubbed Audio "spa/Main Audio"
0x68 Original Audio "qaa/Main Audio"
0x69 Descriptive Audio for visually impaired

Проигрыватель, использующий dash.js, в веб-браузере имеет меню для выбора звуковой дорожки.

Однако, в зависимости от того, когда установлено соединение с потоком MPEG-TS, ffmpeg перечисляет аудио в разных и, по-видимому, случайных порядках. Похоже, что аудиодорожки назначаются на выходе по возрастанию индекса "входного потока". Например:

Output Stream mapping:
  Stream #0:18 (mpeg2video) -> scale (graph 0)
  scale (graph 0) -> Stream #0:0 (libx264)
  Stream #0:9  -> #0:1 (mp2 (native) -> aac (native))
  Stream #0:13 -> #0:2 (mp2 (native) -> aac (native))
  Stream #0:17 -> #0:3 (mp2 (native) -> aac (native))

назначается после сканирования ввода назначает spa/spa/qaa:

  Stream #0:9[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
  Stream #0:13[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
  Stream #0:17[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s

Запустив его еще несколько раз, мы всегда увидим разное обнаружение ввода:

  Stream #0:8[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)
  Stream #0:15[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
  Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
  
  Stream #0:10[0x68](qaa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 128 kb/s
  Stream #0:17[0x67](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, fltp, 192 kb/s
  Stream #0:22[0x69](spa): Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, mono, fltp, 96 kb/s (visual impaired) (descriptions)

Как мне добиться ffmpegсоздания согласованного отображения ввода-вывода? В идеале — по возрастающему номеру PID.

РЕДАКТИРОВАТЬ I

Я не думаю, что это действительно относится к моему вопросу, но вот командная строка для тех, кому интересно... ffmpegчитает из канала. Канал пишется моей программой, получающей канал.

ffmpeg -re -f mpegts -i pipe:10 -ignore_unknown \
  -map 0:p:510 -map -0:s -map -0:d \
  -filter_complex [p:510:v]scale=640:-1 -r 25 -force_key_frames expr:gte(t,n_forced*1) \
  -c:v libx264 -b:v 1M -x264-params scenecut=0 -threads 2 \
  -c:a aac -b:a 64k -ac 2 \
  -f dash -dash_segment_type mp4 -movflags +delay_moov \
    -seg_duration 2.000000 -frag_type duration -frag_duration 0.200000 \
    -index_correction 1 -target_latency 5 -window_size 10 -extra_window_size 5 \
    -remove_at_exit 1 -streaming 1 -ldash 1 -use_template 1 -use_timeline 0 \
    -write_prft 1 -avioflags direct -fflags +nobuffer+flush_packets \
    -format_options movflags=+cmaf -utc_timing_url \
    /web/be/time.php /var/ott/session_9733/master.mpd'

решение1

MPEG-TS — это транспортный поток, т.е. текущий поток, поэтому порядок потоков устанавливается порядком, в котором демультиплексор встречает пакеты PES. Это нельзя изменить.


Что вы можете сделать, так это заменить текущую позитивную карту -map 0:p:510на-map 0:p:510:v -map 0:p:510:a:m:language:qaa -map 0:p:510:a:m:language:spa

У меня нет MPTS-канала для работы, поэтому в настоящее время я не могу проверить синтаксис.

решение2

Из ответа Гьяна, ffmpegперечисляет потоки, как они их видят. Поэтому с MPTS (многопрограммный транспортный поток) нет способа легко выбрать потокиобеспечить определенный порядок потоков (на основе номера PID)

Поэтому программа должна сначала самостоятельно просканировать TS, чтобы построить список видео и аудио PID. Затем использовать эти PID в цикле для построения ffmpegкомандной строки.

Вот построенная командная строка:

ffmpeg -re -loglevel verbose \
   -f mpegts -i inputFile.ts -ignore_unknown \
   -map 0:v:i:101 \
   -map 0:a:i:103 -metadata:s:a:0 title='Main' \
   -map 0:a:i:104 -metadata:s:a:1 title='Main' \
   -map 0:a:i:105 -metadata:s:a:2 title='Visual impaired commentary' \
   -map -0:s -map -0:d \
   -filter_complex [p:510:v]scale=640:-1 \
   -r 25 -force_key_frames expr:gte\(t,n_forced*1\) \
   -c:v libx264 -b:v 1M -x264-params scenecut=0 \
   -threads 2 -c:a aac -b:a 64k -ac 2 \
   -f dash -dash_segment_type mp4 -movflags +delay_moov -seg_duration 2.000000 \
   -frag_type duration -frag_duration 0.200000 -index_correction 1 \
   -target_latency 5 -window_size 10 -extra_window_size 5 -remove_at_exit 1 \
   -streaming 1 -ldash 1 -use_template 1 -use_timeline 0 -write_prft 1 \
   -avioflags direct -fflags +nobuffer+flush_packets -format_options movflags=+cmaf \
   -utc_timing_url /time.php \
   /tmp/master.mpd

Связанный контент