2017-01-20 5 views
0

모두. 나는 rtsp 소스를 가지고 있으며, 내 rtsp 서버를 통해 그것을 복원해야합니다. rtsp 소스는 오디오/비디오 및 때로는 비디오 만 스트리밍 할 수 있습니다.GStreamer. 오디오 - 비디오 스트림과 비디오 스트림 모두에 대해 하나의 파이프 라인을 만드는 방법

오디오/비디오 파이프 라인 또는 비디오 파이프 라인 만 만들 수 있습니다. 그러나이 두 가지 경우 모두 작동하는 파이프 라인을 만들 수 없습니다.

'pad-added'이벤트에 콜백을 연결 한 다음 첫 번째 비디오 요소와 첫 번째 오디오 요소 (오디오가있는 경우)를 '패드가 추가 된'콜백의 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)' 
) 

OS : 젠투, 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() 

답변