이 포스트는 딥러닝을 위해 nvidia의 DeepStreamer SDK를 연구하려다가 DeepStreamer이 GStreamer 기반에 Deeplearning을 추가한 시스템이라고 해서 비디오 서버를 만들기 위한 조사 겸 확인한 자료로 만들어 본 것입니다.
Overview
- ubuntu에서 GStreamer 및 Gst RTSP server을 설치합니다.
- ubuntu에서 python을 통해 Gst RTSP server을 통해 스트리밍을 해봅니다.
Index
GStreamer 및 Gst RTSP server 설치
-
GStreamer 및 Gst RTSP server 설치
-
-
설치 확인 우분투의 경우 GStreamer가 기본으로 깔려 있는 경우가 종종 있기 때문에 설치가 되어 있는지 부터 확인해 봅시다. 커맨드 창에 아래와 같이 입력했을때
$ which gst-launch-1.0
아래와 같이 응답이 돌아오면 설치가 되어 있는 것입니다.
/usr/bin/gst-launch-1.0
-
패키지 설치 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
-
설치 테스트 커맨드 창에 아래와 같이 입력해봅시다.
$ gst-launch-1.0 videotestsrc ! autovideosink
새 창이 뜨면서 아래와 같이 영상이 출력되면 설치 완료!
-
-
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이 가동이 가능하게 됩니다.
-
gir1.2-gst-rtsp-server-1.0 패키지 설치 커맨드 창에 아래와 같이 입력합니다. > $ sudo apt-get install gir1.2-gst-rtsp-server-1.0
축하합니다 GStreamer RTSP server 가동 준비가 완료되었습니다! 정말 별거 아닌건데 이 하나때문에 필자는 몇시간을 날렸습니다...
-
-
-
GStremer RTSP server를 python을 통해 스트리밍하기
-
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에 대해도 포스트 해 보겠습니다.