-- 老范編譯自 GStreamer 官方教程
GStreamer 是如此著名的多媒體框架,它的管道和插件模式令人印象深刻,眼界大開,原來管道模式可以玩得這么精妙。
目標
熟悉使用任何一種新的開發(fā)軟件語言或者軟件代碼庫的方法,最莫過于在屏幕上打印 "Hello world".
而對于多媒體框架來說,播放一段視頻比 hello world 更合適于快速上手。
下面代碼遠多于一個標準的 Hello world, 不過多數(shù)是初始化和清理代碼,真正起作用的也就四行代碼。
廢話不多說,還是看代碼吧。
程序流程

@startuml
start
:初始化 gst_init;
:構(gòu)建管道 gst_gst_parse_launch;
:開始播放 gst_element_set_state;
:等待結(jié)束 gst_bus_timed_pop_filtered;
:釋放資源 gst_object_unref ...;
stop
@enduml
源代碼
#include <gst/gst.h>
#ifdef __APPLE__
#include <TargetConditionals.h>
#endif
int
tutorial_main (int argc, char *argv[])
{
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
/* Initialize GStreamer */
gst_init (&argc, &argv);
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm",
NULL);
/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* 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);
/* See next tutorial for proper error message handling/parsing */
if (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR) {
g_error ("An error occurred! Re-run with the GST_DEBUG=*:WARN environment "
"variable set for more details.");
}
/* Free resources */
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
}
int
main (int argc, char *argv[])
{
#if defined(__APPLE__) && TARGET_OS_MAC && !TARGET_OS_IPHONE
return gst_macos_main (tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif
}
總結(jié)
由此,我們可以知道下面幾個問題的答案了。
Q. 如何初始化 GStreamer
使用 gst_initQ. 如何根據(jù)文本描述快速構(gòu)建管道
使用 gst_parse_launch
- Q. 如何創(chuàng)建一個自動播放的管道
使用 playbin
- Q. 如何告訴 GStreamer 開始播放
使用 gst_element_set_state()
- Q. 如何等著瞧 Gstreamer 來搞定每一件事
使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered()