Basic tutorial 2: GStreamer concepts
개요
- Gstreamer element가 뭐임?
- element가 다른 element와 연결되는 방법
- element의 행동을 customize 하는 방법
- error 조건을 위한 버스를 감시를 어떻게 하고 gstreamer message로 부터 정보를 추출하는 방법에 대해
새로워진 Hello World
#include <gst/gst.h>
int
main (int argc, char *argv[])
{
GstElement *pipeline, *source, *sink;
GstBus *bus;
GstMessage *msg;
GstStateChangeReturn ret;
/* Initialize GStreamer */
gst_init (&argc, &argv);
/* Create the elements */
source = gst_element_factory_make ("videotestsrc", "source");
sink = gst_element_factory_make ("autovideosink", "sink");
/* Create the empty pipeline */
pipeline = gst_pipeline_new ("test-pipeline");
if (!pipeline || !source || !sink) {
g_printerr ("Not all elements could be created.\\n");
return -1;
}
/* Build the pipeline */
gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL);
if (gst_element_link (source, sink) != TRUE) {
g_printerr ("Elements could not be linked.\\n");
gst_object_unref (pipeline);
return -1;
}
/* Modify the source's properties */
g_object_set (source, "pattern", 0, NULL);
/* Start playing */
ret = gst_element_set_state (pipeline, GST_STATE_PLAYING);
if (ret == GST_STATE_CHANGE_FAILURE) {
g_printerr ("Unable to set the pipeline to the playing state.\\n");
gst_object_unref (pipeline);
return -1;
}
/* Wait until error or EOS */
bus = gst_element_get_bus (pipeline);
msg =
gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,
GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
/* Parse message */
if (msg != NULL) {
GError *err;
gchar *debug_info;
switch (GST_MESSAGE_TYPE (msg)) {
case GST_MESSAGE_ERROR:
gst_message_parse_error (msg, &err, &debug_info);
g_printerr ("Error received from element %s: %s\\n",
GST_OBJECT_NAME (msg->src), err->message);
g_printerr ("Debugging information: %s\\n",
debug_info ? debug_info : "none");
g_clear_error (&err);
g_free (debug_info);
break;
case GST_MESSAGE_EOS:
g_print ("End-Of-Stream reached.\\n");
break;
default:
/* We should not reach here because we only asked for ERRORs and EOS */
g_printerr ("Unexpected message received.\\n");
break;
}
gst_message_unref (msg);
}
/* Free resources */
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}
하나씩 뿌시기
gstreamer element
- element는 gstreamer의 기본적인 블록 구조 입니다.
- 데이터가 source elements(데이터 생산자)에서 sink elements(데이터 소비자)로 downstream으로 흐르면서 필터 요소를 통과하면서 처리합니다.
Element create
/* Create the elements */
source = gst_element_factory_make ("videotestsrc", "source");
sink = gst_element_factory_make ("autovideosink", "sink");
- videotestsrc
- source element임.
- test video pattern을 만듬.
- debugging 목적에 맞음.
- autovideosink
- sink element 임.
- 받으면 윈도우에 표시해줌.
- os에 따라 다양한 범위의 수용력을 가진 video sink가 존재.
- autovideosink는 최적의 vidoe sink를 골라서 보여줌. (platform 독립적임)
pipeline creation
/* Create the empty pipeline */
pipeline = gst_pipeline_new ("test-pipeline"); // <- 만듬
/* Build the pipeline */
gst_bin_add_many (GST_BIN (pipeline), source, sink, NULL); // element를 pipeline 에 추가.
if (gst_element_link (source, sink) != TRUE) { // <-link
g_printerr ("Elements could not be linked.\\n");
gst_object_unref (pipeline);
return -1;
}
Properties
- gstreamer element는 모두 특정 종류의 GObject 이며, 이는 편의 속성을 제공하는 엔티티입니다.
- 대부분의 gstreamer element에는 사용자 지정 가능한 속성이 있습니다.
- named attributed는 요소의 동작(쓰기 가능한 속성)을 변경하기 위해 수정되거나 요소의 내부 상태(읽을 수 있는 속성)를 알아보기 위해 조사될 수 있습니다.
Gstreamer bus
- gstreamer의 bus는 element에 생성된 GstMessage들을 순서대로, 그리고 애플리케이션 스레드에 전달하는 역할을 하는 객체.
- 미디어의 실제 스트리밍은 응용 프로그램이 아닌 다른 스레드에서 수행되기 때문에 마지막 부분이 중요
- 메시지는 gst_bus_timed_pop_filtered() 및 그 형제들과 동기적으로 버스에서 추출하거나,
- 신호를 사용하여 비동기적으로 추출할 수 있음.
- application은 오류 및 기타 재생 관련 문제를 알리기 위해 항상 버스를 주시해야함.
'👨🏻💻 Development > 🗂 etc' 카테고리의 다른 글
Gstreamer Basic tutorial 6: Media formats and Pad Capabilities (1) | 2023.03.23 |
---|---|
Gstreamer Basic tutorial 3: Dynamic pipelines (0) | 2023.03.23 |
Gstreamer Basic tutorial 1 (0) | 2023.03.23 |
[Network] ssh 키인증 방식 (0) | 2021.10.20 |