2017-01-20 10 views
0

все. У меня есть источник 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() 

ответ