GStreamer Application 만들기


이 장에서는 GStreamer의 기본 개념과 Element, Pad 및 버퍼와 같이 가장 많이 사용되는 객체에 대해 설명합니다.
우리는 이러한 객체의 시각적 표현을 사용하여 나중에 빌드하는 방법을 배우는 더 복잡한 파이프 라인을 시각화 할 수 있습니다.
GStreamer API를 살펴보면 기본 애플리케이션을 빌드하기에 충분합니다.
이 부분의 뒷부분에서 기본적인 Command line 응용 프로그램을 작성하는 방법도 배웁니다.

이 부분에서는 저수준 API와 GStreamer의 개념을 살펴볼 것입니다.
응용 프로그램을 빌드 한 후에는 더 높은 수준의 API를 사용할 수 있습니다.
이에 대해서는이 매뉴얼의 뒷부분에서 설명합니다.

Subpages:

Initializing GStreamer
Elements
Bins
Bus
Pads and capabilities
Buffers and Events
Your first application

GStreamer 기초

이 글은 GStreamer org 의 “GStreamer Applicatino Development Manual” 을 번역한 것이다.

원본 링크: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf

이 장에서는 GStreamer의 기본 개념을 소개합니다. 이 안내서의 나머지 부분을 읽으려면 이러한 개념을 이해하는 것이 중요하며, 모두 기본 개념을 이해한다고 가정합니다.

Elements

Elements 는 GStreamer에서 가장 중요한 Object class 입니다.
일반적으로 서로 연결된 Elements 체인을 만들고 이 Elements 체인을 통해 데이터를 흐르게합니다.
Elements 에는 파일에서 데이터를 읽거나,이 데이터를 디코딩하거나,이 데이터를 사운드 카드 (또는 기타)로 출력 할 수있는 하나의 특정한 기능이 있습니다.
이러한 여러 Elements 를 연결하여 특정 작업 (예 : 미디어 재생 또는 캡처)을 수행 할 수있는 파이프 라인을 만듭니다.
GStreamer는 기본적으로 다양한 Elements 컬렉션을 제공하므로 다양한 미디어 응용 프로그램을 개발할 수 있습니다.
필요한 경우 새 Elements 를 작성할 수도 있습니다.
이 주제는 GStreamer Plugin Writer ‘s Guide에 많이 설명되어 있습니다.

Pads

Pad 는 Element 의 입력 및 출력이며 다른 Element 를 연결할 수 있습니다.
그것들은 GStreamer의 Element 들 사이의 링크와 Data flow 를 negotiation 하는 데 사용됩니다.
Pad 는 다른 Element 와 연결될 수 있는 Element 에서 “플러그”또는 “포트”로 볼 수 있으며, 이 Element 에서 데이터가 흐를 수 있습니다.
Pad 에는 특정한 데이터 처리 기능이 있습니다.
Pad 는 통과하는 데이터 타입을 제한 할 수 있습니다.
두 Pad 의 허용 된 데이터 타입 (기능) 이 호환되는 경우에만 두 Pad 간에 링크가 허용됩니다.
데이터 타입은 ‘Caps negotiation’ 이라는 프로세스를 사용하여 Pad 간에 Negotiation 됩니다. 데이터 타입은 GstCaps에 의해 설명됩니다.

이렇게 비유해보겠습니다. Pad 는 물리적 디바이스의 플러그 또는 잭과 유사합니다.
예를 들어, 오디오 앰프, DVD 플레이어 및 (자동) 비디오 프로젝터로 구성된 홈 시어터 시스템을 생각해보십시오.
두 디바이스 모두 오디오 잭이 있으므로 DVD 플레이어를 앰프에 연결하는 것이 허용되며 두 장치 모두 호환되는 비디오 잭이 있으므로 프로젝터를 DVD 플레이어에 연결할 수 있습니다.
프로젝터와 앰프의 잭 유형이 다르기 때문에 프로젝터와 앰프를 연결하지 못할 수 있습니다.
GStreamer의 Pad 는 홈 시어터 시스템의 잭과 동일한 용도로 사용됩니다.

대부분의 경우 GStreamer의 모든 데이터는 Element 간 링크를 통해 한 방향으로 흐릅니다.
데이터는 하나 이상의 소스 Pad 를 통해 하나의 Element 에서 흘러 나오고 Element 는 하나 이상의 싱크 Pad 를 통해 들어오는 데이터를 받아들입니다.
소스 및 싱크 Element 에는 각각 소스 및 싱크 Pad 만 있습니다.
데이터는 일반적으로 버퍼 (GstBuffer 객체로 설명)와 이벤트 (GstEvent 객체로 설명)를 의미합니다.

Bin 과 Pipeline

Bin 은 Element 모음을 위한 컨테이너입니다. Bin 은 Element 자체의 서브 클래스이므로 대부분 Bin 을 마치 Element 인 것처럼 제어 할 수 있으므로 응용 프로그램의 복잡성을 크게 줄일 수 있습니다. 예를 들어, Bin 자체의 상태를 변경하여 Bin 의 모든 Element 에서 상태를 변경할 수 있습니다. Bin 은 또한 포함 된 child (예 : 오류 메시지, 태그 메시지 또는 EOS 메시지)에서 버스 메시지를 전달합니다.

Pipeline 은 최상위 Bin 입니다. 응용 프로그램을 위한 버스를 제공하고 해당 child 에 대한 동기화를 관리합니다. PAUSED 또는 PLAYING 상태로 설정하면 Data flow 가 시작되고 미디어 처리가 수행됩니다. 일단 시작되면 Pipeline 은 중지하거나 데이터 스트림의 끝에 도달 할 때까지 별도의 스레드에서 실행됩니다.

https://gstreamer.freedesktop.org/documentation/application-development/introduction/images/simple-player.png

Communication

GStreamer는 애플리케이션과 Pipeline 간의 통신 및 데이터 교환을 위한 여러 메커니즘을 제공합니다.

    버퍼는 Pipeline 의 Element 간에 스트리밍 데이터를 전달하기위한 객체입니다. 버퍼는 항상 소스에서 싱크로 내려갑니다 (다운 스트림).

    이벤트는 Element 간에 또는 응용 프로그램에서 Element 로 전송되는 객체입니다. 이벤트는 업스트림 및 다운 스트림으로 이동할 수 있습니다.
다운 스트림 이벤트는 Data flow 에 동기화 될 수 있습니다.

    메시지는 Pipeline 의 메시지 버스에 Element 별로 게시 된 Object 이며, 응용 프로그램에서 수집하기 위해 유지됩니다.
메시지는 메시지를 게시하는 Element 의 스트리밍 스레드 컨텍스트에서 동기식으로 인터셉트 될 수 있지만 일반적으로 애플리케이션의 기본 스레드에서 애플리케이션이 비동기 적으로 처리합니다.
메시지는 스레드로부터 안전한 방식으로 Element 에서 애플리케이션으로 오류, 태그, 상태 변경, 버퍼링 상태, 리디렉션 등과 같은 정보를 전송하는 데 사용됩니다.

    쿼리를 통해 응용 프로그램은 파이프 라인에서 지속 시간 또는 현재 재생 위치와 같은 정보를 요청할 수 있습니다.
쿼리는 항상 동기식으로 응답됩니다. Element 는 또한 쿼리를 사용하여 피어 요소 (예 : 파일 크기 또는 지속 시간)로부터 정보를 요청할 수 있습니다. Pipeline 내에서 두 가지 방식으로 모두 사용할 수 있지만 업스트림 쿼리가 더 일반적입니다.

GStreamer pipeline with different communication flows

GStreamer 디자인 철학

이 글은 GStreamer org 의 “GStreamer Applicatino Development Manual” 을 번역한 것이다.

원본 링크: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf

Clean and powerful

GStreamer는 다음과 같은 깔끔한 인터페이스를 제공합니다.

– 미디어 파이프 라인을 구축하려는 응용 프로그래머는 광범위한 강력한 도구 세트를 사용하여 한 줄의 코드도 작성하지 않고 미디어 파이프 라인을 만들 수 있습니다.
복잡한 미디어 조작을 수행하는 것이 매우 쉬워졌습니다.

– 플러그인 프로그래머에게는 자체 포함 플러그인을 작성하기위한 깨끗하고 간단한 API가 제공됩니다.
광범위한 디버깅 및 추적 메커니즘이 통합되었습니다.
GStreamer는 또한 예제로 사용되는 광범위한 실제 플러그인 세트와 함께 제공됩니다.

객체 지향 (Object oriented)

GStreamer는 GLib 2.0 객체 모델 인 GObject를 준수합니다.
GLib 2.0 또는 GTK +에 익숙한 프로그래머는 GStreamer에 익숙 할 것입니다.

GStreamer는 Signal 메커니즘과 Object property 를 사용합니다.

모든 Object 는 다양한 Property 와 Capability 를 위해 런타임에 쿼리 할 수 있습니다.

GStreamer는 프로그래밍 방법론이 GTK +와 유사 할 것입니다.
이것은 Object model, Ownership, Reference counting 등에 적용됩니다.

확장성 (Extensible)

모든 GStreamer Object 는 GObject 상속 메소드를 사용하여 확장 할 수 있습니다.

모든 플러그인은 동적으로 로드되며 독립적으로 확장 및 업그레이드 할 수 있습니다.

고성능 (High performance)

아래와 같은 이유로 High performance 를 실현합니다.

– GLib의 GSlice allocator 사용

– 플러그인 간의 초경량 링크.
데이터는 최소한의 오버 헤드로 파이프 라인을 이동할 수 있습니다.
플러그인 간 데이터 전달에는 일반적인 파이프 라인에서 포인터 dereference 만 포함됩니다.

– Target memory 에서 직접 작동하는 메커니즘을 제공합니다.
플러그인은 예를 들어 X 서버의 Shared memory 공간에 직접 쓸 수 있습니다.
버퍼는 사운드 카드의 내부 하드웨어 버퍼와 같은 임의의 메모리를 가리킬 수도 있습니다.

– ref counting 과 copy on write 는 memcpy의 사용을 최소화합니다.
서브 버퍼는 버퍼를 효율적으로 관리 가능한 조각으로 나눕니다.

– 커널에 의해 스케줄링되는 Dedicated 스트리밍 쓰레드

– 특수 플러그인을 사용하여 하드웨어 가속을 허용합니다.

– 플러그인이 실제로 사용될 때까지 플러그인 로딩이 지연 될 수 있도록 플러그인 specification 과 플러그인 registry 사용.

깔끔한 Core/Plugin 분리 (Clean core/plugins separation)

GStreamer의 핵심은 본질적으로 미디어에 구애받지 않습니다.
바이트와 블록에 대해서만 알고 기본 요소 만 포함합니다.
GStreamer의 core 는 cp와 같은 low-level systel tool 을 구현할 수있을 정도로 기능적입니다.

모든 미디어 처리 기능은 코어 외부의 플러그인에 의해 제공됩니다.
이것은 core 에 특정 유형의 미디어를 처리하는 방법을 알려줍니다.

코덱 실험을 위한 프레임워크 제공 (Provide a framework for codec experimentation)

GStreamer는 코덱 개발자가 다양한 알고리즘을 실험하여 Xiph.Org Foundation (Theora 및 Vorbis 등)이 개발 한 개방형 및 무료 멀티미디어 코덱의 개발 속도를 높일 수있는 간편한 프레임 워크가되기를 원합니다.

GStreamer 란 무엇인가

이 글은 GStreamer org 의 “GStreamer Applicatino Development Manual” 을 번역한 것이다.

원본 링크: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf


GStreamer 란 무엇입니까?

GStreamer는 스트리밍 미디어 응용 프로그램을 만들기위한 프레임 워크입니다.
기본 디자인은 Oregon Graduate Institute의 비디오 파이프 라인과 DirectShow의 아이디어에서 비롯됩니다.

GStreamer의 개발 프레임 워크를 통해 모든 유형의 스트리밍 멀티미디어 응용 프로그램을 작성할 수 있습니다.
GStreamer 프레임 워크는 오디오 또는 비디오 또는 둘 다를 처리하는 응용 프로그램을 쉽게 작성할 수 있도록 설계되었습니다.
오디오 및 비디오에만 국한되지 않고, 어떤 종류의 Data flow 도 처리 할 수 ​​있습니다.
파이프 라인 설계는 적용된 필터가 유발하는 것 이상의 오버헤드가 거의 없도록 만들어졌습니다.
따라서 GStreamer는 latency 를 많이 요구하는 하이엔드 오디오 애플리케이션을 설계하기위한 훌륭한 프레임 워크가됩니다.

GStreamer의 가장 명백한 용도 중 하나는 미디어 플레이어를 만드는 데 사용하는 것입니다. GStreamer에는 MP3, Ogg / Vorbis, MPEG-1 / 2, AVI, Quicktime, mod 등 다양한 형식을 지원할 수있는 미디어 플레이어를 구축하기위한 구성 요소가 이미 포함되어 있습니다.
그러나 GStreamer는 다른 미디어 플레이어 그 이상입니다.
주요 장점은 플러그 가능한 구성 요소를 임의의 파이프 라인에 혼합하여 일치시켜 본격적인 비디오 또는 오디오 편집 응용 프로그램을 작성할 수 있다는 것입니다.

프레임 워크는 다양한 코덱 및 기타 기능을 제공하는 플러그인을 기반으로합니다.
플러그인은 파이프 라인에서 연결 및 배치 될 수 있습니다.
이 파이프 라인은 Data flow 를 정의합니다.
파이프 라인은 GUI 편집기로 편집하고 XML로 저장하여 최소한의 노력으로
파이프 라인 라이브러리를 만들 수 있습니다.

GStreamer 핵심 기능은 플러그인, Data flow 및 미디어 타입 handling / negotiation 을 위한
프레임 워크를 제공하는 것입니다.
또한 다양한 플러그인을 사용하여 애플리케이션을 작성하는 API를 제공합니다.

GStreamer는 아래 항목을 제공합니다.
     – 멀티미디어 애플리케이션을 위한 API
    – 플러그인 아키텍처
     – 파이프 라인 아키텍처
     – 미디어 타입 Handling / Negotiation 을 위한 메커니즘
     – 동기화 메커니즘
     – 1000 개 이상의 요소를 제공하는 250 개가 넘는 플러그인
     – 도구 세트

GStreamer 플러그인은 다음과 같이 분류 될 수 있습니다.
     – 프로토콜 handling
     – sources : 오디오 및 비디오 용 (프로토콜 플러그인 포함)
     – formats : parsers, formaters, muxers, demuxers, metadata, subtitles
     – codecs : 코더 및 디코더
     – filters : converters, mixers, effects, …
     – sinks : 오디오 및 비디오 용 (프로토콜 플러그인 포함)

undefined

GStreamer는 아래와 같이 패키징 되어 있습니다.
     – gstreamer : 핵심 패키지
     – gst-plugins-base : 필수적인 elements 집합
     – gst-plugins-good : LGPL 라이선스의 Good quality 플러그인 집합
     – gst-plugins-ugly : distribution 문제를 일으킬 수있는 Good quality 플러그인 집합
     – gst-plugins-bad : Quality 개선이 이 더 필요한 플러그인 집합
     – gst-libav : 디코딩 및 인코딩을 위해 libav를 래핑하는 플러그인 집합
     – 다른 몇 가지 패키지

GStreamer Application Development Manual

GStreamer 를 공부하기 위해 가장 먼저 매뉴얼을 한글로 번역해본다.

원본 링크: https://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/manual.pdf


  1. What is GStreamer?
  2. Design principles
    2.1. Clean and powerful
    2.2. Object oriented
    2.3. Extensible
    2.4. Allow binary-only plugins
    2.5. High performance
    2.6. Clean core/plugins separation
    2.7. Provide a framework for codec experimentation
  3. Foundations
    3.1. Elements
    3.2. Pads
    3.3. Bins and pipelines
    3.4. Communication

II. Building an Application

  1. Initializing GStreamer
    4.1. Simple initialization
    4.2. The GOption interface
  2. Elements
    5.1.What are elements?
    5.2. Creating a GstElement
    5.3. Using an element as a GObject
    5.4. More about element factories
    5.5. Linking elements
    5.6. Element States
  3. Bins
    6.1.What are bins
    6.2. Creating a bin
    6.3. Custom bins
    6.4. Bins manage states of their children
  4. Bus
    7.1. How to use a bus
    7.2. Message
  5. Pads and capabilities
    8.1. Pads
    8.2. Capabilities of a pad
    8.3.What capabilities are used for
    8.4. Ghost pads
  6. Buffers and Events
    9.1. Buffers
    9.2. Events
  7. Your first application
    10.1 Hello world
    10.2 Compiling and Running helloworld.c
    10.3 Conclusion

III. Advanced GStreamer concepts

  1. Position tracking and seeking
    11.1. Querying: getting the position or length of a stream
    11.2. Events: seeking (and more)
  2. Metadata
    12.1. Metadata reading
    12.2. Tag writing
  3. Interfaces
    13.1. The URI interface
    13.2. The Color Balance interface
    13.3. The Video Overlay interface
  4. Clocks and synchronization in GStreamer
    14.1. Clock running-time
    14.2. Buffer running-time
    14.3. Buffer stream-time
    14.4. Time overview
    14.5. Clock providers
    14.6. Latency
  5. Buffering
    15.1. Stream buffering
    15.2. Download buffering
    15.3. Timeshift buffering
    15.4. Live buffering
    15.5. Buffering strategies
  6. Dynamic Controllable Parameters
    16.1. Getting Started
    16.2. Setting up parameter control
  7. Threads
    17.1. Scheduling in GStreamer
    17.2. Configuring Threads in GStreamer
    17.3.When would you want to force a thread?
  8. Autoplugging
    18.1. Media types as a way to identify streams
    18.2. Media stream type detection
    18.3. Dynamically autoplugging a pipeline
  9. Pipeline manipulation
    19.1. Using probes
    19.2. Manually adding or removing data from/to a pipeline
    19.3. Forcing a format
    19.4. Dynamically changing the pipeline

IV. Higher-level interfaces for GStreamer applications

  1. Playback Components
    20.1. Playbin
    20.2. Decodebin
    20.3. URIDecodebin
    20.4. Playsink

V. Appendices

  1. Programs
    21.1. gst-launch
    21.2. gst-inspect
  2. Compiling
    22.1. Embedding static elements in your application
  3. Things to check when writing an application
    23.1. Good programming habits
    23.2. Debugging
    23.3. Conversion plugins
    23.4. Utility applications provided with GStreamer
  4. Porting 0.8 applications to 0.10
    24.1. List of changes
  5. Porting 0.10 applications to 1.0
    25.1. List of changes
  6. Integration
    26.1. Linux and UNIX-like operating systems
    26.2. GNOME desktop
    26.3. KDE desktop
    26.4. OS X
    26.5.Windows
  7. Licensing advisory
    27.1. How to license the applications you build with GStreamer
  8. Quotes from the Developers

내 첫 블로그 글

2020년을 맞이하여 블로그를 만들어 보았습니다.

처음이라 글 하나 작성하기가 매우 힘드네요.

새 해 목표는 긍정적인 마인드입니다.

다 잘 될 거에요!