본문 바로가기

MultiMedia Framework/GStreamer17

Stream Seek 이번 포스팅에서는 스트림 위치 값 등을 얻기 위해 어떻게 파이프라인에 요청을 하는 지와 스트림의 위치를 어떻게 조작하는지에 대해 살펴볼 것이다. 일단 코드에 앞서 GstQuery 라는 객체가 새롭게 등장하는데, 이 GstQuery는 element나 pad에게 정보를 요청하기 위해 사용된다.이전에는 파이프라인이 구성되면 EOS나 ERROR가 발생하기 전까지는 메인 function에서 계속 대기하는 것 위주로 설명을 하였는데, 이번 포스팅에서는 주기적으로 파이프라인을 깨워서 스트림 위치에 대한 정보를 요청하고 화면에 해당 위치를 출력하는 프로그램을 짤 것이다. 실행해보면 화면이 출력되고, console 창에 스트림 위치 값이 계속 변하는 것을 볼 수 있다. typedef struct _CustomData{ .. 2015. 3. 24.
동적으로 파이프라인 구축하기 이번 포스팅을 통해 동적으로 파이프라인을 구축하는 방법을 살펴볼 수가 있다. 언제나 그렇듯이 실행 ㄱㄱ $> g++ -o tutorial3 tutorial3.c `pkg-config --cflags --libs gstreamer-1.0`$>./tutorial3Pipeline state changed from NULL to READY:Received new pad 'src_0' from 'source': It has type 'video/x-raw' which is not raw audio. Ignoring.Received new pad 'src_1' from 'source': Link succeeded (type 'audio/x-raw').Pipeline state changed from READY to.. 2015. 3. 21.
수동으로 파이프라인 구축하기 전 포스팅에는 uri를 가져와서 playbin에 담은 후 gst_parse_launch를 통해 pipeline을 구축하는 방법을 설명했다. 이번에는 직접 pipeline을 구축해 보려고 한다. 이번에도 컴파일을 한 후 재생을 해보자. $> g++ -o tutorial2 tutorial2.c `pkg-config --cflags --libs gstreamer-1.0` 예전에 화면 조정 시간에 많이 봤던 장면이네..코드를 살펴보자.. gst_init(&argc, &argv); 이전 포스팅에서 설명했으니 이번엔 skip.. source = gst_element_factory_make("videotestsrc", "source");sink = gst_element_factory_make("autovideosin.. 2015. 3. 20.
hello world 찍기 대부분의 언어들은 Hello world를 찍어보는 것을 시작으로 프로그래밍을 이야기한다. 그럼 과연 gstreamer에서도 hello world를 찍어볼 수 있을까?여기서는 hello world를 화면에 찍어보기 보다는 gstreamer에서 hello world 격인 멀티미디어 재생을 해보려고 한다.해당 Tutorial은 gstreamer sdk 문서를 참조하였다. 해당 코드를 우선 실행시켜보자. 아래와 같이 컴파일을 하면 tutorial1 이라는 실행 파일이 생성된다. $> g++ -o tutorial1 tutorial1.c `pkg-config --cflags --libs gstreamer-1.0` 이제 생성된 tutorial1을 실행해보자. $> ./tutorial1 화면이 잘 재생되는가??? 이제.. 2015. 3. 19.
Buffer와 Event Buffer버퍼는 pipeline을 통해 흘러가는 데이터를 포함한다. source Element는 일반적으로 새로운 버퍼를 생성하고 생성된 버퍼를 다음 element로 전송한다. 버퍼는 메모리의 시작 주소, 메모리 크기, 타임스탬프, 레퍼런스 카운트(얼마나 많은 element가 해당 버퍼를 쓰고 있는지를 나타내는 카운트), 그리고 버퍼 플래그로 구성된다.일반적인 버퍼의 사용은, 맨 처음 버퍼가 생성되고 메모리가 할당되며 해당 메모리에 데이터를 복사한다.복사된 메모리를 가진 버퍼를 다음 element에 넘기고, 다음 element는 버퍼에 쓰여진 데이터를 읽은 후 버퍼의 레퍼런스 카운트를 줄인다.버퍼에 대한 보다 정교한 사용은 GStreamer를 이용해보며 차츰 익혀나가야 하겠다. Events이벤트 역시 .. 2013. 8. 1.
Ghost pads Element들은 다른 Element와 연결하기 위해 각각 pads를 가지고 있다. 그렇다면 Bin은? Bin 자체도 내부 Element와 연결하거나 외부로부터 데이터를 받기 위해서는 pad가 있어야 하는 것 아닌가? 그래서 생긴게 바로 Ghost pads이다. 그림에서 보면 Element1의 sink pad는 이제 bin의 sink pad 역할도 함께 담당하게 된다. ghostpad는 gst_ghost_pad_new()를 사용하여 생성한다. 2013. 7. 31.
Capabilities의 사용 용도 Capabilities(짧게 앞으로는 cap) 는 pad에서 지원하고 있는 데이터의 type에 대해 기술하고 있다. 그렇다면 이러한 cap을 과연 어떤 용도로 사용하게 될까?해당 메뉴얼에서는 크게 4가지의 사용 방법을 제시하고 있다. Autoplugging- element가 자동으로 cap이 지원하는 pad를 연결할 수 있도록 하는 autoplugging을 지원한다. Compatibility detection- 두 개의 pads가 서로 연결되어 있다고 한다면, GStreamer는 해당 pads가 동일한 미디어 타입을 지원하는 지를 검증할 수 있다.- cap을 통해 해당 검증을 가능케 해준다. Metadata- pad로부터 cap 정보를 읽음으로써, application은 현재 pad에 흐르고 있는 미디어.. 2013. 7. 30.
Capabilities of a pad Pad의 capabilities를 사용함으로써 어떤 data type이 pad를 통해 흘러들어가고 나가는지를 확인할 수 있다.Pad의 capabilities는 GstCaps 객체에 의해 기술된다. 내부적으로 GstCaps는 하나 이상의 GstStructure를 포함하고 있으며, 이 GstStructure는 하나의 미디어 타입에 대해 기술해 놓고 있다.간단히 "vorbisdec" element를 예로 들자면, 해당 element에 대해 gst-inspect로 분석해 보면, source pad와 sink pad가 각각 한개씩 존재하는 것을 알 수 있다. source pad는 raw audio mime 타입의 데이터("audio/x-raw-float")를 다음 element로 전송하고 있고 sink pad는 .. 2013. 7. 29.
Pads Pad 타입은 'direction'과 'availability'. 두 가지 프로퍼티에 의해 정의된다. 이 전에도 설명한 것과 같이 GStreamer에서는 'source pad'와 'sink pad'라는 두 개의 pad direction을 정의한다.source pad와 sink pad는 이전에도 설명한 적이 있으니 skip~또한 pad는 세 개의 availability를 가진다.바로 always, sometimes 그리고 on request.always pad는 항상 존재하는 pad를 말하고, sometimes pad는 어떤 특정 경우에는 존재하는 pad를 말한다.on request pad는 application에 의해 요청이 들어왔을 때만 존재하는 pad를 말한다. Dynamic(or sometimes).. 2013. 7. 28.