目标

没有什么比在屏幕上打印出“Hello World”更能获得对软件库的第一印象了!

但是由于我们正在学习多媒体框架,所以我们将输出“Hello World!”改为播放视频。

不要被下面的代码量吓到:只有 4 行是真正需要的, 其余的是清理代码,在 C语言 中,这总是有点冗长。

事不宜迟,为您的第一个 GStreamer 应用程序做好准备……。

Hello world

将此代码复制到名为basic-tutorial-1.c的文本文件中(或在您的 GStreamer 安装目录中找到它)。

basic-tutorial-1.c

#include <gst/gst.h>#ifdef __APPLE__
#include <TargetConditionals.h>
#endifint
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://www.freedesktop.org/software/gstreamer-sdk/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_IPHONEreturn gst_macos_main (tutorial_main, argc, argv, NULL);
#elsereturn tutorial_main (argc, argv);
#endif
}

按照安装教程中提到的方式编译它,如果遇到编译错误,请仔细检查给出的错误说明。

如果一切正常,启动可执行文件!您应该会看到一个弹出窗口,其中包含直接从 Internet 播放的视频以及音频。恭喜!

需要帮助?

如果您需要帮助来编译此代码,请参阅针对您的平台构建教程部分(Building the tutorials):Linux、Mac OS X 或 Windows,或在 Linux 上使用此特定命令:

gcc basic-tutorial-1.c -o basic-tutorial-1 `pkg-config --cflags --libs gstreamer-1.0`

如果您需要帮助来运行此代码,请参阅适用于您的平台的运行教程部分(Running the tutorials):Linux、Mac OS X 或 Windows。

Required libraries: gstreamer-1.0

本教程将打开一个窗口并显示一个带有音频的电影。 媒体是从 Internet 获取的,因此窗口可能需要几秒钟才会出现,具体取决于您的连接速度。 此外,由于没有延迟管理(缓冲),因此在连接速度较慢时,电影可能会在几秒钟后停止。 查看基础教程Basic tutorial 12: Streaming 如何解决此问题。

Walkthrough

让我们回顾一下这些代码行,看看它们做了什么:

GstElement *pipeline;GstBus *bus;

这必须始终是您的第一个 GStreamer 命令。除其他事项外,gst_init():

  • 初始化所有内部结构

  • 检查可用的插件

  • 执行任何适用于 GStreamer 的命令行选项

如果您始终将命令行参数 argc 和 argv 传递给 gst_init(),您的应用程序将自动受益于 GStreamer 标准命令行选项(更多信息请参见基础教程 10:Basic tutorial 10: GStreamer tools)

/* Initialize GStreamer */gst_init (&argc, &argv);/* Build the pipeline */

这一行是本教程的核心,并举例说明两个关键点:gst_parse_launch()和 playbin。

gst_parse_launch

GStreamer 是一个旨在处理多媒体流的框架。 媒体从“source”元素(生产者)向下传播到“sink”元素(消费者),通过一系列执行各种任务的中间元素。 所有互连元素的集合称为“管道”。

在 GStreamer 中,您通常通过手动组装各个元素来构建管道,但是,当管道足够简单并且您不需要任何高级功能时,您可以采用快捷方式:gst_parse_launch()。

此函数采用管道的文本表示并将其转换为实际管道,这非常方便。(请参阅基本教程 10:Basic tutorial 10: GStreamer tools以了解 gst-launch-1.0和 gst-launch-1.0语法)。

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 发出信号以开始播放。

  • 如何高枕无忧,而 GStreamer 使用 gst_element_get_bus() 和 gst_bus_timed_pop_filtered() 处理一切。

【GStreamer学习】之GStreamer基础教程相关推荐

  1. html5教程 w3cschool,W3Cschool学习笔记——HTML5基础教程

    HTML5 建立的一些规则:新特性应该基于 HTML.CSS.DOM 以及 JavaScript. 减少对外部插件的需求(比如 Flash) 更优秀的错误处理 更多取代脚本的标记 HTML5 应该独立 ...

  2. 深度学习之Pytorch基础教程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:李祖贤,Datawhale高校群成员,深圳大学 随着深度学习的发展 ...

  3. 【深度学习】深度学习之Pytorch基础教程!

    作者:李祖贤,Datawhale高校群成员,深圳大学 随着深度学习的发展,深度学习框架开始大量的出现.尤其是近两年,Google.Facebook.Microsoft等巨头都围绕深度学习重点投资了一系 ...

  4. JSP学习笔记之基础教程

    JSP基础教程 什么是JSP JSP概念:Java 服务器页面 (Java Server Page ,JSP) 以扩展名== .jsp== 保存 在HTML中嵌入Java脚本语言 由应用服务器中的JS ...

  5. python自学看不懂怎么办_零基础学习python但是基础教程一看到后面就开始看不懂了,怎么办?...

    廖大的教程看不懂不要担心,简明教程也看不下去也不要怕,世界上总有人基础比你好的,不过我们可以用笨办法来学习python. 0,先找一个python3版本的<笨办法学python>,从头看, ...

  6. Java学习开发入门基础教程系列

    ava是一种跨平台的语言,一次编写,到处运行,在世界编程语言排行榜中稳居第二名(第一名是C语言). Java用途广泛,可以用来开发传统的客户端软件和网站后台,也可以开发如火如荼 Android 应用和 ...

  7. oracle自学入门教程,Oracle学习快速入门基础教程

    修改密码方法:1.SQL>: grant connect to USRNAME identified by USRPWD :2.SQL>: alter user USRNAME ident ...

  8. ArcGIS PRO基础教程(二)

    大家好,我是南南 今天我们来学习arcgis pro基础教程的第二期 另外由于公众号改版,大家可以加个给我星标,不然可能会收不到消息 对Pnt按kriging(克里格插值),获得整个范围的ph分布图 ...

  9. 免费领,自动化控制编程入门到开挂学习路径(附教程和软件工具)

    大家好,我是华山自控编程的朱老师,很多同学都在讨论上位机运动控制卡与机器视觉编程的问题,今天写了干货,希望可以帮助到你们! 一.入门上位机编程的疑问解答 1.自动化控制编程分哪几个方向? 答:自动化控 ...

  10. ppt python 爬虫_python基础教程 PPT-python为什么叫爬虫

    看过了Python基础教程,接下来应该怎么做 看完基础教程代表你已经入门了,接下来就需要你做一下项目,把书本上的知识转化为自己的,活学活用,之后再进行中高级的学习! Python基础教程的介绍 本书包 ...

最新文章

  1. 网站关键词排名骤降的原因及解决办法
  2. c语言地图导航代码大全,C语言实训—电子地图导航系统源代码.docx
  3. go errgroup 递归搜索目录中的Go文件
  4. [Redux/Mobx] redux-saga和redux-thunk有什么本质的区别?
  5. matlab里面连接器是什么,连接器
  6. 成功送小米上市的米粉们,反被 P2P 爆雷炸成了灰!
  7. MySQL数据库页损坏怎么办,innodb_force_recovery参数帮你解决问题
  8. Android Media Framework(1): 总纲
  9. AST解析基础: 如何写一个简单的html语法分析库
  10. 2.深入分布式缓存:从原理到实践 --- 分布式系统理论
  11. python本科毕设_软件工程本科毕设能做什么?
  12. [从头学数学] 第193节 推理与证明
  13. python去除图片水印api_python opencv去图片水印
  14. html中如何放音乐 和视频播放器,HTML5培训之HTML5音乐播放器和视频播放器分享
  15. SCI和EI的索引号查询方法
  16. 无法打开Win10计算机管理,win10系统我的电脑管理打不开怎么办
  17. 【互动媒体】”十二个一“的文艺创作的文本分析与可视化
  18. 超实用后台UI模板有这些就够了!(三)
  19. 计算机怎么升级64位操作系统,如何将计算机的32位更改为64位
  20. java导出excel合并单元格

热门文章

  1. 欧阳修与梅尧臣:逢君伊水畔,一见已开颜
  2. java jdbc 批量更新_java – JDBC PreparedStatement,批量更新和生成的密钥
  3. LightOJ-1012-Guilty Prince [DFS]
  4. 【微信小程序】生命周期
  5. adobe illustrator如何绘制箭头
  6. sql查询成绩表中每一科成绩最高的分数以及这个学生的名字,学科名
  7. linux 扫描磁盘柜,Linux下做磁盘阵列和各种热备份
  8. C语言-进程——信号量
  9. android开发论坛
  10. Jvectormap中文帮助文档(API)