본문 바로가기
프로그래밍/GLibㆍGTKㆍGstreamer

Gstreamer Python : factory 파이프라인 구현하기

by makepluscode 2023. 2. 2.
반응형

Python 으로 구현한 gstreamer factory 파이프라인 예제

Gstreamer 프레임워크에서 응용프로그램 개발 시, Python 언어를 사용할 수 있도록 Gstreamer -PYTHON binding 을 제공한다. plug-in 을 로드해서 파이프라인을 구성하는 예제 코드를 정리한다.

(makepluscode) Gstreamer x python 예제

gstreamer factory 파이프라인 예제

테스트 환경

  • Gstreamer 1.16.4
  • Python 3.8.10

gstreamer factory 파이프라인 프로그래밍

Gstreamer 의 ElementFactory 는 programming 을 통해 Gstreamer 플러그인을 load 하는 함수 이다. 아래의 코드는 videotestsrc 와 autovideosink 를 load 하고 하나의 pipeline 으로 연결시키는 예제이다.

  1. ElementFactory.make 를 통해 plug-in 을 가져온다.
  2. pipeline 에 plugin 을 add 한다.
  3. add 된 plugin 을 연결한다.
def create_pipepline(pipeline: Gst.Pipeline):
    src = Gst.ElementFactory.make("videotestsrc", "src")
    src.set_property("pattern", 18)
    src.set_property("num-buffers", 300)

    sink = Gst.ElementFactory.make("autovideosink", "sink")

    pipeline.add(src)
    pipeline.add(sink)

    src.link(sink)
    return True

생성된 pipeline 을 PLAYING 상태로 바꾸고, loop 를 실행한다.

pipeline.set_state(Gst.State.PLAYING)
loop = GLib.MainLoop()
...

loop.run()

pipeline loop 에서 이벤트를 받고 처리하기 위해서 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)
  1. EOS (End of Stream) : stream 의 끝을 EOS 메시지로 알려준다.
  2. WARNING, ERROR : Warning 과 Error 메시지는 처리해야 하는 경고나 오류를 알린다.

bus callback 함수를 통해 pipeline 수행 과정에서 발생하는 이벤트를 받고, 이를 처리할 수 있다.

실행하기

python3 를 통해서 구현된 코드를 실행하자. 아래와 같이 videotestsrc 소스가 화면에 렌더링 되는 것을 확인할 수 있다.

전체코드

전체코드는 makepluscode 의 github 를 참고한다.

https://github.com/makepluscode/gstreamer-examples-python/blob/master/02-testvideo-factory/main.py

 

GitHub - makepluscode/gstreamer-examples-python: Gstreamer examples written by in Python

Gstreamer examples written by in Python. Contribute to makepluscode/gstreamer-examples-python development by creating an account on GitHub.

github.com

참고자료

https://gitlab.freedesktop.org/gstreamer/gst-python

 

GStreamer / gst-python · GitLab

GStreamer Python binding overrides Please submit new issues and merge requests against the GStreamer mono repo!

gitlab.freedesktop.org

launch 를 통한 python gst-reamer 파이프라인 실행 예제

2023.02.02 - [프로그래밍/GLibㆍGTKㆍGstreamer] - Gstreamer Python : pipeline 예제

 

Gstreamer Python : pipeline 예제

Python 으로 Gstreamer pipeline 구현 예제 Gstreamer 프레임워크는 기본적으로는 C 언어로 프로그래밍 가능하다. 추가로 Python 언어를 사용할 수 있도록 GST-PYTHON 바인딩을 제공한다. 몇개의 예제를 통하여

makepluscode.tistory.com

반응형