все. У меня есть источник rtsp, и мне нужно перезагрузить его через мой сервер rtsp. Источник rtsp может передавать аудио/видео, а иногда только видео.GStreamer. Как создать один конвейер для аудио-видеопотока и только видеопотока
Я могу создать конвейер аудио/видео или только конвейер видео. Но я не могу создать рабочий конвейер для этих обоих случаев.
Я подключаю обратный вызов к событию с добавлением пэдов, а затем связываю первый элемент видео и первый аудиоэлемент (если существует звук) с элементом rtspsrc в обратном вызове с добавлением «добавленный». Я создаю/добавляю/добавляю аудио-элементы в обратном вызове с добавлением «добавленных дополнений», но у клиента rtsp нет звука в этом случае.
Пожалуйста, расскажите мне, что не так.
Этот трубопровод хорошо работает с аудио-видео:
Gst.parse_launch(
'(rtspsrc location="rtsp://admin:[email protected]" '
'latency=0 '
'timeout=5000000 '
'name=rtsp_src '
'rtsp_src. '
'! queue'
'! rtph264depay '
'! rtph264pay '
'name=pay0 '
'rtsp_src. '
'! queue'
'! rtppcmudepay '
'! rtppcmupay '
'name=pay1)'
)
ОС: Gentoo, GStreamer: версия 1.6.3, GST-RTSP-сервера: 1.6.2, Python3
Код:
#!/usr/bin/env python3
"""RTSP restreamer based on GStreamer."""
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GObject
loop = GObject.MainLoop()
GObject.threads_init()
Gst.init(None)
class AVPipeline(Gst.Pipeline):
def __init__(self):
Gst.Pipeline.__init__(self)
# rtsp source
rtspsrc = Gst.ElementFactory.make('rtspsrc', None)
rtspsrc.set_property('location', 'rtsp://admin:[email protected]')
rtspsrc.set_property('latency', 500)
rtspsrc.set_property('timeout', 2000000)
self.add(rtspsrc)
self.link(rtspsrc)
rtspsrc.connect('pad-added', self.on_pad_added)
# video
vqueue = Gst.ElementFactory.make('queue', None)
rtph264depay = Gst.ElementFactory.make('rtph264depay', None)
rtph264pay = Gst.ElementFactory.make('rtph264pay', None)
rtph264pay.set_property('name', 'pay0')
rtph264pay.set_property('pt', 96)
self.add(vqueue)
self.add(rtph264depay)
self.add(rtph264pay)
vqueue.link(rtph264depay)
rtph264depay.link(rtph264pay)
self._tolink_video_elem = vqueue
def on_pad_added(self, element, pad):
string = pad.query_caps(None).to_string()
if string.startswith('application/x-rtp'):
if 'media=(string)video' in string:
pad.link(self._tolink_video_elem.get_static_pad('sink'))
print('Video connected')
elif 'media=(string)audio' in string:
# create audio
# Client doesn't get audio when I add audio elements in this point
#audio
aqueue = Gst.ElementFactory.make('queue', None)
rtppcmudepay = Gst.ElementFactory.make('rtppcmudepay', None)
rtppcmupay = Gst.ElementFactory.make('rtppcmupay', None)
rtppcmupay.set_property('name', 'pay1')
self.add(aqueue)
self.add(rtppcmudepay)
self.add(rtppcmupay)
aqueue.link(rtppcmudepay)
rtppcmudepay.link(rtppcmupay)
for elem in (aqueue, rtppcmudepay, rtppcmupay):
elem.sync_state_with_parent()
pad.link(aqueue.get_static_pad('sink'))
print('Audio connected')
class MyRTSPMediaFactory(GstRtspServer.RTSPMediaFactory):
LATENCY = 10000
def __init__(self):
GstRtspServer.RTSPMediaFactory.__init__(self)
self.set_shared(True)
self.set_property('latency', self.LATENCY)
self.set_transport_mode(GstRtspServer.RTSPTransportMode.PLAY)
def do_create_element(self, url):
return AVPipeline()
class Restreamer(object):
def __init__(self, host, port):
self._server = GstRtspServer.RTSPServer()
self._server.set_address(host)
self._server.set_service(str(port))
mount_points = self._server.get_mount_points()
factory = MyRTSPMediaFactory()
mount_points.add_factory('/test', factory)
self._server.attach(None)
def main():
server = Restreamer('0.0.0.0', 9999)
print('Started %s:%s' % (server._server.get_address(),
server._server.get_service()))
loop.run()
if __name__ == '__main__':
main()