2017-01-20 4 views
0

tous. J'ai une source rtsp et j'ai besoin de la réorganiser via mon serveur rtsp. La source rtsp peut diffuser de l'audio/vidéo et parfois uniquement de la vidéo.GStreamer. Comment créer un pipeline pour le flux audio-vidéo et seulement le flux vidéo

Je peux créer un pipeline audio/vidéo ou uniquement un pipeline vidéo. Mais je ne peux pas créer un pipeline de travail pour ces deux cas. Je connecte le rappel à l'événement 'pad-added' puis j'associe le premier élément vidéo et le premier élément audio (si l'audio existe) à l'élément rtspsrc dans le rappel 'pad-added'. Je crée/ajoute/lie des éléments audio dans le rappel 'pad-added' mais le client rtsp n'a pas d'audio dans ce cas.

Dites-moi ce qui ne va pas.

Ce pipeline fonctionne bien avec audio-vidéo:

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)' 
) 

OS: gentoo, GStreamer: la version 1.6.3, gst-rtsp-serveur: 1.6.2, python3

code:

#!/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() 

Répondre