본문 바로가기
SWE/스트리밍

GStreamer 기초 foundation 개념 정리 | 오픈소스 미디어 프레임워크

by S나라라2 2022. 8. 4.
반응형

Gstreamer 라이브러리와 도구를 사용해 Gstreamer 애플리케이션 코드 짜기전에 먼저 이해부터 해보자

 

  • 비디오 파이프라인
  • 오디오와 비디오를 컨트롤하는 어플리케이션을 만들 있음. 어떤 타입의 데이터 플로우를 모두 처리할 있음
  • 다양한 포맷을 지원한다.  Ex)  MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod, …
  • Gstreamer 플러그인 분류 체계
  • 프로토콜 핸들링
  • Sources
  • Formats: parsers, formaters, muxers, demuxers, metadata, subtitles
  • Codecs: coders and decorders
  • Filters: converters, mixers, effects,
  • Sinks

 

 

Foundations 기초

https://gstreamer.freedesktop.org/documentation/application-development/introduction/basics.html?gi-language=c#foundations

 

 

Gstreamer 기초 개념을 이해해보자

Elements

  • Elements Gstreamer에서 가장 중요한 클래스 하나이다.
  • Elements들을 만들어서 체인처럼 서로 링킹하고, 데이터가 엘레멘츠 체인들을 따라서 흐르도록 한다.
  • Element들은 하나의 특정한 기능을 한다.
  • 다양한 타입의 미디어 애플리케이션을 개발하면서 Gstreamer 기본적으로 대량의 elements 모음들을 만들어낸다. 필요하다면 개발자가 직접 새로운 element만드는 것이 가능하다.

 

Pads

  • Pad 입구 출구를 담당하는 element이다.
  • Elements 사이에서 links data flow 유통시키는데 사용된다.
  • Pad element에서 plug 또는 port 보여지기도 한다. 포트(플러그) 통해 데이터가 흘러간다.
  • Pad 특별한 데이터 핸들링 기능이 있다. 패드는 패드를 통해 이동하는 데이터의 타입을 추출할 있다.
  • 링크는 호환 가능한 개의 패드 사이에서만 허용된다.
  • 'caps negotiation'이라는 프로세스를 이용해서 패드들 사이에서만 데이터 타입이 유통된다. 데이터 타입은 'GstCaps'라고 불린다.

 

  • Pads 아래의 예제의 어댑터 잭과 유사하다.
Projector ----(video jacks)----> DVD player ----(audio jacks)----> Amplifier
Proejctor ----//(different types of jacks)//----> Amplifier

 

  • 대부분의 경우, Gstreamer에서 모든 데이터는 elements link들을 통해서 단방향으로 흐른다.
  • 데이터는 element 'source pad'에서 나가고, 다른 element 'sink pad' 통해서 들어온다.  따라서 element들은 각기 source pad sink pad 가지고 있다.

 

  • 데이터는 보통 buffer event 의미를 내포한다. (GstBuffer object, GstEvent object)

 

 

Bins and pipelines

  • Bin elements 집합을 모은 컨테이너이다.
  • Bins elements 자식 클래스이다. (element클래스를 상속받았다.) 따라서 element처럼 bin 제어가 가능하다.
  • Bin 담겨있는 elements(children)로부터 이벤트 메시지를 받을 있도록 bus message 가지고 있다.

 

  • Pipeline 상위 레벨의 bin이다.
  • Pipeline 애플리케이션에 메시지 버스를 제공하고, 담겨 있는 elements(children)들이 동기화되도록 관리할 있다.

 

비디오 흐름 

1. 우리가 재생하고 싶은 동영상 파일이 있다. File-source라고 하자.

     File source src pad라는 구멍을 통해서 데이터를 내보낸다.

2. Ogg-demuxer sink pad에서 데이터를 전달 받는다.

     *동영상 파일은 컨테이너에 비디오와 오디오가 담겨 있다.

     Demuxer 오디오, 오디오 스트림을 각각 빼낸다.(병합해제, demultiplexing)

     각각의 스트림을 src pad 통해서 내보낸다.

3-1. vorbis-decoder sink pad 통해서 오디오 스트림을 전달 받는다.

     Vorbis포맷으로 압축된 오디오 데이터를 압축 해제하여 원본 오디오 데이터를 얻는다. (압축해제, decoding)

     데이터를 src pad 통해 내보낸다.

4-1. audio-sink sink pad 원본 오디오 데이터를 전달받는다.

     스피커나 다른 기기로 송출하는 부분이다.

3-2. // 비디오도 위의 오디오와 동일

4-2. // 비디오도 위의 오디오와 동일

 

 

통신

GStreamer는 응용프로그램과 pipeline 간의 통신과 데이터 교환을 위해 몇 가지 메커니즘을 제공한다.

  • buffer:

pipeline안의 elements들 사이에 스트리밍 데이터를 전달하기 위한 오브젝트이다. 버퍼는 항상 source에서 sink로 이동한다. (downstream)

  • event :

     elements들 간에 이동하기도 하고, 응용프로그램과 pipeline간에 보내지기도 한다. 즉 이벤트는 upstream ,downsteram 둘 다 가능하다. downstream 이벤트는 데이터 흐름에 동기화될 수 있다.

  • messages:

     - elements에서 message를 보내고, pipeline의 메시지 버스에서 message를 받는다. message를 보낸 elements에서 메시지를 스스로 받을 수도 있고(message를 보낸 엘레멘트의 스트리밍 스레드에서 동기적으로 가로챈다.), 응용프로그램의 메인 스레드에서 비동기적으로 메시지를 받을 수도 있다.

     - messsage의 사용 예: errors, tags, state chanes, buffering state, redirects ...

     - 스레드 안정성이 보장된다.

  • queries :

     - application이 pipeline에 정보를 요청한다. (현재 플레이백되는 위치 )

     - queries는 항상 비동기적으로 응답한다.

 

반응형