티스토리 뷰

자동차

[gstreamer] gstreamer 예제 확인해보기

삼전동해커 2024. 7. 8. 17:31

출처 : https://niklasjang.github.io/nnstreamer/Basic-Tutorials-For-GStreamer-1/

 

[NNStreamer] Gstreamer 기본 튜토리얼 1

Hello World 찍어보기

niklasjang.github.io

 

#include <gst/gst.h>

int main (int argc, char *argv[])
{
  GstElement *pipeline;
  GstBus *bus;
  GstMessage *msg;

  /* Initialize GStreamer */
  gst_init (&argc, &argv);

  /* Build the pipeline */
  pipeline =
      gst_parse_launch
      ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
      NULL);

  /* Start playing */
  gst_element_set_state (pipeline, GST_STATE_PLAYING);

  /* Wait until error or EOS */
  bus = gst_element_get_bus (pipeline);
  msg =
      gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
      GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

  /* Free resources */
  if (msg != NULL)
    gst_message_unref (msg);
  gst_object_unref (bus);
  gst_element_set_state (pipeline, GST_STATE_NULL);
  gst_object_unref (pipeline);
  return 0;
}

 

 

gst_init (&argc, &argv);

gstreamer를 initialize 하는 코드로, argument를 가져와 확인한다.

어떤 plug-in이 사용 가능한지 확인하고, interal structures들을 초기화 한다.

 

다음 코드를 보기 전에 gstreamer의 구성 요소와 pipeline에 대한 설명이 필요하다.

 

구성요소

- elements : pipeline의 구성 요소로, 기본적으로 데이터를 생성하는 source 엘리먼트, filter 엘리먼트, 데이터를 소비하는 sink 엘리먼트 등이 있다.

- pads : elements의 입출력을 담당. elements를 연결하기 위해서 elements의 pads를 연결한다. 

- bins : elements의 집합을 담고 있는 컨테이너. 다수의 elements를 조작하기 위해서 elements를 특정 bin에 포함시켜 상태 변경, 이벤트 지정 등을 수행

- pipeline : 엘리먼트들의 집합으로 최상위 bin으로 통용. source 엘리먼트에서 sink 엘리먼트까지의 흐름을 의미함.

 

pipeline =
    gst_parse_launch
    ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm",
    NULL);

 

gst_parse_launch는 주어진 파이프라인의 textural representation을 실제 파이프라인으로 바꿔주는 역할을 한다. 

python의 os.system과 비슷한 역할이다.

 

전달된 파이프 라인을 보면 주어진 uri를 playbin이라는 요소로 실행하라고 되어 있다.

playbin은 source와 sink의 역할을 모두 수행한다. 

 

gst_element_set_state (pipeline, GST_STATE_PLAYING);

state를 설정하는 코드로 영상 플레이어의 play/pause와 같은 역할을 한다. 

play/pause의 대상은 앞서 gst_parse_launch로 설정한 pipeline이다.

 

bus = gst_element_get_bus (pipeline);
msg =
    gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
    GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

 

에러가 발생할 때까지 기다리거나 에러가 발생하면 stream을 종료하는 코드이다.

 

if (msg != NULL)
  gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);

stream을 종료한 후 사용한 resource를 정리한다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함