Я использую 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:MP2T
(и пакеты PET
, PMT
и все другие виды, связанные с TS)
Мой: IP:UDP:Data
Кажется, что конвейер, который я использую, просто отправляет необработанное видео по UDP без какой-либо коррекции ошибок. Что мне не хватает? Используемые видеоролики представляют собой файлы .mpg
формате h264 или mpeg.
Я использую gstreamer-java для программирования пользовательских элементов UdpSink и UdpSrc, но не могу использовать gstreamer в консоли для тестирования, поскольку стандартный плагин UdpSink не работает. Я попробовал простой конвейер в виртуальной машине Linux и получил пакет, похожий на VLC:
gst-launch-0.10 -v videotestsrc ! mpeg2enc ! mpegtsmux ! udpsink host=192.168.2.100 port=1234