GStreamer란?

2013. 7. 13. 00:30MultiMedia Framework/GStreamer

GStreamer란 무엇인가??

리눅스 기반에서 streaming을 보다 쉽게 처리할 수 있도록 만든 open source framework.

기본 디자인은 Direct show와 매우 흡사하다.


 

위 그림은 GStreamer의 기본적인 architecture를 나타내고 있는데, protocol을 보면 file로도 떨굴 수 있고, http, rtsp로도 쏠 수 있다.


GStreamer Term.

Elements

- GStreamer에 있어 가장 중요한 객체. 연결된 elements 들의 체인을 만들 수도 있으며 

이렇게 만들어진 체인을 이용하여 스트림 데이터를 처리할 수도 있다.

하나의 element는 하나의 특정 기능을 가질 수 있다. 

file로부터 데이터를 읽어오는 element라든지, date를 decoding, encoding하는 element라든지...

머 Direct show를 해본 사람이라면 금방 이해가 되겠지만.. (나 역시 Direct show를 약간 건드려본...)


위 그림에서 file-source, ogg-demuxer, vorbis-decoder, theora-decoder, audio-sink, video-sink 이런게 다 

element라고 보면 된다. 바로 뒤에 설명하겠지만 element 안에 sink, src라고 있는 것들이 pad


Pads

- Pads는 element의 input과 output을 나타낸다. 이를 통해 다른 element와 연결할 수가 있다.

- Pads는 data를 처리할 수 있는 capability를 가지고 있다. 예를 들어 pad에서 특정 데이터의 흐름에 제한을 둘 수 있다.

- Pads는 source pad와 sink pad로 나눌 수가 있다. source pad는 데이터의 흐름을 밖으로 보낼 때 사용되고,

sink pad는 data의 흐름을 element 내부로 가져올 때 사용된다.


bins

- element들을 모아 놓은 하나의 container

- bin으로 묶어 놓으면 일일이 element를 제어할 필요 없이 한번에 제어가 가능하다.

- 예를 들어 bin 안에 묶여 있는 모든 element의 상태를 변경하고 싶을 경우에는 단순하게 bin 자체의 상태만 변경하면 bin 내부의 모든 element의 상태가 바뀌게 된다.


pipelines

- pipeline은 일련의 데이터의 흐름 자체를 말하는 것 같다. (다분한 주관)

- 예를 들어 사용자가 모든 element의 연결을 끝내고 상태를 START로 변경하면, data의 처리가 발생할 것이다.

- 일단 data의 처리가 시작되면 pipeline은 STOP 될때까지 분리된 쓰레드 형태로 계속적인 동작을 할 것이다.

- Element 단락에 있는 그림 자체를 하나의 pipeline이라고 보면 된다.


Communication

- GStreamer는 다양한 방식으로 application과 pipelin 사이의 데이터 교환 또는 통신을 위한 매커니즘을 제공한다.

- buffer는 pipeline 내에 있는 element들 간의 데이터 전송을 위해 사용된다. buffer는 항상 source에서 sink로 이동한다.(downstream)

- event는 element 간에 전달되거나 element와 application 간에 발생한다. Event는 upstream과 downstream 모두 전달 될 수 있다. 

  event의 downstream은 데이터 흐름의 동기화에 주로 사용된다.

- message는 pipeline의 메시지 버스 상에서 element에 의해 전송되는 object 이다. 주로 error나 tag, 상태 변화, buffer 상태 등의 정보를 전달할 때 사용된다. 

element가 application에 thread-safe하게 정보를 전달 할 수 있는 방법이다.

- queries는 application 단에서 pipeline에게 재생 위치 등의 정보를 요청할 수 있게 한다. queries는 항상 동기적으로 동작하며, element도 연결된 element에게 query를 보내서 정보를 요청할 수 있다. 예를 들면 file size나 duration 정도?

pipeline 내에서는 양방향으로 사용되곤 하지만, upstream queries가 일반적인 방법으로 사용된다.