GStreamer 介绍

2024-06-12 12:20
文章标签 介绍 gstreamer

本文主要是介绍GStreamer 介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,什么是GStreamer?

GStreamer是一个用于创建流媒体应用程序的框架。基本设计来自俄勒冈研究生院的视频管道,以及DirectShow的一些想法。

GStreamer的开发框架使得编写任何类型的流媒体多媒体应用程序成为可能。GStreamer框架旨在使编写处理音频或视频或两者兼而有之的应用程序变得容易。它不仅限于音频和视频,并且可以处理任何类型的数据流。管道设计的开销几乎不超过所应用的过滤器引起的开销。这使得GStreamer成为设计对延迟提出高要求的高端音频应用程序的良好框架。

GStreamer最明显的用途之一是使用它来构建媒体播放器。GStreamer已经包含了用于构建媒体播放器的组件,该播放器可以支持多种格式,包括MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、mod等等。然而,GStreamer不仅仅是另一个媒体播放器。它的主要优点是可插拔组件可以混合和匹配到任意管道中,因此可以编写成熟的视频或音频编辑应用程序。

该框架基于插件,这些插件将提供各种编解码器和其他功能。插件可以链接并排列在管道中。该管道定义了数据流。管道也可以使用GUI编辑器进行编辑并保存为XML,以便以最少的工作量制作管道库。

GStreamer的核心功能是为插件、数据流和媒体类型处理/协商提供一个框架。它还提供了一个API来使用各种插件编写应用程序。

具体来说,GStreamer提供

  • 用于多媒体应用程序的API

  • 插件架构

  • 流水线架构

  • 媒体类型处理/协商机制

  • 同步机制

  • 超过250个插件提供超过1000个元素

  • 一套工具

GStreamer插件可分为

  • 协议处理

  • 来源:用于音频和视频(涉及协议插件)

  • 格式:解析器,格式化程序,复用器,解复用器,元数据,字幕

  • 编解码器:编码器和解码器

  • 过滤器:转换器、混音器、效果器、…

  • 接收器:用于音频和视频(涉及协议插件)

GStreamer 包:

  • gstreamer:核心包

  • gst-plugins-base:一组基本的示例性元素

  • gst-plugins-good:LGPL下的一组优质插件

  • gst-plugins-ugly:一组可能造成分发问题的高质量插件

  • gst-plugins-bad:一组需要更高质量的插件

  • gst-libav:一组包装libav进行解码和编码的插件

  • 其他几个包

2,设计原则

2.1,干净有力

GStreamer提供了一个干净的界面:

  • 想要构建媒体管道的应用程序程序员。程序员可以使用一组强大的工具来创建媒体管道,而无需编写任何代码。执行复杂的媒体操作变得非常容易。

  • 插件程序员,为插件程序员提供了一个干净简单的应用编程接口来创建独立的插件。集成了广泛的调试和跟踪机制。GStreamer还附带了一组广泛的现实生活中的插件,也可以作为示例。

2.2,面向对象

GStreamer 遵循GObject GLib 2.0对象模型 熟悉GLib 2.0GTK+将熟悉GStreamer。

GStreamer 使用信号和对象属性的机制。

可以在运行时查询所有对象的各种属性和功能。

GStreamer打算在编程方法论上类似于GTK+。这适用于对象模型、对象所有权、引用计数等。

2.3,可扩展

所有 GStreamer 对象都可以使用 GObject继承进行扩展方法。

所有插件都是动态加载的,可以独立扩展和升级。

2.4,允许仅二进制插件

插件是在运行时加载的共享库。由于所有的 插件的属性可以使用GObject属性进行设置不需要(实际上也不可能)安装任何头文件 插件。

特别注意使插件完全独立。插件的所有相关方面都可以在运行时查询。

2.5,高性能

高性能是通过以下方式获得的:

  • 使用GLib的GSlice分配器。

  • 插件之间极其轻量级的链接。数据可以以最小的开销在管道中传输。插件之间的数据传递只涉及典型管道中的指针取消引用。

  • 提供一种直接在目标内存上工作的机制。例如,插件可以直接写入X服务器的共享内存空间。缓冲区也可以指向任意内存,例如声卡的内部硬件缓冲区。

  • 写入时重新计数和复制最大限度地减少 memcpy 的使用。子缓冲区有效地将缓冲区拆分为可管理的部分。

  • 专用流线程,调度由内核处理。

  • 通过使用专门的插件允许硬件加速。

  • 使用带有插件规范的插件注册表,以便可以延迟插件加载,直到实际使用插件。

2.6,清理核心/插件分离

GStreamer的核心本质上与媒体无关。它只知道字节和块,只包含基本元素。GStreamer的核心甚至足以实现低级系统工具,如cp。

所有媒体处理功能都由核心外部的插件提供。这些告诉核心如何处理特定类型的媒体。

2.7,为编解码器实验提供框架

GStreamer还希望成为一个简单的框架,编解码器开发人员可以在其中 试验不同的算法,加快开发开放和免费的多媒体编解码器,如Xiph.Org基金会开发的编解码器(如Theora和Vorbis)。

3,基础概念

本章介绍了GStreamer的基本概念。理解这些概念对于阅读本指南的任何其余部分都很重要,所有这些概念都假设理解这些基本概念。

3.1,元素

元素是GStreamer中最重要的一类对象。您通常会创建一个链接在一起的元素链,并让数据流经这个元素链。一个元素有一个特定的功能,它可以是从文件中读取数据,解码这些数据或将这些数据输出到您的声卡(或其他任何东西)。通过将几个这样的元素链接在一起,您可以创建一个可以执行特定任务的管道,例如媒体播放或捕获。GStreamer默认附带大量元素集合,使得开发各种各样的媒体应用程序成为可能。如果需要,您还可以编写新元素。GStreamer插件作家指南中更详细地解释了这个主题。

3.2,Pads

Pads是元素的输入和输出,您可以在其中连接其他元素。它们用于协商之间的链接和数据流 GStreamer中的元素。Pad 可以看作是一个“插头”或“端口” 元素,其中可以与其他元素建立链接,并且通过它数据可以流入或流出这些元素。Pads 有特定的数据处理能力:pad可以限制流动的数据类型通过它。链接只允许在允许的情况下在两个pads之间两个数据类型(功能)是兼容的。数据类型是使用称为大写协商的过程在Pads之间协商。数据类型由 GstCaps 描述

这里打个比方可能会有所帮助。pad类似于物理设备上的插头或插孔。例如,考虑一个由音频放大器、DVD播放器和(无声)视频投影仪组成的家庭影院系统。允许将DVD播放器连接到放大器,因为两个设备都有音频插孔,允许将投影仪连接到DVD播放器,因为两个设备都有兼容的视频插孔。投影仪和放大器之间的链接可能不会建立,因为投影仪和放大器有不同类型的插孔。GStreamer中的pad与家庭影院系统中的插孔具有相同的用途。

在大多数情况下,GStreamer中的所有数据都通过一个链接单向流动元素之间。数据通过一个或多个从一个元素流出源Pads和元素通过一个或多个接收器pads。源和接收器元件只有源和接收器pad分别。数据通常意味着缓冲区(由 GstBuffer 对象)和事件(由 GstEvent 对象)。

3.3,Bin 和 管道

Bin是元素集合的容器,由于bin本身就是元素的子类,因此你可以像控制元素一样控制bin,从而为你的应用程序抽象出许多复杂性。例如,您可以更改bin中所有元素的状态 通过更改该bin本身的状态。Bins还转发总线消息来自它们包含的子级(例如错误消息、标签消息或 EOS消息)。

一个管道是一个顶级bin。它为应用程序提供一个总线 ,并管理其子元素的同步。当您将其设置为 PAUSEDPLAYING状态,数据流将启动,媒体处理将进行。一旦启动,管道将在单独的线程中运行,直到您停止它们或到达数据流的末尾。

3.4,通讯

GStreamer为应用程序和管道之间的通信和数据交换提供了多种机制。

  • Buffers 是用于在管道中的元素之间传递流数据的对象。缓冲区总是从源传输到接收器(下游)。

  • Events 是在元素之间或从应用程序发送到元素的对象。事件可以上游和下游传输。下游事件可以与数据流同步。

  • messages 是由管道消息总线上的元素发布的对象,它们将被保存在那里以供应用程序收集。消息可以从发布消息的元素的流线程上下文中同步拦截,但通常由应用程序从应用程序的主线程异步处理。消息用于以线程安全的方式将错误、标签、状态更改、缓冲状态、重定向等信息从元素传输到应用程序。

  • queries 查询允许应用程序从管道请求信息,如持续时间或当前播放位置。查询总是同步回答。元素也可以使用查询从其对等元素请求信息(如文件大小或持续时间)。它们可以在管道中两种方式使用,但上游查询更常见。

这篇关于GStreamer 介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054202

相关文章

Java中 instanceof 的用法详细介绍

《Java中instanceof的用法详细介绍》在Java中,instanceof是一个二元运算符(类型比较操作符),用于检查一个对象是否是某个特定类、接口的实例,或者是否是其子类的实例,这篇文章... 目录引言基本语法基本作用1. 检查对象是否是指定类的实例2. 检查对象是否是子类的实例3. 检查对象是否

什么是ReFS 文件系统? ntfs和refs的优缺点区别介绍

《什么是ReFS文件系统?ntfs和refs的优缺点区别介绍》最近有用户在Win11Insider的安装界面中发现,可以使用ReFS来格式化硬盘,这是不是意味着,ReFS有望在未来成为W... 数十年以来,Windows 系统一直将 NTFS 作为「内置硬盘」的默认文件系统。不过近些年来,微软还在研发一款名

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

MySQL中慢SQL优化的不同方式介绍

《MySQL中慢SQL优化的不同方式介绍》慢SQL的优化,主要从两个方面考虑,SQL语句本身的优化,以及数据库设计的优化,下面小编就来给大家介绍一下有哪些方式可以优化慢SQL吧... 目录避免不必要的列分页优化索引优化JOIN 的优化排序优化UNION 优化慢 SQL 的优化,主要从两个方面考虑,SQL 语

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

Python实现html转png的完美方案介绍

《Python实现html转png的完美方案介绍》这篇文章主要为大家详细介绍了如何使用Python实现html转png功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 1.增强稳定性与错误处理建议使用三层异常捕获结构:try: with sync_playwright(

Java使用多线程处理未知任务数的方案介绍

《Java使用多线程处理未知任务数的方案介绍》这篇文章主要为大家详细介绍了Java如何使用多线程实现处理未知任务数,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 知道任务个数,你可以定义好线程数规则,生成线程数去跑代码说明:1.虚拟线程池:使用 Executors.newVir

JAVA SE包装类和泛型详细介绍及说明方法

《JAVASE包装类和泛型详细介绍及说明方法》:本文主要介绍JAVASE包装类和泛型的相关资料,包括基本数据类型与包装类的对应关系,以及装箱和拆箱的概念,并重点讲解了自动装箱和自动拆箱的机制,文... 目录1. 包装类1.1 基本数据类型和对应的包装类1.2 装箱和拆箱1.3 自动装箱和自动拆箱2. 泛型2