이 시리즈에서는 GStreamer 측에서 공식 제공하는 튜토리얼을 번역 및 정리하려고 한다.
GStreamer

- 멀티미디어 흐름을 처리하도록 설계된 프레임워크
- 임의의 pipeline에 다양한 plugin을 붙여 원하는대로 스트리밍 미디어 앱을 만들 수 있음
- ex) 미디어 플레이어, 비디오/오디오 편집 앱
주요 제공 기능
- 멀티미디어 앱을 위한 API
- plugin, pipeline의 아키텍처
- 미디어 타입 처리(handling) 및 협상(negotiation) 메커니즘
- 동기화(synchronization) 메커니즘
- 1000개 이상의 element를 제공하는 250개 이상의 plugin
- 관련된 여러 유용한 툴
장점
- 모든 타입의 멀티미디어 동시 지원
- 비디오, 오디오 뿐만 아닌 모든 종류의 데이터 흐름 재생 가능
- 다양한 포맷을 지원하는 components 보유
- ex) MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod emd
- 저지연이 중요한 앱 설계에 효과적
- 적용된 filter 이상의 오버헤드가 생기지 않도록 pipeline을 설계했기 때문
- ex) 고성능(high-end) 오디오 앱
- 모듈성
- 새 plugin 모듈들을 원활하게 통합 가능
- 그러나 복잡성이 높아져 새로운 앱을 만들기 어려워지는 요인이 되기도 함
Plugins
- GStreamer는 다양한 기능을 제공하는 plugin을 기반으로 이루어짐
- pipeline에 연결(link)되어 배치됨
종류
- protocols handling
- sources: audio, video
- formats: parsers, formaters, muxers, demuxers, metadata, subtitles
- codecs: coders, decoders
- filters: converters, mixers, effects, …
- sinks: audio, video
Packages
- gstreamer: 핵심 패키지
- gst-plugins-base: 필수 예시 element 모음
- gst-plugins-good: LGPL 라이선스 하의 고품질 plugin 모음
- gst-plugins-ugly: 배포 시 라이선스 문제 등이 있을 수 있는 고품질 plugin 모음
- gst-plugins-bad: 품질이 떨어지는 plugin 모음
- gst-libav: 디코딩/인코딩을 위해 libav를 감싸는 plugin 모음
- and more...
구성 요소
Element
- GStreamer의 기본 구성 요소 (가장 중요한 객체의 클래스)
- 각 element는 특정 기능을 하나씩 가짐
- ex) 데이터 읽기, 디코딩, 사운드카드 출력 등
- elements를 연결(chaining)하여 pipeline 구축 가능
- downstream 데이터 흐름을 처리
- source (data producer) → filter → sink (data consumer)

- 필요에 따라 사용자가 직접 새로운 기능의 element를 만들 수도 있음
Pad
- element의 입출력 ("plug", "port")
- element간 연결 및 데이터 흐름을 조정(negotiate)
- caps negotiation
- 사용될 데이터 타입(capabilities) 제한 가능
- 허용된 데이터 타입 이외에는 연결 제한
Bin
- elements를 담기 위한 element
- elements의 묶음(collection)을 담는 컨테이너
- element의 부분집합(subclass)
- element처럼 다룰 수 있음
- 즉, bin에 포함된 다수의 element를 한번에 간단히 제어 가능
- ex) state 변경, bus 메시지 전달 등
Pipeline
- 미디어 재생을 위해 연결된 모든 element의 집합
- 최상위(top-level) bin
- 즉, bin의 method를 pipeline에도 적용 가능
- 기능
- pipeline을 통해 특정 작업을 수행하도록 할 수 있음
- ex) 데이터의 흐름 정의, 앱을 위한 bus 제공, 포함된 elements의 동기화 관리
- state(PAUSED, PLAYING)에 따라 동작 조정 가능
- 앱 시작 시 별도의 쓰레드에서 실행

통신 (Communication)
GStreamer가 앱과 pipeline 간 데이터 교환 및 통신을 위해 제공하는 기능들

Buffer
- pipeline의 element간 스트리밍 데이터를 전달하기 위한 객체(object)
- source → sink로 이동 (downstream)
Event
- element간 또는 앱에서 element로 전송되는 객체
- upstream, downstream 모두 가능
- downstream의 경우, 데이터 흐름과 동기화 가능
Message
- pipeline의 메시지 bus의 element로부터 게시되는 객체
- 앱에서 수집될 때까지 유지됨
- 보통은 앱의 메인 쓰레드에서 비동기적(asynchronously)으로 처리됨
- 메시지를 게시한 element의 streaming thread context에서 동기적으로 가져올 수 있기도 함 (synchronously intercept)
- 주로 elements에서 thread-safe하게 정보를 전송하는 데 사용
- ex) error, tags, state changes, buffering state, redirects
Query
- 정보 요청
- app이 pipeline에게
- ex) 지속시간(duration), 현재 재생 위치(playback position)
- element가 element에게
- 항상 동기적(sync)으로 응답
- upstream, downstream 모두 가능
참고자료