gstreamer 기초부터 문법은 아래 튜토리얼 링크와 개념을 설명 해 둔 다양한 블로그에서 자세히 볼 수 있다.
튜토리얼 : https://gstreamer.freedesktop.org/documentation/tutorials/index.html?gi-language=python
개념 설명 블로그 : https://medium.com/may-i-lab/gstreamer-gstreamer-%EA%B8%B0%EC%B4%88-da5015f531fc
gstreamer는 우분투에 기본적으로 설치되어 있는 경우도 있기 때문에 확인이 필요하다.
which gst-launch-1.0
해당 명령어를 입력했을 때
/usr/bin/gst-launch-1.0
위와 같이 나온다면 우분투에 gstreamer가 설치가 되어 있는 것이다.
1. Gstreamer 설치
하지만 /usr/bin/ 이 아니라 /anaconda3/ 경로로 gst-launch-1.0이 뜬다면 올바른 경로에 설치된 것이 아니다. 따라서 user 게정에서 앞으로 진행될 설치 과정을 거친다 해도 제대로 gstreamer가 작동하지 않는다.
때문에 이런 경우에는 root 계정에서 gstreamer를 설치하여 root 계정으로 실행시키는 것이 내가 찾은 해결법이었다.
(더 좋은 방법이 있을까..? gstreamer를 사용하여 스트리밍을 할 때 마다 root 계정으로 바꾸는 것이 꽤나 번거롭다...)
gstreamer가 설치되어 있지 않을 땐 아래 명령어를 순서대로 입력하여 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
python에서 gstreamer를 사용하기 위해 python 패지도 설치 해야한다.
sudo apt-get install python-gst-1.0 python3-gst-1.0
마지막으로 dev-packages까지 설치한 후 apt update와 upgrade를 해 주면 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
추가로 rtsp 서버 스트리밍을 위해 아래까지 설치를 해주면 별 다른 오류 없이 gstreamer를 사용할 수 있다.
sudo apt-get install gir1.2-gst-rtsp-server-1.0
설치를 완료한 후 터미널 창에 아래의 명령어를 입력했을 때
gst-launch-1.0 videotestsrc ! autovideosink
위와 같은 화면이 뜨면 제대로 설치가 된 것이다.
간혹 위의 설치 과정을 거치지 않고도 videotestsrc ! autovideosink 를 입력했을 때 위 화면이 뜨는 경우가 있는데
저 화면이 뜬다고 해서 gstreamer 라이브러리가 전부 설치된 것은 아니다.
2. Gstreamer를 사용하여 RTSP 서버 스트리밍
import gi
gi.require_version('Gst', '1.0')
gi.require_version('GstRtspServer', '1.0')
from gi.repository import Gst, GstRtspServer, GObject, GLib
if __name__ == '__main__':
loop = GLib.MainLoop()
GObject.threads_init()
Gst.init(None)
class RTSPFactory(GstRtspServer, RTSPMediaFactory):
def __init__(self, **properties):
GstRtspServer.RTSPMediaFactory.__init__(self)
def do_create_element(self, url):
pipeline = "rtspsrc location=rtsp://<IP Camera rtsp address> latency=0 ! rtph264depay ! h264parse ! rtph264pay name=pay0 pt=96" # h264 format -> h264 format
return Gst.parse_launch(pipeline)
class GstServer():
def __init__(self):
self.server = GstRtspServer.RTSPserver()
self.server.set_service("8550") # rtsp 스트리밍 포트 번호
factory = RTSPFactory()
factory.set_shared(True)
mount = self.server.get_mount_points()
mount.add_factory("/test", factory) # rtsp 주소에 들어갈 서브 url string
self.server.attach(None)
server = GstServer()
loop.run()
NVR을 통해 cctv 화면을 rtsp로 스트리밍을 받아오기 때문에 pileline에 들어갈 string은 nvr에서 생성한 rtsp 주소가 된다.
NVR에서 받아온 h264 포맷을 동일한 포맷인 h264로 내보내기 때문에 rtph264depay ! h264parse ! rtph264pay로 파이프 라인을 구축한다.
때문에 위의 그림과 같이 분석 PC는 NVR로 부터 영상을 수신 받는 입장이 되는 것과 동시에 gstreamer를 사용하여 rtsp server가 되어 새로운 rtsp 주소를 생성하여 client에 영상을 전송할 수 있게 된다.
코드 :
https://github.com/YOOHYOJEONG/gstreamer/blob/master/rtsp_server.py
참고 링크 :