GStreamer RTSP server 로 스트리밍 해보자.

Streaming

이 포스트는 딥러닝을 위해 nvidia의 DeepStreamer SDK를 연구하려다가 DeepStreamer이 GStreamer 기반에 Deeplearning을 추가한 시스템이라고 해서 비디오 서버를 만들기 위한 조사 겸 확인한 자료로 만들어 본 것입니다.

Overview

  1. ubuntu에서 GStreamer 및 Gst RTSP server을 설치합니다.
  2. ubuntu에서 python을 통해 Gst RTSP server을 통해 스트리밍을 해봅니다.

Index

  1. GStreamer 및 Gst RTSP server 설치
    1. GStreamer install
    2. Gst_RTSP_server install
  2. GStremer RTSP server를 python을 통해 스트리밍하기
    1. Streaming server 예제 소스 분석

GStreamer 및 Gst RTSP server 설치

  1. GStreamer 및 Gst RTSP server 설치

    1. GStreamer install

      1. 설치 확인 우분투의 경우 GStreamer가 기본으로 깔려 있는 경우가 종종 있기 때문에 설치가 되어 있는지 부터 확인해 봅시다. 커맨드 창에 아래와 같이 입력했을때

        $ which gst-launch-1.0

        아래와 같이 응답이 돌아오면 설치가 되어 있는 것입니다.

        /usr/bin/gst-launch-1.0

      2. 패키지 설치 GStreamer 라이브러리를 설치합니다.

        sudo apt-get install libgstreamer1.0-0 sudo apt-get install gstreamer1.0-plugins-base gstreamer1.0-plugins-good sudo apt-get install gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly sudo apt-get install gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools

        우리는 파이썬에서 GStreamer를 사용할 것이니 파이선 패키지도 설치해줍니다.

        sudo apt-get install python-gst-1.0 python3-gst-1.0

        마무리로 dev-packages까지 설치 완료되면 GStreamer의 설치가 완료됩니다.

        sudo apt-get install libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev sudo apt-get install libfontconfig1-dev libfreetype6-dev libpng-dev sudo apt-get install libcairo2-dev libjpeg-dev libgif-dev sudo apt-get install libgstreamer-plugins-base1.0-dev

      3. 설치 테스트 커맨드 창에 아래와 같이 입력해봅시다.

        $ gst-launch-1.0 videotestsrc ! autovideosink

        새 창이 뜨면서 아래와 같이 영상이 출력되면 설치 완료!

        AltTag AlanWake's Photo

    2. Gst_RTSP_server install 보통 GStreamer RTSP server 설치를 찾아보면 사이트에 위에 까지만 나와있습니다. 와 설치 완료되었구나! 하고 GStreamer RTPS server을 돌리게 되면 아래와같은 에러와 마주하게 됩니다.

      ImportError: cannot import name GstRtspServer, introspection typelibnot found

      저는 덕분에 엄청 고생을 했는데.. 위의 설치 만으로는 GstRtspServer이설치되지 않기 때문입니다. gir1.2-gst-rtsp-server-1.0 패키지를 설치해야 GstRtspServer이 가동이 가능하게 됩니다.

      1. gir1.2-gst-rtsp-server-1.0 패키지 설치 커맨드 창에 아래와 같이 입력합니다. > $ sudo apt-get install gir1.2-gst-rtsp-server-1.0

        축하합니다 GStreamer RTSP server 가동 준비가 완료되었습니다!
        정말 별거 아닌건데 이 하나때문에 필자는 몇시간을 날렸습니다...
        


  2. GStremer RTSP server를 python을 통해 스트리밍하기

    1. Streaming server 예제 소스 분석 이 예제 소스는 출처test_gst_rtsp_subtitles_server.py 입니다.

      import sys
      import gi
      gi.require_version('Gst', '1.0')
      from gi.repository import Gst, GstRtspServer, GObject
      
      if __name__ == '__main__':
      	loop = GObject.MainLoop()
      	GObject.threads_init()
      	Gst.init(None)
      
      	class MyFactory(GstRtspServer.RTSPMediaFactory):
      		def __init__(self):
      			GstRtspServer.RTSPMediaFactory.__init__(self)
      
      		def do_create_element(self, url):
      			spec = """
      			filesrc location=test.mp4 ! qtdemux name=demux
      			demux.video_0 ! queue ! rtph264pay pt=96 name=pay0
      			demux.audio_0 ! queue ! rtpmp4apay pt=97 name=pay1
      			demux.subtitle_0 ! queue ! rtpgstpay pt=98 name=pay2
      			"""
      			return Gst.parse_launch(spec)
      
      	class GstServer():
      		def __init__(self):
      			self.server = GstRtspServer.RTSPServer()
      			self.server.set_service("3002")
      			f = MyFactory()
      			f.set_shared(True)
      			m = self.server.get_mount_points()
      			m.add_factory("/test", f)
      			self.server.attach(None)
      
      	s = GstServer()
      	loop.run()
      

      참 간단하게 생긴 소스인데 처음 보는 사람은 이게 뭐지? 하고 멍해질 수 밖에 없다. 설명도 없고.. 해서 분석한 바를 적어보도록 하겠습니다.

      #import 하는 부분은 다들 아실테니 넘어가고
      import sys
      import gi
      gi.require_version('Gst', '1.0')
      from gi.repository import Gst, GstRtspServer, GObject
      #메인이 시작됩니다.
      if __name__ == '__main__':
          #루프를 선언하는데 이게 GstRtspServer의 루프입니다.
      	loop = GObject.MainLoop()
      	GObject.threads_init()
      	Gst.init(None)
      
      	class MyFactory(GstRtspServer.RTSPMediaFactory):
      		def __init__(self):
      			GstRtspServer.RTSPMediaFactory.__init__(self)
              #팩토리에 들어갈 영상의 파이프라인을 설정하는 부분입니다.
              #아래에서 해당 함수를 콜하는 부분이 없지만 init 될때와 서버가
              #기동해서 루프돌고 있을때 참조해서 가동하게 됩니다.
      		def do_create_element(self, url):
      			#여기에 파이프라인을 형성할 영상의 주소와 그 설정을 넣게 됩니다.
                  spec = """
      			filesrc location=test.mp4 ! qtdemux name=demux
      			demux.video_0 ! queue ! rtph264pay pt=96 name=pay0
      			demux.audio_0 ! queue ! rtpmp4apay pt=97 name=pay1
      			demux.subtitle_0 ! queue ! rtpgstpay pt=98 name=pay2
      			"""
      			return Gst.parse_launch(spec)
      
        	class GstServer():
      		def __init__(self):
                  #GstRtspServer를 클래스 내에서 선언하고
      			self.server = GstRtspServer.RTSPServer()
                  #포트를 지정해줍니다.
      			self.server.set_service("3002")
                  #팩토리를 생성하는데 이 부분은 위의 MyFactory 클래스에서 설명하겠습니다.
      			f = MyFactory()
                  #이 팩토리를 공유 할것이라 설정하고
      			f.set_shared(True)
                  #서버 마운트 포인트를 선언하고
      			m = self.server.get_mount_points()
                  #마운트 포인트에 주소와 공유할 팩토리를 넣어줍니다.
      			m.add_factory("/test", f)
      			self.server.attach(None)
      
          # GstServer 클래스로 서버 설정을 마치고
      	s = GstServer()
          #서버 루프를 돌립니다.
      	loop.run()
      

      어때요? 참 쉽죠? Gst RTSP server 을 활용하면

      cctv > RTSP 릴레이 서버 > 클라이언트 영상저장장치 > Video 서버 > 클라이언트

      등의 시스템을 구성할 수 있습니다. 간편하면서도 꽤 빠른 시스템을 구성할 수 있습니다.

이상으로 GStreamer RTSP server로 영상을 스트리밍 하는 기초에 대해 알아보았습니다. 나중에 DeepStreamer에 대해도 포스트 해 보겠습니다.