-- 老范编译自 GStreamer 官方教程
GStreamer 是如此著名的多媒体框架,它的管道和插件模式令人印象深刻,眼界大开,原来管道模式可以玩得这么精妙。
目标
熟悉使用任何一种新的开发软件语言或者软件代码库的方法,最莫过于在屏幕上打印 "Hello world".
而对于多媒体框架来说,播放一段视频比 hello world 更合适于快速上手。
下面代码远多于一个标准的 Hello world, 不过多数是初始化和清理代码,真正起作用的也就四行代码。
废话不多说,还是看代码吧。
程序流程
@startuml
start
:初始化 gst_init;
:构建管道 gst_gst_parse_launch;
:开始播放 gst_element_set_state;
:等待结束 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
}
总结
由此,我们可以知道下面几个问题的答案了。
-
Q. 如何初始化 GStreamer
使用 gst_init -
Q. 如何根据文本描述快速构建管道
使用 gst_parse_launch
- Q. 如何创建一个自动播放的管道
使用 playbin
- Q. 如何告诉 GStreamer 开始播放
使用 gst_element_set_state()
- Q. 如何等着瞧 Gstreamer 来搞定每一件事
使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered()
网友评论