Your first application에서는 Ogg/Vorbis 파일을 위한 간단한 미디어 플레이어를 만드는 방법을 배웠습니다. Alternative element를 사용하면 Ogg/Speex, MP3 또는 비디오 형식과 같은 다른 미디어 유형을 위한 미디어 플레이어를 만들 수 있습니다. 그러나 스트림의 미디어 유형을 자동으로 감지하고 시스템에서 사용 가능한 모든 element를 확인하여 가능한 최상의 파이프라인을 자동으로 생성할 수 있는 애플리케이션을 만들고 싶을 것입니다. 이 프로세스를 autoplugging이라고 하며 GStreamer에는 고품질 autoplugger가 포함되어 있습니다. Autoplugger를 찾고 있다면 더 이상 읽지 말고 Playback Components로 이동하세요. 이 챕터에서는 autoplugging과 typefinding의 개념을 설명합니다. GStreamer가 미디어 스트림의 유형을 동적으로 감지하기 위해 포함하는 시스템과 이 미디어를 재생하기 위한 디코더 element의 파이프라인을 생성하는 방법을 설명합니다. 동일한 원리를 트랜스코딩에도 사용할 수 있습니다. 이 개념의 완전한 역동성으로 인해 GStreamer는 autoplugger에 대한 조정 없이도 새로운 미디어 유형을 지원하도록 자동으로 확장될 수 있습니다.
먼저 미디어 스트림을 식별하는 동적이고 확장 가능한 방법으로서 미디어 유형의 개념을 소개합니다. 그 후, 미디어 스트림의 유형을 찾기 위한 typefinding 개념을 소개합니다. 마지막으로, autoplugging과 GStreamer 레지스트리를 사용하여 미디어 디코딩처럼 미디어를 한 미디어 유형에서 다른 미디어 유형으로 변환하는 파이프라인 설정 방법을 설명합니다.
스트림을 식별하는 방법으로서의 미디어 유형
이전에 element (또는 pad)가 한 element에서 다음 element로 데이터를 스트리밍할 때 미디어 유형에 동의하는 방법으로 capabilities 개념을 소개했습니다 (Capabilities of a pad 참조). Capability이 미디어 유형과 속성 집합의 조합이라고 설명했습니다. 대부분의 컨테이너 형식 (하드 디스크에서 찾을 수 있는 파일, 예를 들어 Ogg는 컨테이너 형식)의 경우 스트림을 설명하는데 속성이 필요하지 않습니다. 미디어 유형만 필요합니다. 미디어 유형과 수반되는 속성의 전체 목록은 Plugin Writer's Guide에서 찾을 수 있습니다.
Element는 시스템에 로드될 때 미디어 유형을 source 및 sink pad에 연결해야 합니다. GStreamer는 다양한 element와 GStreamer 레지스트리를 통해 기대하고 내보내는 데이터 유형을 알고 있습니다. 이를 통해 매우 동적이고 확장 가능한 element 생성이 가능합니다.
Your first application에서는 Ogg/Vorbis 파일용 음악 플레이어를 빌드하는 방법을 배웠습니다. 이 파이프라인의 각 pad와 연결된 미디어 유형을 살펴보겠습니다. 아래 미디어 유형이 포함된 Hello world 파이프라인 이미지는 이 파이프라인의 각 pad에 속하는 미디어 유형이 무엇인지 보여줍니다.
이제 GStreamer가 알려진 미디어 스트림을 식별하는 방법에 대한 아이디어를 얻었으므로 GStreamer가 미디어 처리 및 미디어 유형 감지를 위한 파이프라인을 설정하는데 사용하는 방법을 살펴볼 수 있습니다.
미디어 스트림 유형 감지
일반적으로 미디어 스트림을 로드할 때 스트림의 유형은 알 수 없습니다. 즉, 스트림을 디코딩할 파이프라인을 선택하기 전에 먼저 스트림 유형을 감지해야 합니다. GStreamer는 이를 위해 typefinding 개념을 사용합니다. Typefinding는 파이프라인의 일반적인 부분으로, 스트림의 유형을 알 수 없는 한 데이터를 읽습니다. 이 기간 동안 typefinder를 구현하는 모든 플러그인에 데이터를 제공합니다. Typefinder 중 하나가 스트림을 인식하면 typefind element가 신호를 내보내고 그 지점부터 passthrough 모듈로 작동합니다. 유형을 찾을 수 없으면 오류가 발생하고 추가 미디어 처리가 중지됩니다.
Typefind element가 유형을 찾으면 애플리케이션은 이를 사용하여 미디어 스트림을 디코딩하기 위한 파이프라인을 연결할 수 있습니다. 이는 다음 섹션에서 설명합니다.
앞서 언급했듯이 GStreamer의 플러그인은 typefinder 기능을 구현할 수 있습니다. 이 기능을 구현하는 플러그인은 미디어 유형 제공하며, 선택적으로 이 미디어 유형에 일반적으로 사용되는 파일 확장자 집합 및 typefind 함수를 제출합니다. 플러그인 내부의 이 typefind 함수가 호출되면 플러그인은 이 미디어 스트림의 데이터가 해당 미디어 유형을 표시하는 특정 패턴과 일치하는지 확인합니다. 일치하는 경우 typefind element에 이 사실을 알리고 어떤 미디어 유형이 인식 되었는지와 이 스트림이 실제로 그 미디어 유형으로 얼마나 확신하는지 알려줍니다. Typefind 기능을 구현하는 모든 플러그인에 대해 이 실행이 완료되면 typefind element는 애플리케이션에게 인식한 것으로 생각되는 미디어 스트림의 종류를 알려줍니다.
다음 코드는 typefind element를 사용하는 방법을 설명합니다. 감지된 미디어 유형을 출력하거나 미디어 유형을 찾을 수 없음을 알려줍니다. 다음 섹션에서는 디코딩 파이프라인을 연결하는 것과 같은 더 유용한 동작을 소개합니다.
#include <gst/gst.h>
[.. my_bus_callback goes here ..]
static gboolean
idle_exit_loop (gpointer data)
{
g_main_loop_quit ((GMainLoop *) data);
/* once */
return FALSE;
}
static void
cb_typefound (GstElement *typefind,
guint probability,
GstCaps *caps,
gpointer data)
{
GMainLoop *loop = data;
gchar *type;
type = gst_caps_to_string (caps);
g_print ("Media type %s found, probability %d%%\n", type, probability);
g_free (type);
/* since we connect to a signal in the pipeline thread context, we need
* to set an idle handler to exit the main loop in the mainloop context.
* Normally, your app should not need to worry about such things. */
g_idle_add (idle_exit_loop, loop);
}
gint
main (gint argc,
gchar *argv[])
{
GMainLoop *loop;
GstElement *pipeline, *filesrc, *typefind, *fakesink;
GstBus *bus;
/* init GStreamer */
gst_init (&argc, &argv);
loop = g_main_loop_new (NULL, FALSE);
/* check args */
if (argc != 2) {
g_print ("Usage: %s <filename>\n", argv[0]);
return -1;
}
/* create a new pipeline to hold the elements */
pipeline = gst_pipeline_new ("pipe");
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
gst_bus_add_watch (bus, my_bus_callback, NULL);
gst_object_unref (bus);
/* create file source and typefind element */
filesrc = gst_element_factory_make ("filesrc", "source");
g_object_set (G_OBJECT (filesrc), "location", argv[1], NULL);
typefind = gst_element_factory_make ("typefind", "typefinder");
g_signal_connect (typefind, "have-type", G_CALLBACK (cb_typefound), loop);
fakesink = gst_element_factory_make ("fakesink", "sink");
/* setup */
gst_bin_add_many (GST_BIN (pipeline), filesrc, typefind, fakesink, NULL);
gst_element_link_many (filesrc, typefind, fakesink, NULL);
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
g_main_loop_run (loop);
/* unset */
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
return 0;
}
미디어 유형이 감지되면 element (예: demuxer 또는 decoder)를 typefind element의 source pad에 연결하면 미디어 스트림 디코딩이 바로 시작됩니다.
Dynamically autoplugging a pipeline
파이프라인을 동적으로 구성하는 데 사용할 수 있는 상위 수준 객체를 사용하려면 Playback Components를 참조하세요.
원문: Autoplugging (gstreamer.freedesktop.org)
Autoplugging
Autoplugging In Your first application, you've learned to build a simple media player for Ogg/Vorbis files. By using alternative elements, you are able to build media players for other media types, such as Ogg/Speex, MP3 or even video formats. However, you
gstreamer.freedesktop.org
'IT와 개발 > GStreamer Study' 카테고리의 다른 글
Playback Components (0) | 2024.07.26 |
---|---|
Pipeline manipulation (0) | 2024.07.19 |
Threads (1) | 2024.06.28 |
Dynamic Controllable Parameters (1) | 2024.06.21 |
Buffering (1) | 2024.06.14 |