gstreamer-tsdemux не обнаруживает все потоки - PullRequest
0 голосов
/ 07 августа 2020

Мне нужно демультиплексировать и мультиплексировать поток с помощью gstreamer (все проверено с версией 1.10.4 на CentOS и 1.14.1 на Ubuntu) Это означает, что у меня есть один входной поток mpegts, и мне нужно вывести один поток с видео / аудио и один с метаданными klv.

Если мои входные потоки состоят именно из этих элементов (видео, аудио и поток метаданных klv), все работает как и ожидалось, и я могу отправить свое видео / аудио и свои метаданные klv в два разных приемника udp.

Теперь мы получаем потоки mpegts, в которых есть дополнительные неизвестные двоичные потоки (они нам не интересны). Вот вывод ffprobe

Рабочий поток

Stream #0:0[0x100]: Video: h264 (Main) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1088, 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x101]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 128 kb/s
Stream #0:2[0x102]: Data: klv (KLVA / 0x41564C4B)

дополнительные потоки, не работающие

Stream #0:0[0x12c]: Video: h264 (High) ([27][0][0][0] / 0x001B), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 25 fps, 25 tbr, 90k tbn, 50 tbc
Stream #0:1[0x12d]: Audio: mp2 ([3][0][0][0] / 0x0003), 48000 Hz, stereo, s16p, 256 kb/s
Stream #0:2[0x5]: Data: bin_data ([6][0][0][0] / 0x0006)
Stream #0:3[0x262]: Data: bin_data (FBID / 0x44494246)
Stream #0:4[0x258]: Data: klv (KLVA / 0x41564C4B)

как вы можно увидеть, что два неизвестных потока идут перед потоком klv.

Я зарегистрировал обратные вызовы tsdemux pad-added и no-more-pads.

С рабочим потоком gstreamer вызывает pad-added три раза (один раз для каждого потока), а затем no-more-pads один раз. Все, как я ожидал.

При нерабочем потоке gstreamer вызывает pad-added два раза (для первых двух потоков), а затем no-more-pads один раз.

Кажется, tsdemux перестает искать для потоков / возможных контактных площадок, как только он столкнется с одним потоком, с которым не может справиться. Я ожидал, что он будет продолжать поиск, пока не закончатся доступные потоки.

EDIT Я добавил журнал отладки из gstreamer

mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0005, stream_type:0x006
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0005, registration_id 00000000 (....)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x6a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x7a in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x56 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0005 (stream_type 0x06)
mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0262, stream_type:0x006
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0262, registration_id 46424944 (FBID)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x6a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x7a in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x56 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0262 (stream_type 0x06)
mpegtsbase mpegtsbase.c:532:mpegts_base_program_add_stream:[00m pid:0x0258, stream_type:0x015
mpegtsbase mpegtsbase.c:557:mpegts_base_program_add_stream:[00m PID 0x0258, registration_id 4b4c5641 (KLVA)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x0a in stream 0x0258 (stream_type 0x15)
mpegtsbase mpegtsbase.c:291:mpegts_get_descriptor_from_stream:[00m Searching for tag 0x59 in stream 0x0258 (stream_type 0x15)
tsdemux tsdemux.c:1639:create_pad_for_stream:[00m Non-media stream (stream_type:0x15). Not creating pad

кажется, что tsdemux действительно видит все потоки, но почему-то отказывается создавать площадку для потока klv. Если мы посмотрим только на вывод ffprobe, потоки выглядят одинаково, но я смотрю журнал gstreamers и замечаю, что поток klv имеет разные типы потоков . рабочий поток имеет stream_type=0x06, тогда как другой поток имеет stream_type=0x15. Проверка типов потоков в Википедии сообщает:

  • 0x06 = ITU-T Rec. H.222 and ISO/IEC 13818-1 (MPEG-2 packetized data) privately defined (i.e., DVB subtitles/VBI and AC-3)
  • 0x15 = Packetized metadata

Не совсем уверен, что мне делать this.

К сожалению, этот входной поток не находится под нашим контролем, поэтому мы не можем его изменить. Если мы хотим использовать более новую версию gstreamer, нам придется скомпилировать ее самостоятельно.

Что мы можем сделать, чтобы успешно получить поток klv? Это действительно желаемое поведение tsdemux?

EDIT 2 Похоже, это сводится к синхронному и асинхронному klv как , описанному imploTv . Где тип синхронного потока - 0x15, а тип асинхронного потока - 0x06. К сожалению, tsdemux не может обрабатывать синхронные потоки klv, как описано в их списке рассылки и патче unmerged в gitlab. . Так что мне, вероятно, нужно взглянуть либо на ffmpeg / libavformat, либо, возможно, на другой плагин gstreamer (если он существует)

1 Ответ

0 голосов
/ 13 августа 2020

Как я уже упоминал в вопросе, tsdemux gstreamer не может обрабатывать синхронные данные KLV. Это приводит к следующим возможностям:

Поскольку моих знаний C и gstreamer недостаточно, чтобы продолжить работу с первыми двумя вариантами, я остановился на третьем варианте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...