Python 으로 Gstreamer pipeline 구현 예제
Gstreamer 프레임워크는 기본적으로는 C 언어로 프로그래밍 가능하다. 추가로 Python 언어를 사용할 수 있도록 GST-PYTHON 바인딩을 제공한다. 몇개의 예제를 통하여 python 으로 Gstreamer 를 사용하는 방법을 정리한다.
Gstreamer pipeline 를 프로그래밍 해보자
예제실행환경
- Python 3.8.10
- Gstreamer 1.16.4 and plugins
Gstreamer python 프로그래밍
리눅스 터미널에서 gst-launch-1.0 명령을 이용하여 gstreamer pipeline 을 실행할 수 있다. python 을 이용해서 gstreamer pipeline 을 실행하기 위해서 Gst.parse_launch 함수를 사용한다. 아래는 Gst.parse_launch 를 이용해서 videotestsrc 소스를 출력하는 pipeline 을 생성하는 코드이다.
pipeline = Gst.parse_launch("videotestsrc pattern=18 num-buffers=300 ! autovideosink")
참고로 pipeline 을 graph 로 표현하면 다음 그림과 같다.
pipeline 을 실행 상태로 변경하고, loop 에서 이벤트를 대기한다.
pipeline.set_state(Gst.State.PLAYING)
loop = GLib.MainLoop()
...
loop.run()
loop 에서 pipeline 이벤트를 받고 처리하기 위해서 bus 를 사용한다. gstreamer pipeline 에 기본적으로 내장된 bus 는 callback 을 통해서 이벤트를 알려준다.
def on_message(bus: Gst.Bus, message: Gst.Message, loop: GLib.MainLoop):
msg = message.type
if msg == Gst.MessageType.EOS:
print("on_message : End Of Stream")
loop.quit()
elif msg == Gst.MessageType.WARNING:
err, debug = message.parse_warning()
print("on_message : Warnning -", err, debug)
elif msg == Gst.MessageType.ERROR:
err, debug = message.parse_error()
print("on_message : Error -", err, debug)
loop.quit()
return True
...
# connect bus to catch signal from the pipeline
bus = pipeline.get_bus()
bus.add_signal_watch()
bus.connect("message", on_message, loop)
- pipeline 에서 발생하는 EOS 메시지는 stream 의 끝을 알린다.
- pipeline 에서 발생하는 Warning 과 Error 메시지는 처리해야 하는 경고나 오류를 알린다.
즉, 프로그래머는 bus callback 함수를 통해 pipeline 수행 과정에서 발생하는 이벤트를 받고 처리할 수 있다.
예제 실행하기
python3 를 통해서 구현된 코드를 실행하자. 아래와 같이 videotestsrc 소스가 화면에 렌더링 되는 것을 확인할 수 있다.
전체코드
전체코드는 makepluscode 의 github 를 참고한다.
https://github.com/makepluscode/gstreamer-examples-python/tree/master/01-testvideo-launch
참고자료
gstreamer 의 python 바인딩에 대한 자세한 구현은 아래 gitlab 을 참고한다.
'프로그래밍 > GLibㆍGTKㆍGstreamer' 카테고리의 다른 글
Gstreamer Python : Appsink 구현하기 (0) | 2023.02.02 |
---|---|
Gstreamer Python : videorate FPS 변경 하기 (0) | 2023.02.02 |
Gstreamer Python : mp4 filesrc 예제 구현하기 (0) | 2023.02.02 |
Gstreamer Python : factory 파이프라인 구현하기 (1) | 2023.02.02 |
윈도우 GNU, MSYS2 개발환경 구축 (0) | 2022.12.03 |
gtk 프로그래밍 ini 설정파일 파싱 예제 (0) | 2022.11.12 |
Gstreamer 로 Jetson 에서 라즈베리파이v2 카메라 테스트 (0) | 2022.07.01 |
GSTShark 로 Gst-reamer pipeline 프로파일링 (0) | 2022.05.30 |