What is GStreamer?

CrM·2023년 12월 18일

GStreamer

목록 보기
1/3

이 시리즈에서는 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) 제한 가능
        • 데이터 타입 종류는 GstCaps 참고
      • 허용된 데이터 타입 이외에는 연결 제한

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에게
      • ex) 파일 크기, 지속시간
  • 항상 동기적(sync)으로 응답
  • upstream, downstream 모두 가능
    • 주로 upstream이 많이 사용됨


참고자료

0개의 댓글