이 장에서는 GStreamer의 기본 개념과 Element, Pad 및 버퍼와 같이 가장 많이 사용되는 객체에 대해 설명합니다. 우리는 이러한 객체의 시각적 표현을 사용하여 나중에 빌드하는 방법을 배우는 더 복잡한 파이프 라인을 시각화 할 수 있습니다. GStreamer API를 살펴보면 기본 애플리케이션을 빌드하기에 충분합니다. 이 부분의 뒷부분에서 기본적인 Command line 응용 프로그램을 작성하는 방법도 배웁니다.
이 부분에서는 저수준 API와 GStreamer의 개념을 살펴볼 것입니다. 응용 프로그램을 빌드 한 후에는 더 높은 수준의 API를 사용할 수 있습니다. 이에 대해서는이 매뉴얼의 뒷부분에서 설명합니다.
이 장에서는 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 은 중지하거나 데이터 스트림의 끝에 도달 할 때까지 별도의 스레드에서 실행됩니다.
Communication
GStreamer는 애플리케이션과 Pipeline 간의 통신 및 데이터 교환을 위한 여러 메커니즘을 제공합니다.
버퍼는 Pipeline 의 Element 간에 스트리밍 데이터를 전달하기위한 객체입니다. 버퍼는 항상 소스에서 싱크로 내려갑니다 (다운 스트림).
이벤트는 Element 간에 또는 응용 프로그램에서 Element 로 전송되는 객체입니다. 이벤트는 업스트림 및 다운 스트림으로 이동할 수 있습니다. 다운 스트림 이벤트는 Data flow 에 동기화 될 수 있습니다.
메시지는 Pipeline 의 메시지 버스에 Element 별로 게시 된 Object 이며, 응용 프로그램에서 수집하기 위해 유지됩니다. 메시지는 메시지를 게시하는 Element 의 스트리밍 스레드 컨텍스트에서 동기식으로 인터셉트 될 수 있지만 일반적으로 애플리케이션의 기본 스레드에서 애플리케이션이 비동기 적으로 처리합니다. 메시지는 스레드로부터 안전한 방식으로 Element 에서 애플리케이션으로 오류, 태그, 상태 변경, 버퍼링 상태, 리디렉션 등과 같은 정보를 전송하는 데 사용됩니다.
쿼리를 통해 응용 프로그램은 파이프 라인에서 지속 시간 또는 현재 재생 위치와 같은 정보를 요청할 수 있습니다. 쿼리는 항상 동기식으로 응답됩니다. Element 는 또한 쿼리를 사용하여 피어 요소 (예 : 파일 크기 또는 지속 시간)로부터 정보를 요청할 수 있습니다. Pipeline 내에서 두 가지 방식으로 모두 사용할 수 있지만 업스트림 쿼리가 더 일반적입니다.
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 : 오디오 및 비디오 용 (프로토콜 플러그인 포함)
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를 래핑하는 플러그인 집합 – 다른 몇 가지 패키지
Initializing GStreamer 4.1. Simple initialization 4.2. The GOption interface
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
Bins 6.1.What are bins 6.2. Creating a bin 6.3. Custom bins 6.4. Bins manage states of their children
Bus 7.1. How to use a bus 7.2. Message
Pads and capabilities 8.1. Pads 8.2. Capabilities of a pad 8.3.What capabilities are used for 8.4. Ghost pads
Buffers and Events 9.1. Buffers 9.2. Events
Your first application 10.1 Hello world 10.2 Compiling and Running helloworld.c 10.3 Conclusion
III. Advanced GStreamer concepts
Position tracking and seeking 11.1. Querying: getting the position or length of a stream 11.2. Events: seeking (and more)
Metadata 12.1. Metadata reading 12.2. Tag writing
Interfaces 13.1. The URI interface 13.2. The Color Balance interface 13.3. The Video Overlay interface
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
Dynamic Controllable Parameters 16.1. Getting Started 16.2. Setting up parameter control
Threads 17.1. Scheduling in GStreamer 17.2. Configuring Threads in GStreamer 17.3.When would you want to force a thread?
Autoplugging 18.1. Media types as a way to identify streams 18.2. Media stream type detection 18.3. Dynamically autoplugging a pipeline
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
Compiling 22.1. Embedding static elements in your application
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
Porting 0.8 applications to 0.10 24.1. List of changes
Porting 0.10 applications to 1.0 25.1. List of changes
Integration 26.1. Linux and UNIX-like operating systems 26.2. GNOME desktop 26.3. KDE desktop 26.4. OS X 26.5.Windows
Licensing advisory 27.1. How to license the applications you build with GStreamer