基础教程一:Hello world!
1,目标
没有什么比在屏幕上打印“Hello World”更好的方式来获得对软件库的第一印象了!
但是由于我们正在处理多媒体框架,我们将播放一段视频。
不要被下面的代码量吓到:只有4行可以真正工作。其余的是清理代码,而且在C中,这总是有点冗长。
事不宜迟,为您的第一个GStreamer应用程序做好准备…
2,Hello world
将此代码复制到名为 basic-tutorial-1.c 文本文件中(或找到它在您的GStreamer安装中)。
基础教程
#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_printerr ("An error occurred! Re-run with the GST_DEBUG=*:WARN "
"environment variable set for more details.\n");
}
/* 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 ((GstMainFunc) tutorial_main, argc, argv, NULL);
#else
return tutorial_main (argc, argv);
#endif
}
按照在Linux上安装、在Mac OS X上安装或在Windows上安装中的说明进行编译。 仔细检查这些部分中给出的说明。
如果一切正常,请启动可执行文件!您应该会看到弹出一个窗口,其中包含直接从网络上播放的视频以及音频。
需要帮忙吗?
如果您需要帮助来编译此代码,请参阅为您的平台构建教程部分:Linux、Mac OS X或 Windows,或在Linux上使用此特定命令:
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`如果您需要帮助来运行此代码,请参阅您平台的运行教程部分:Linux、Mac OS X或 窗户。
所需库:
gstreamer-1.0
本教程打开一个窗口并显示一个带有音频的电影。这段媒体是从网络上获取的,因此窗口可能需要几秒钟才能出现,等待时间取决于您的连接速度。此外,没有延迟管理 (缓冲),所以在网速慢时,电影可能会在几秒钟后停止。 请参阅基本教程12:流式传输如何解决此问题。
3,工作流
让我们回顾一下这些代码行,看看它们有什么作用:
3.1,初始化
/* Initialize GStreamer */
gst_init (&argc, &argv);
GStreamer第一个命令必须是gst_init ()。除此之外, gst_init(),它完成了以下工作:
-
初始化所有内部结构体
-
检查平台所有可用的插件
-
执行任何用于GStreamer的命令行选项
如果您总是传递命令行参数 argc 和 argv 到gst_init()你的应用程序将自动受益于GStreamer标准命令行选项(更多关于此 在基本教程10:GStreamer工具)
3.2,构建 Pipeline
/* Build the pipeline */
pipeline =
gst_parse_launch
("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm",
NULL);
这一行是本教程的核心,并举例说明了两个关键:gst_parse_launch() 和 playbin。
3.2.1,gst_parse_launch
GStreamer 是一个为处理多媒体流而设计的框架。媒体从source元素(生产者)流动到sink元素(消费者),通过一系列执行各种任务的中间 element 。所有相互连接的element的集合称为“pipeline”。
在GStreamer中,您通常通过手动组装pipeline来构建pipeline单个element,但是,当pipeline足够简单时,你可以使用GStreamer的高级特性您可以走捷径: gst_parse_launch()。
这个函数将解析一条文本形式表示的pipeline并将其转化成一条真实的pipeline,使用起来十分便利。事实上,这个功能是非常方便,有一个完全围绕它构建的工具,您将获得非常熟悉(请参阅基本教程10:GStreamer工具以了解 gst-launch-1.0和 gst-lanuch-1.0语法)。
3.2.2,playbin
那么,我们要求 gst_parse_launch() 建造什么样的pipeline?这里进入第二个关键点:我们正在建造一条 pipeline 由称为 playbin的单个element 组成。
playbin 是一个特殊的 element,它具备一个pipeline的所有特点,既有source,又有sink。它在内部自动创建和连接所有播放媒体需要的element,用户不需要在意这些细节。
它不具备手动管道所具有的控制粒度,但是它仍然允许足够的定制以满足广泛的应用程序。包括本教程。
在这个例子中,我们只传递一个参数给playbin,它是我们要播放的媒体的URI。尝试将其更改为某些内容。否则,无论是http:// 还是 file:// URI,playbin都会显示地初始化适当的GStreamer source !
如果您输入了错误的URI,或者文件不存在,或者您缺少一个插件,GStreamer提供了几种通知机制,但我们在本例中唯一要做的就是在出错时退出,所以不要期望太多反馈。
/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
这一行突出了另一个有趣的概念:state(状态)。每 GStreamer元素有一个关联的状态,您可以或多或少地把它想象成普通DVD播放器中的播放/暂停按钮。现在,只要知道除非你将 pipeline 设置为PLAYING 状态否则不会开始回放。
在这一行中,gst_element_set_state() 正在设置pipeline(记住唯一的element)到PLAYING状态,从而启动回放。
3.3,监听 Pipeline
/* 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);
上述代码将等到发生错误或流结束 找到了。gst_element_get_bus() 检索pipeline的bus,gst_bus_timed_pop_filtered()阻塞程序直到程序运行引发ERROR或者到达EOS。不要太担心这一行,GStreamer总线在基本教程2:GStreamer概念中解释。
就是这样!从这一点开始,GStreamer将接管整个程序。当媒体到达其末端(EOS)或遇到错误(尝试关闭视频窗口或拔掉网线)时,执行将结束。应用程序始终可以通过在控制台中按Control-C来停止。
3.4,资源回收
但是,在终止应用程序之前,我们需要做几件事来正确整理自己。
/* Free resources */
gst_message_unref (msg);
gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
return 0;
始终阅读您使用的函数的留档,以了解您是否应该释放它们在使用后返回的对象。
在这种情况下,gst_bus_timed_pop_filtered()返回了一个需要用gst_message_unref() 释放的GstMessage(更多关于消息 基本教程2:GStreamer概念)。
gst_element_get_bus()将为pipeline的bus添加引用计数,需要使用gst_object_unref()释放。在释放pipeline及其下的所有element之前需要将pipeline的状态设置为NULL(更多关于 基础教程3:动态管道)。最后,取消引用pipeline将销毁它,以及它的所有内容。
4,结论
GStreamer的第一个教程到此结束。我们希望它的简洁可以作为这个框架有多强大的一个例子!
让我们总结一点。今天我们学到了:
-
如何使用 gst_init() 初始化GStreamer。
-
如何使用 gst_parse_launch() 文本描述快速构建一条pipeline 。
-
如何使用 playbin 创建一条自动的播放pipeline。
-
如何使用 gst_element_set_state() 向GStreamer发送开始播放信号。
-
如何使用 gst_element_get_bus()和gst_parse_launch() 监听pipeline并进行相关处理。
1158

被折叠的 条评论
为什么被折叠?



