Gstreamer: udpsink / udpsrc против tcpserversink / tcpclientsrc - PullRequest
0 голосов
/ 27 мая 2018

Я очень новичок в gstreamer, но после многих исследований мне удалось создать собственный рабочий конвейер, транслирующий веб-камеру по сети от Raspberry PI Zero на ПК через транспорт UDP.Я доволен своим прогрессом!:)

Но я изо всех сил пытаюсь создать транспорт TCP ...

Этот конвейер отлично работает по UDP: ( примечание: упрощено с использованием тестового источника видео и кодировки JPEG ):

Server UDP (192.168.2.1):
gst-launch-1.0 videotestsrc is-live=true ! jpegenc ! rtpjpegpay  ! udpsink host=192.168.2.13  port=7001

Client UDP (192.168.2.13):
gst-launch-1.0 udpsrc port=7001 ! application/x-rtp,encoding-name=JPEG ! rtpjpegdepay ! jpegdec ! autovideosink

... но когда я использую приемник / источник TCP с точно такими же элементами я получаю только ошибки.

Модифицированныйконвейер с использованием tcpserversink и tcpclientsrc :

Server TCP (192.168.2.1):
gst-launch-1.0 videotestsrc is-live=true ! jpegenc ! rtpjpegpay  ! tcpserversink port=7001

Client TCP (192.168.2.13):
gst-launch-1.0 tcpclientsrc host=192.168.2.1 port=7001 ! application/x-rtp,encoding-name=JPEG ! rtpjpegdepay ! jpegdec ! autovideosink

Попытка 1: порт tcpserversink = 7001

ERROR: Failed to connect to host '192.168.2.1:7001': No connection could be made because the target machine actively refused it.

Попытка 2: хост tcpserversink = порт локального хоста = 7001

ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Could not open resource for reading.

Попытка 3: хост tcpserversink = 127.0.0.1 порт = 7001

ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Could not open resource for reading.

Попытка 4: хост tcpserversink = 192.168.2.1 порт = 7001

ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Internal data stream error.

Попытка 5: хост tcpserversink = 0.0.0.0 порт = 7001

ERROR: from element /GstPipeline:pipeline0/GstTCPClientSrc:tcpclientsrc0: Internal data stream error.

Я подумал, что смогу заменить элементы src & sink без разрыва трубопровода, так что я просто что-то упустил.

Я был бы благодарен за любой светты не мог бы пролить это.

1 Ответ

0 голосов
/ 03 сентября 2018

Вы можете решить это одним из двух способов (как минимум).Первый - добавить элемент rtpstreampay после загрузчика rtp для вашего медиа-типа.

https://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-good/html/gst-plugins-good-plugins-rtpstreampay.html

сервер:

gst-launch-1.0 videotestsrc is-live=true \
    ! jpegenc \
    ! rtpjpegpay \
    ! rtpstreampay \
    ! tcpserversink port=7001

клиент:

gst-launch-1.0 tcpclientsrc port=7001 \
    ! application/x-rtp-stream,encoding-name=JPEG \
    ! rtpstreamdepay \
    ! rtpjpegdepay \
    ! jpegdec \
    ! autovideosink

Второй способ - использовать мультиплексор, а не платный загрузчик rtp, что-то вроде matroskamux, который довольно универсален.

сервер:

gst-launch-1.0 videotestsrc is-live=true \
    ! jpegenc \
    ! matroskamux \
    ! tcpserversink port=7001

клиент:

gst-launch-1.0 tcpclientsrc port=7001 \
    ! matroskademux \
    ! jpegdec \
    ! autovideosink

Возможно, вы также захотите заглянуть в GstRtspServer, если хотите установить rtp-соединения клиент / сервер.Простой скрипт Python, подобный этому, будет выступать в роли сервера.

rtspserver.py

import gi
gi.require_version('Gst','1.0')
gi.require_version('GstRtspServer','1.0')
from gi.repository import Gst, GObject, GstRtspServer

Gst.init(None)
mainloop = GObject.MainLoop()
server = GstRtspServer.RTSPServer()
factory = GstRtspServer.RTSPMediaFactory()
factory.set_launch((
    'videotestsrc is-live=true '
    '! jpegenc '
    '! rtpjpegpay name=pay0 pt=26'
))
# allow multiple connections
factory.set_shared(True)
mounts = server.get_mount_points()
mounts.add_factory('/live', factory)
server.attach(None)
mainloop.run()

И вы можете использовать такой конвейер для просмотра вывода.

gst-launch-1.0 \
    rtspsrc location=rtsp://localhost:8554/live latency=100 \
    ! rtpjpegdepay \
    ! jpegdec \
    ! autovideosink
...