当前位置: 首页 > news >正文

【GStreamer学习】之GStreamer基础教程

目标

没有什么比在屏幕上打印出“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基础教程

目标 没有什么比在屏幕上打印出“Hello World”更能获得对软件库的第一印象了&#xff01; 但是由于我们正在学习多媒体框架&#xff0c;所以我们将输出“Hello World&#xff01;”改为播放视频。 不要被下面的代码量吓到&#xff1a;只有 4 行是真正需要的&#xff0c; 其…...

各类Round-Robin总结,含Verilog实现

1. Fixed Priority Arbitrary 固定优先级就是指每个req的优先级是不变的,即优先级高的先被处理,优先级低的必须是在没有更高优先级的req的时候才会被处理。所以转化为数学模型就是找出req序列中第一个为1的位置,然后将其转换为onehot。 例如: req[3:0] = 4b1100 ==> g…...

《软件设计师-知识点》

1、指令流水线 &#xff08;一&#xff09;一条指令的执行过程可分为三个阶段&#xff1a;取指、分析、执行。 取指&#xff1a;根据PC&#xff08;程序计数器&#xff09;内容访问主存储器&#xff0c;取出一条指令送到IR&#xff08;指令寄存器&#xff09;中。 分析&…...

mysql 同义词_数据库中的同义词synonym

一、Oracle数据只有一个实例(简单理解就是Oracle 只能建立一个数据库&#xff0c;不像MySQL&#xff0c;它下面可以创建N个库)&#xff0c;那么Oracle是根据用户灵活去管理的&#xff1b;这点读起来、理解 起来也不那么难&#xff0c;但是除非自己亲自实现一把才理解深入点&…...

Nacos共享配置

本文介绍一下Nacos作为配置中心时&#xff0c;如何读取共享配置 我的环境 Windows10JDK8SpringCloud&#xff1a;Finchley.RELEASESpringBoot&#xff1a;2.0.4.RELEASEspring-cloud-alibaba-dependencies&#xff1a;0.2.2.RELEASENacos-server&#xff1a;1.0.1 本文的项目…...

数据结构——排序(4)

作者&#xff1a;几冬雪来 时间&#xff1a;2023年4月12日 内容&#xff1a;数据结构排序内容讲解 目录 前言&#xff1a; 1.快速排序中的递归&#xff1a; 2.小区间优化&#xff1a; 3.递归改非递归&#xff1a; 4.归并排序&#xff1a; 5.归并排序的非递归形式&…...

C++13:搜索二叉树

目录 搜索二叉树概念 模拟实现搜索二叉树 插入函数实现 插入函数实现&#xff08;递归&#xff09; 查找函数实现 删除函数实现 删除函数实现&#xff08;递归&#xff09; 中序遍历实现 拷贝构造函数实现 析构函数实现 赋值重载 我们在最开始学习二叉树的时候&#xff0c;…...

【从零开始学Skynet】基础篇(五):简易聊天室

在游戏中各玩家之间都可以进行聊天之类的交互&#xff0c;在这一篇中&#xff0c;我们就来实现一个简易的聊天室功能&#xff0c;这在上一篇代码的基础上很容易就能实现。1、功能需求 客户端发送一条消息&#xff0c;经由服务端转发&#xff0c;所有在线客户端都能收到&#xf…...

HDU - 2089 不要62(数位DP)

题目如下&#xff1a; 杭州人称那些傻乎乎粘嗒嗒的人为 626262&#xff08;音&#xff1a;laoer&#xff09;。 杭州交通管理局经常会扩充一些的士车牌照&#xff0c;新近出来一个好消息&#xff0c;以后上牌照&#xff0c;不再含有不吉利的数字了&#xff0c;这样一来&#x…...

网络安全与防御

1. 什么是IDS&#xff1f; IDS(入侵检测系统)&#xff1a;入侵检测是防火墙的合理补充&#xff0c;帮助系统对付网络攻击&#xff0c;扩展了系统管理员的安全管理能力&#xff0c;提高了信息安全基础结构的完整性。主要针对防火墙涉及不到的部分进行检测。 入侵检测主要面对的…...

【DT】蒸脱机的结构和工作原理

DT蒸脱机的结构和工作原理什么是DTDT结构图工作过程什么是DT DT 蒸脱机&#xff08;DesolventazationerToaster&#xff09;&#xff0c;根据英文名可以看出来&#xff0c;他的作用是脱溶、烘烤。用于蒸脱湿豆粕中的溶剂。 大豆油生产工艺有2种&#xff1a;压榨油的加工工艺是…...

Docker管理软件

下面是一些常见的Docker管理软件 Portainer Portainer是一个轻量级的Docker管理界面&#xff0c;可以以用户友好的方式显示Docker环境的状态。它提供了仪表板、容器、镜像、卷、网络等功能。 Rancher Rancher是一个开源的Docker容器管理平台&#xff0c;支持多个主机和集群…...

关于运行时内存数据区的一些扩展概念

栈顶缓存技术&#xff08;Top-of-Stack Cashing&#xff09; 前面提过&#xff0c;基于栈式架构的虚拟机所使用的零地址指令更加紧凑&#xff0c;但完成一项操作的时候必然需要使用更多的入栈和出栈指令&#xff0c;这同时也就意味着将需要更多的指令分派(instruction dispatc…...

计算机组成原理第二章数据的表示与运算(中)

提示&#xff1a;且行且忘且随风&#xff0c;且行且看且从容 文章目录前言2.2.0 奇偶校验码(大纲已删)2.2.1 电路的基本原理 加法器设计2.2.2 并行进位加法器2.2.3 补码加减运算器2.2.4 标志位的生成2.2.5 定点数的移位运算2.2.62.2.6.1 原码的乘法运算2.2.6.2 补码的乘法运算2…...

我的第一台电脑的故事

第一台电脑啊&#xff0c;多么遥远的故事了&#xff0c;又似乎就在眼前。今天重回往事&#xff0c;就简单记录一下吧。 &#x1f331;缘起 那是初一&#xff0c;至今已13年&#xff0c;遂觉遥远&#xff0c;而又是立志我学习的起点&#xff0c;至今还在校园&#xff0c;又觉就…...

【1041. 困于环中的机器人】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向 是 y 轴的正方向。南方向 是 y 轴的负方向。东方向 是 x 轴的正方向。西方向 是 x 轴的负方向。 机器人可…...

几何算法——4.交线(intersection curve)的表达与参数化、微分性质

几何算法——4.曲面求交的交线&#xff08;intersection curve&#xff09;的表达与参数化、微分性质1 关于曲面求交的交线表达2 交线的微分性质3 交线的参数化4 修正弦长参数化的微分性质1 关于曲面求交的交线表达 两个曲面求交&#xff0c;比较经典的方法是用跟踪法&#xf…...

【GPT】让你事半功倍特别好用的5个GPT工具

文章目录前言一、现在还能开通ChatGPT4.0吗&#xff1f;二、推荐五款与ChatGPT的相关实用工具1.一款浏览器插件&#xff1a;ChatGPT for Google2.一款生成图片的AI工具&#xff1a;midjourney3.推荐两款AI自动生成PPT&#xff1a;闪击PPT、mindshow4.识别PFD文件内容对话&#…...

人工智能大模型多场景应用原理解析

前言 在上篇文章《人工智能大模型之ChatGPT原理解析》中分享了一些大模型之ChatGPT的核心原理后&#xff0c;收到大量读者的反馈&#xff0c;诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式人工智能和元宇宙能擦出什么样的火花&#xff1f;)&#xff0c;大模型…...

SpringBoot默认包扫描机制与默认配置文件

文章目录一、SpringBoot默认包扫描机制 - 示例二、SpringBoot默认扫描包机制 - 原理三、SpringBoot手动扫描包机制 - 原理&示例四、ComponentScan与MapperScan五、SpringBoot默认配置文件一、SpringBoot默认包扫描机制 - 示例 默认情况下&#xff0c;扫描启动类同级及其子…...

RabbitMq 消息可靠性问题(一) --- publisher发送时丢失

前言 消息从生产者发送到exchange, 再到 queue, 再到消费者。这个过程中有哪些有消息丢失的可能性呢&#xff1f; 发送时丢失&#xff1a; 生产者发送的消息未送达 exchange消息到达 exchange 后未到达 queue MQ 宕机&#xff0c;queue将消息丢失consumer 接收到消息后未消费…...

Java初识泛型

目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、什么是泛型 三、引出泛型 1、泛型的语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 六、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类…...

寸照换底色技巧大全,超详细图文教程

在日常的设计工作中&#xff0c;我们常常需要将图片的背景色进行修改&#xff0c;以适应不同的场景和需求。其中最常用的方法就是寸照换底色技巧。本文将为大家介绍一些常见的寸照换底色技巧&#xff0c;并提供超详细的图文教程&#xff0c;帮助大家轻松完成这项任务。 一、使…...

这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】

文章目录前言一、准备二、使用步骤1.引入库2&#xff0c;使用这个API查询历史分时数据&#xff1a;3.查询完整历史分时数据4.其他查询方法参数格式&#xff1a;[(市场代码, 股票代码), ...]参数&#xff1a;市场代码, 股票代码, 文件名, 起始位置, 数量参数&#xff1a;市场代码…...

muduo源码剖析--Buffer

Buffer类 Buffer类是自定义处理数据输入缓冲的类&#xff0c;底层是vector< char >&#xff0c;通过readIdx和writeIdx将缓冲区分为3个部分&#xff0c;第一部分是预留的8字节已经读出的缓冲区字节数、第二部分是还未读出的部分、第三部分是可写的部分。 Buffer类的设计…...

AI人工智能简介和其定义

全称&#xff1a;人工智能&#xff08;Artificial Intelligence&#xff09; 缩写&#xff1a;AI / ai 人工智能研究 亦称智械、机器智能&#xff0c;指由人制造出来的可以表现出智能的机器。通常人工智能是指通过普通计算机程序来呈现人类智能的技术。该词也指出研究这样的智…...

python数据清洗

数据清洗包括&#xff1a;空值&#xff0c;异常值&#xff0c;重复值&#xff0c;类型转换和数据整合这里数据清洗需要用到的库是pandas库&#xff0c;下载方式还是在终端运行 &#xff1a; pip install pandas.首先我们需要对数据进行读取import pandas as pddata pd.read_cs…...

Python3 os.makedirs() 方法、Python3 os.read() 方法

Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建目录。像 mkdir(), 但创建的所有intermediate-level文件夹需要包含子目录。 语法 makedirs()方法语法格式如下&#xff1a; os.makedirs(path, mode0o777)参数 path -- 需要递归创建的目录。 mode -- 权限…...

【Linux安装数据库】Ubuntu安装mysql并连接navicat

Linux系统部署Django项目 文章目录Linux系统部署Django项目一、mysql安装二、mysql配置文件三、新建数据库和用户四、nivacat链接mysql一、mysql安装 linux安装mysql数据库有很多教程&#xff0c;根据安装方式不同&#xff0c;相关的步骤也不同。可以参考&#xff1a;【Linux安…...

GaussDB工作级开发者认证—第一章GaussDB数据库介绍

一. GaussDB概述 GaussDB是华为基于openGauss自研生态推出的企业级分布式关系型数据库。具备企业级复杂事物混合负载能力&#xff0c;同时支持分布式事务强一致性&#xff0c;同城跨AZ部署&#xff0c;数据0丢失&#xff0c;支持1000的计算节点扩展能力&#xff0c;4PB海量存储…...