Как передавать MPEG-TS по UDP?

Я использую gstreamer для потоковой передачи через пользовательский AppSink, который имитирует UdpSink. Мы делаем это таким образом, чтобы мы могли включить прослушивание других портов для некоторых метаданных. Плюс, акции UdpSink сломан. В любом случае, я успешно потоковое видео, но UDP пакеты не правильно упакован. Мне интересно, пропустил ли я какой-то шаг.

вот мой конвейер отправки:

filesrc (mpeg TS file) ! displayQueue ! streamTee ! tsdemux ! decoder ! videosink

streamTee ! sendQueue ! udpSink (our custom one)

получение конец:

UdpSrc (custom) ! queue ! mpegtsdemux ! queue ! (mpegdecode || h264decode) ! ... ! videosink

потокового работ. Но он кажется очень хрупким. Иногда это просто останавливается. Здесь много артефактов.

Итак, я попробовал VLC. Я поставил его на поток по UDP одноадресная. Отлично работает. Я заметил, что VLC отправляет видео не так, как мой конвейер. Я использовал Wireshark для анализа пакетов:

протоколы, используемые:
VLC:IP:UDP:MP2TPET,PMT пакеты и все другие виды материалов, связанных с TS)

шахты: IP:UDP:Data

похоже, что конвейер, который я использую, просто отправляет необработанное видео по UDP без исправления ошибок. Что мне здесь не хватает? Используемые видео h264 или mpeg кодируются .mpg файлы.

Я использую gstreamer-java для программирования пользовательских элементов UdpSink и UdpSrc, но не могу использовать gstreamer в консоли для тестирования со склада udpsink плагин сломан. Я попробовал простой конвейер в виртуальной машине Linux и получил такую же кучу пакетов, как VLC:

gst-launch-0.10 -v videotestsrc ! mpeg2enc ! mpegtsmux ! udpsink host=192.168.2.100 port=1234

30
задан Nick
04.02.2023 1:01 Количество просмотров материала 2680
Распечатать страницу

1 ответ

Это просто мысль, я не очень хорошо знаком с gstreamer, поэтому я не знаю, как filesrc работает, но я предполагаю, что он не понимает MPEG-TS. MPEG-TS требует, чтобы пакеты входили на определенных границах (обычно 188 байт). Я бы попытался поместить ваш тройник после демукса, а затем добавить mpegtsmux перед вашим udpSink.

Я понимаю, что это будет делать больше работы, чем действительно необходимо (demux только для mux снова), но это обеспечит выравнивание пакетов правильно. Если он работает и вы должны устранить накладные расходы, необходимо разобраться в реализации умнее исходный файл.

1
отвечен heavyd 2023-02-05 08:49

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх