GStreamer 简明教程(一):环境搭建,运行 Basic Tutorial 1 Hello world!

文章目录

  • 前言
  • 一、源码环境搭建
  • 二、Basic Tutorial 1 Hello world
  • 三、开启更多日志
  • 参考


前言

本系列文章将纪录学习 [GStreamer] 的过程。

为什么想学习 [GStreamer],有这么几个原因:

  1. 多媒体处理是一个复杂的任务,[GStreamer] 的管道架构可以将复杂的任务以「图」的形式模块化的进行处理,它足够灵活。学习 [GStreamer] 这种架构思想,可以帮助我扩展视野,面对复杂任务如何给出一套灵活可靠的框架。
  2. 掌握 [GStreamer] 对求职有所帮助,如果你对 [GStreamer] 很熟悉,很多音视频岗位是可以加分的。
  3. 我想造一个视频编辑框架的轮子,无论是基于 [GStreamer] 来实现,还是参考 [GStreamer] 的框架,我都得对 [GStreamer] 非常熟悉。

我对 FFMpeg 比较熟悉,对于 [GStreamer] 属于纯纯新手,因此本系列文章面向的观众也是像我一样想要学习 [GStreamer] 的小白,内容上不会太过深入,属于是想到啥写啥,遇到啥写啥,将学习中查找的资料、遇到的问题、解决的方式、个人的理解通通都写上。

当前目标:

  1. 将 Basic Tutorial 中教程全部过一遍。
  2. 封装一个自己的插件

一、源码环境搭建

在源码环境下进行断点调试,可以一窥 [GStreamer] 的实现逻辑。
如何搭建源码调试环境请参考 GStreamer 源码编译,在 Clion 下搭建调试环境

接下来说明如何在源码环境下运行 Tutorial。

  1. 新建文件夹。在 gstreamer/subprojects 下,找一个文件夹,例如我用的是 gst-examples。在 gst-examples 下面新建一个 my_examples 文件夹
    在这里插入图片描述
  2. 修改 gst-examples 的 meson.build,添加 subdir('my_examples') 即可
    在这里插入图片描述
  3. 添加 tutorial 运行文件。从 gstreamer/subprojects/gst-docs/examples/tutorials 下,拷贝 basic-tutorial-* 等这些教程运行文件到 my_examples 下
  4. 更新 my_examples/meson.build 文件,如下
executable('basic-tutorial-1',['basic-tutorial-1.c'],dependencies : [gst_dep, m_dep])

在这里插入图片描述
至此,教程运行文件添加完毕,我们可以在 CLion 上快乐地源码调试运行这些教程了。

我把对应的代码上传到了 github 上,你可以参考这里 my_examples

二、Basic Tutorial 1 Hello world

教程链接:https://gstreamer.freedesktop.org/documentation/tutorials/basic/hello-world.html?gi-language=c

代码咋一看挺多挺唬人的,但其实真正在工作的就 4 行,其他的都是初始化、清理等。下面对重要代码做下说明

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 *//...return 0;
}

这些代码行是一个使用GStreamer的基本程序,它主要用来播放网络上的流媒体内容。以下是这些代码的各个步骤的总结:

  1. 初始化GStreamer

    gst_init (&argc, &argv);
    

    这是所有GStreamer应用程序的第一个命令。这个函数完成了内部结构的初始化,检查插件的可用性,和执行为GStreamer预设的命令行选项。如果你的应用程序总是把argc和argv参数传递给gst_init,你的应用程序将自动受益于GStreamer的标准命令行选项。

  2. 构建管道

    pipeline = gst_parse_launch("playbin uri=https://gstreamer.freedesktop.org/data/media/sintel_trailer-480p.webm", NULL);
    

    gst_parse_launch()函数把一个文本表达的pipeline转变为一个实际的pipeline,这个函数十分方便。你需要构建的pipeline是由一个叫做playbin的元素组成,playbin是一个特殊的元素,它可以作为一个源和一个sink,它是一个完整的pipeline。在这个例子中,我们只给playbin传递了一个参数,这个参数是我们想要播放的媒体的URI。试试改变它吧!不论它是一个http://或者file://的URI,playbin都会透明的实例化一个适当的GStreamer源。

  3. 开始播放

    gst_element_set_state (pipeline, GST_STATE_PLAYING);
    

    这行代码展示了另一个有趣的概念:状态。每一个GStreamer元素都有一个关联的状态,你可以大致理解为你的DVD播放器上的播放/暂停按钮。播放将不会开始,除非你把管道设置为播放状态。在这行代码中,gst_element_set_state()将管道设置为播放状态,从而启动播放。

  4. 等待错误或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()获取管道的总线,而gst_bus_timed_pop_filtered()则会阻塞,直到你通过这个总线接收到一个错误或者EOS(流结束)。

三、开启更多日志

在运行 Gstreamer 程序时开启更多日志可以帮助我们排查错误。

#NameDescription
0none不输出任何信息
1ERROR打印致命错误信息,正确的错误处理可以使得程序还能正常运行
2WARNING打印警告信息,程序可能出现预期外的现象
3FIXME打印“fixme”信息,通常意味着程序触发了一个已知不完整的代码路径,程序大多数情况下可能工作正常,但在特定情况下可能会引发问题
4INFO打印消息类信息,通常用于报告系统中只发生一次的事件,或者是重要且罕见的事件
5DEBUG打印所有的调试信息,包括参数更改,加载,卸载等事件发生
6LOG打印所有日志消息,包含大量重复发生的事件信息
7TRACE打印所有跟踪信息,包括每次修改GstMiniObject(如GstBuffer或GstEvent)的引 用计数等信息
9MEMDUMP记录所有内存转储消息。这是最繁重的日志记录,可能包括转储内存块的内容

在运行时,通过设置环境变量 GST_DEBUG 即可。例如 export GST_DEBUG=2 意味着打印 WARNING 和 ERROR 信息

参考

  • my_examples
  • Basic Tutorial 1 Hello world
  • GStreamer基础教程之调试工具
  • GStreamer基础教程13 - 调试Pipeline
    [GStreamer]:https://gstreamer.freedesktop.org/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/396214.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker最佳实践(七):安装MinIO文件服务器

大家好,欢迎各位工友。 Minio是一个开源免费的高性能对象存储服务器,专为大规模数据集和高并发访问而设计。它具有出色的读写性能和低延迟,可以满足对数据速度和效率要求较高的应用场景。本篇呢我们就来演示一下如何在Docker中搭建Minio容器&…

Java的线程实现

我们知道,线程是比进程更轻量级的调度执行单位,线程的引入,可以把一个进程的资源分配和执行调度分开,各个线程既可以共享进程资源(内存地址、文件I/O等),又可以独立调度。目前线程是Java里面进行…

智能分析,安全无忧:AI视频分析技术在安全生产中的深度应用

在当今快速发展的科技时代,视频智能分析技术(Intelligent Video Analysis,简称IV)已经成为提升安全生产水平的重要手段。这一技术通过计算机图像视觉分析技术,实现了对场景中目标的自动识别和追踪,有效提升…

【层归一化用于单个样本适合于序列建模,通俗】

层归一化(Layer Normalization),简称 LayerNorm,会将神经网络层的激活值规范到均值为0,并将其方差归一化为1。尤其是在循环神经网络(RNNs)和自注意力模型(如 Transformers&#xff0…

【学习笔记】Day 8

写在开头: 最近老板突然提出一个全新的组会主题,是关于 “最近我犯的傻”,其目的在于提供乐子的同时引以为戒。本来我还在愁到底去哪里找干的啥事儿,结果今天直接拉了个大的。什么叫无心插柳柳成荫啊,悲。 一…

【C++进阶】红黑树

目录 什么是红黑树?红黑树红黑树的性质 定义红黑树红黑树的操作insertinorderfindheightsize构造函数析构函数赋值拷贝判断红黑树 全部代码总结 什么是红黑树? 红黑树 红黑树(Red-Black Tree)是一种自平衡的二叉搜索树&#xff…

lora通信模块工作模式(半双工)

一,工作模式 1,透明模式 2,定点模式 3,广播模式 测试结果 1,定点模式下两个必须都是定点模式才能通信 2,广播模式可以发送到透明模式 3,定点模式发送不了透明模式

【Python第三方库】Requests全面解析

文章目录 安装基本用法测试网站发送GET请求发送POST请求更多请求请求参数请求头其他常用请求属性处理响应响应状态码响应内容 处理超时处理异常 requests 是一个非常流行的 Python HTTP 库,用于发送所有类型的 HTTP 请求。它简洁易用,能够处理复杂的请求…

数据结构——栈的讲解(超详细)

前言: 小编已经在前面讲完了链表和顺序表的内容,下面我们继续乘胜追击,开始另一个数据结构:栈的详解,下面跟上小编的脚步,开启今天的学习之路! 目录 1.栈的概念和结构 1.1.栈的概念 1.2.栈的结构…

Vatee万腾平台:数据智能的创新引擎,引领企业数字化转型新纪元

在数字化转型的浪潮中,企业正以前所未有的速度重构着自身的运营模式与核心竞争力。作为这一变革的领航者,Vatee万腾平台凭借其卓越的数据智能能力,正逐步揭开企业数字化转型的新篇章。本文将深入探讨Vatee万腾平台如何以数据为核心&#xff0…

【多线程基础】进程和线程的区别和联系(重要)

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:Java多线程 📚本系列文章为个人…

【JavaEE】CAS原理

目录 ​前言 什么是CAS? 如何使用CAS? CAS实现自旋锁 CAS的ABA问题 面试题 1.讲解下你自己理解的CAS机制 2.ABA问题怎么解决? 前言 在多线程中,多个线程同时对一个共享变量进行读写操作,那么就会出现线程安全问…

01 NoSQL之Redis配置与优化

目录 1.1 Redis介绍 1.1.1关系数据库与非关系型数据库 1 . 关系型数据库 2. 非关系型数据库 3.非关系型数据库产生背景 (1) High performance--对数据库高并发读写需求 (2) Huge Storage--对海量数据高效存储与访问需求 (3) High Scalability …

gitlab cicd快速入门有哪些方法 gitlabcicd和Jenkins哪个更好用

在现代软件开发中,持续集成和持续交付(CI/CD)已成为必不可少的流程。它们不仅能提高开发效率,还能保证代码的质量和稳定性。在众多CI/CD工具中,GitLab和Jenkins是最为常用的两种。本文将围绕“gitlab ci/cd快速入门有哪…

vuex properties of undefined (reading ‘getters‘)

前言: 最近打算用vue 写个音乐播放器,在搞 vuex 的时候遇到一个很神奇报错;vuex 姿势练了千百次了,刚开始的时候我一直以为是代码问题,反复检查了带了,依旧报错。 Error in mounted hook: "TypeError:…

[Android] [解决]Bottom Navigation Views Activity工程带来的fragment顶部空白间距问题

用Android Stuio创建一个Bottom Navigation Views Activity工程, 我们刻意设置一下fragment背景为黑色,会发现,这个fragment离顶部还有一段不小空白距离, 怎么解决呢? 在activity_main.xml里面,删掉这句&a…

极狐GitLab安全版本:16.10.1、16.9.3、16.8.5

极狐GitLab 是 GitLab 在中国的发行版,专门面向中国程序员和企业提供企业级一体化 DevOps 平台,用来帮助用户实现需求管理、源代码托管、CI/CD、安全合规,而且所有的操作都是在一个平台上进行,省事省心省钱。可以一键安装极狐GitL…

数据结构之线性表(单链表的实现)

目录 一、单链表的原理 二、单链表的实现 1.单链表的定义 2.单链表的初始化 3.清空单链表 4.单链表是否为空 5.单链表的长度 6.获取指定位置 i 的元素 7.获取指定元素 e 的位置 8.向链表中插入指定位置的元素 9.向链表中删除指定位置的元素 10.遍历链表中的元素 …

告别手动操作!KeyMouseGo实现自动化工作流

前言 在这个快节奏的时代,我们每天都在与电脑打交道,重复着那些繁琐而单调的操作;你是否曾想过,能让电脑自己完成这些任务,而你则悠闲地喝着咖啡,享受着生活?今天,就让我们一起揭开一…

【sdk】- 对接阿里云抠图

文档地址:https://help.aliyun.com/zh/viapi/use-cases/general-image-segmentation?spma2c4g.11186623.0.0.3814173cenldIs java对接阿里云的通用分割,将代码原封不动复制进来,执行结果失败,咨询阿里云的人员之后,由…