1.参考范例
官方文档
#include <gst/gst.h>
int 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;
}
编译方式
gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`
如果一切正常,启动可执行文件!您应该会看到一个弹出窗口,其中包含直接从 Internet 播放的视频以及音频。
不要被上面的代码量吓到:只有 4 行是真正需要的, 其余的是资源释放
(该代码没有缓冲,查看基础教程Basic tutorial 12: Streaming 解决此问题)
1.首先初始化必要参数
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;
2.函数gst_init():
初始化gstreamer库:
初始化所有内部结构体
检查可用的相关插件
执行任何适用于 GStreamer 的命令行选项
gst_init (&argc, &argv);
gst_init(NULL, NULL);
3.函数gst_parse_launch():
GstElement *gst_parse_launch (const gchar * pipeline_description, GError ** error)
GStreamer 是一个旨在处理多媒体流的框架。 媒体从“source”元素(生产者)向下传播到“sink”元素(消费者),通过一系列执行各种任务的中间元素。 所有互连元素的集合称为“管道”。
在 GStreamer 中,您通常通过手动组装各个元素来构建管道,但是,当管道足够简单并且您不需要任何高级功能时,您可以采用快捷方式:gst_parse_launch()。
playbin
那么,我们要求 gst_parse_launch()为我们构建什么样的管道?这里进入第二个关键点:我们正在构建一个由称为 playbin的单个元素组成的管道。
playbin是一个特殊的element,作为source和sink,是一个完整的pipeline。在内部,它创建并连接所有必要的元素来播放您的媒体,因此您不必担心。
它不允许手动管道所具有的粒度控制,但是,它仍然允许足够的自定义以满足广泛的应用程序。包括本教程。
在本例中,我们只向 playbin 传递一个参数,即我们要播放的媒体的 URI。尝试将其更改为其他内容!无论是 http:// 还是 file:// URI,playbin 都会透明地实例化合适的 GStreamer source!
如果您输入错误的 URI,或者文件不存在,或者您缺少插件,GStreamer 提供了几种通知机制,但我们在这个例子中唯一做的就是出错退出,所以不要期待太多反馈。
gst_parse_launch
(“playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm”,
这行突出了另一个有趣的概念:状态。每个 GStreamer 元素都有一个相关联的状态,您可以或多或少地将其视为常规 DVD 播放器中的播放/暂停按钮。就目前而言,除非您将管道设置为 PLAYING 状态,否则播放不会开始就足够了。
在这一行中,gst_element_set_state() 将管道(我们唯一的元素,记住)设置为 PLAYING 状态,从而启动播放。
/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);
/* Wait until error or EOS */
这些行将等待直到发生错误或找到流的末尾。gst_element_get_bus() 检索管道的总线,而 gst_bus_timed_pop_filtered() 将阻塞,直到您通过该总线收到 ERROR 或 EOS(流结束)。不要太担心行,GStreamer 总线在基础教程 2:Basic tutorial 2: GStreamer concepts中有解释。
就是这样!从这一点开始,GStreamer 会处理一切。当媒体到达终点(EOS)或遇到错误(尝试关闭视频窗口,或拔掉网线)时,执行将结束。始终可以通过在控制台中按 control-C 来停止应用程序。
Cleanup
在终止应用程序之前,我们需要做一些事情来正确地整理自己。
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) {
始终阅读您使用的函数文档,以了解您是否应该释放它们在使用后返回的对象。
在这种情况下,gst_bus_timed_pop_filtered() 返回一条消息,需要使用 gst_message_unref() 释放该消息(有关消息的更多信息,请参见基础教程 2:Basic tutorial 2: GStreamer concepts)。
gst_element_get_bus() 添加了对必须使用 gst_object_unref() 释放的总线的引用。将管道设置为 NULL 状态将确保它释放已分配的所有资源(更多关于基础教程 3:动态管道中的状态)。Finally, unreferencing the pipeline will destroy it, and all its contents.
总结
您的第一个 GStreamer 教程到此结束。希望它的简洁性可以作为该框架强大功能的一个例子!
使用 gst_init() 初始化 GStreamer。
使用 gst_parse_launch() 从文本描述快速构建管道。
使用 playbin 创建自动播放管道。
使用 gst_element_set_state() 向 GStreamer 发出信号以开始播放。
使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered() 等待结束
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)