【GStreamer 】1-扫盲介绍

article/2025/11/8 2:11:36

        

         从历史的角度来看,Linux 在多媒体方面已经远远落后于其它的操作系统。微软的Windows和苹果的MacOS它们对多媒体设备、多媒体创作、播放和实时处理等方面已经有了很好的支持。另一方面,Linux对多媒体应用的综合贡献比较少,这也使得Linux很难在专业级别的软件上与Windows和MacOS去竞争。GStreamer正是为解决Linux多媒体方面当前问题而设计的。

        GStreamer是一个非常强大和通用的用于开发流媒体应用程序的框架。GStreamer框架的许多优点都来自于它的模块化:GStreamer可以无缝地合并新的插件模块,但是由于模块化和强大的功能往往以更大的复杂度为代价,开发新的应用程序并不总是简单。

        我是因为想实现将USB相机,转换为RTSP流的网络相机,再这个过程中开始接触GStreamer,所以萌生了,记录这个学习过程中,分享我自己的一些实践经验的想法,部分内容也是从网上摘抄过来的,但是大部分我还是会自己仔细看一遍,思考一遍,无法逐一列举出处,请见谅。

1、介绍

        GStreamer 是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关视频管道的创意, 同时也借鉴了 DirectShow 的设计思想。

        GStreamer 的程序开发框架使得编写任意类型的流媒体应用程序成为了可能。在编写处理音频、视频或者两者皆有的应用程序时,GStreamer 可以让你的工作变得简单。GStreamer 并不受限于音频和视频处理, 它能够处理任意类型的数据流。管道设计的方法对于实际应用的滤波器几乎没有负荷, 它甚至可以用来设计出对延时有很高要求的高端音频应用程序。

        GStreamer 最显著的用途是在构建一个播放器上。GStreamer 已经支持很多格式的文件了, 包括:MP3、Ogg/Vorbis、MPEG-1/2、AVI、Quicktime、 mod 等等。从这个角度看,GStreamer 更象是一个播放器。但是它主要的优点却是在于: 它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用 GStreamer 编写一个万能的可编辑音视频应用程序成为可能。

        GStreamer 框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer 的管道能够被 GUI 编辑器编辑, 能够以 XML 文件来保存。这样的设计使得管道程序库的消耗变得非常少。

        GStreamer 核心库函数是一个处理插件、数据流和媒体操作的框架。 GStreamer 核心库还提供了一个API, 这个API是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可以使用它

下图是对基于Gstreamer框架的应用的简单分层:

 

Media Applications

        最上面一层为应用,比如gstreamer自带的一些工具(gst-launch,gst-inspect等),以及基于gstreamer封装的库(gst-player,gst-rtsp-server,gst-editing-services等)根据不同场景实现的应用。

Core Framework

中间一层为Core Framework,主要提供:

  • 上层应用所需接口

  • Plugin的框架

  • Pipline的框架

  • 数据在各个Element间的传输及处理机制

  • 多个媒体流(Streaming)间的同步(比如音视频同步)

  • 其他各种所需的工具库

Plugins

最下层为各种插件,实现具体的数据处理及音视频输出,应用不需要关注插件的细节,会由Core Framework层负责插件的加载及管理。主要分类为:

  • Protocols:负责各种协议的处理,file,http,rtsp等。

  • Sources:负责数据源的处理,alsa,v4l2,tcp/udp等。

  • Formats:负责媒体容器的处理,avi,mp4,ogg等。

  • Codecs:负责媒体的编解码,mp3,vorbis等。

  • Filters:负责媒体流的处理,converters,mixers,effects等。

  • Sinks:负责媒体流输出到指定设备或目的地,alsa,xvideo,tcp/udp等。

Gstreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:

  • gstreamer: 包含core framework及core elements。

  • gst-plugins-base: gstreamer应用所需的必要插件。

  • gst-plugins-good: 高质量的采用LGPL授权的插件。

  • gst-plugins-ugly: 高质量,但使用了GPL等其他授权方式的库的插件,比如使用GPL的x264,x265。

  • gst-plugins-bad: 质量有待提高的插件,成熟后可以移到good插件列表中。

  • gst-libav: 对libav封装,使其能在gstreamer框架中使用。

2、Gstreamer基础概念

         在进一步学习Gstreamer前,我们需要掌握一些gstreamer的基础概念。

Element

        Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来,构成一个完整的pipeline。

Pad

        Pad是一个element的输入/输出接口,分为src pad(生产数据)和sink pad(消费数据)两种。两个element必须通过pad才能连接起来,pad拥有当前element能处理数据类型的能力(capabilities),会在连接时通过比较src pad和sink pad中所支持的能力,来选择最恰当的数据类型用于传输,如果element不支持,程序会直接退出。在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。当element支持多种数据处理能力时,我们可以通过Cap来指定数据类型. 例如,下面的命令通过Cap指定了视频的宽高,videotestsrc会根据指定的宽高产生相应数据:

gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink

Bin和Pipeline

        Bin是一个容器,用于管理多个element,改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次操作我们所使用的element。通过bin降低了应用的复杂度。 Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。

例如:

gst-launch-1.0 filesrc location=sintel_trailer-480p.ogv \
! oggdemux name=demux \
! queue ! vorbisdec ! autoaudiosink demux. \
! queue ! theoradec ! videoconvert ! autovideosink

通过上面的命令播放文件时,会创建如下pipeline:

         可以看到这个pipeline由8个element构成,每个element都实现各自的功能: filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出,theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。

        不同的element拥有不同数量及类型的pad,只有src pad的element被称为source element,只有sink pad的被称为sink element。

        element可以同时拥有多个相同的pad,例如oggdemux在解析文件后,会将audio,video通过不同的pad输出。

3、Gstreamer数据消息交互

        在pipeline运行的过程中,各个element以及应用之间不可避免的需要进行数据消息的传输,gstreamer提供了bus系统以及多种数据类型(Buffers、Events、Messages,Queries)来达到此目的:

 

Bus

        Bus是gstreamer内部用于将消息从内部不同的streaming线程,传递到bus线程,再由bus所在线程将消息发送到应用程序。应用程序只需要向bus注册消息处理函数,即可接收到pipline中各element所发出的消息,使用bus后,应用程序就不用关心消息是从哪一个线程发出的,避免了处理多个线程同时发出消息的复杂性。

Buffers

        用于从sources到sinks的媒体数据传输。

Events

        用于element之间或者应用到element之间的信息传递,比如播放时的seek操作是通过event实现的。

Messages

        是由element发出的消息,通过bus,以异步的方式被应用程序处理。通常用于传递errors, tags, state changes, buffering state, redirects等消息。消息处理是线程安全的。由于大部分消息是通过异步方式处理,所以会在应用程序里存在一点延迟,如果要及时的相应消息,需要在streaming线程捕获处理。

Queries

        用于应用程序向gstreamer查询总时间,当前时间,文件大小等信息。

4、gstreamer tools

Gstreamer自带了gst-inspect-1.0和gst-launch-1.0等其他命令行工具,我们可以使用这些工具完成常见的处理任务。

gst-inspect-1.0

查看gstreamer的plugin、element的信息。直接将plugin/element的类型作为参数,会列出其详细信息。如果不跟任何参数,会列出当前系统gstreamer所能查找到的所有插件。

$ gst-inspect-1.0 playbin

 

gst-launch-1.0

用于创建及执行一个Pipline,因此通常使用gst-launch先验证相关功能,然后再编写相应应用。 通过上面视频播放的例子,我们已经看到,一个pipeline的多个element之间通过 “!" 分隔,同时可以设置element及Cap的属性。例如: 播放音视频

gst-launch-1.0 playbin file:///home/root/test.mp4

转码

gst-launch-1.0 filesrc location=/videos/sintel_trailer-480p.ogv ! decodebin name=decode ! \videoscale ! "video/x-raw,width=320,height=240" ! x264enc ! queue ! \mp4mux name=mux ! filesink location=320x240.mp4 decode. ! audioconvert ! \avenc_aac ! queue ! mux.

5、GStreamer的优点

  1. 结构清晰且威力强大:我们可以使用一系列强有利的工具来创建媒体管道,而不用去写一行代码,从而使得复杂的媒体控制变得非常简单。GStreamer 向插件提供了简洁而简单的API来创建self- plugin(自包含)插件,同时还集成了大量的调试和跟踪机制和工具。GStreamer也提供了一系列现实例子。

  2. 灵活的可扩展性能:所有的GStreamer对象都可以采用GObject继承的方法进行扩展。所有的插件都可以被动态装载。

  3. 高性能主要体现在:使用GLib的g_ mem_ chunk和非模块化分配算法使得内存分配尽可能最小。插件之间的连接非常轻型(light-weight).数据在管道中的传递使用最小的消耗,管道中插件之间的数据传递只会涉及指针废弃。提供了一套对目标内存直接进行操作的机制。例如,插件可以向X server共享的内存空间直接写数据,缓冲区也可以指向任意的内存,如声卡的内部硬件缓冲区。refcounting和写拷贝将memcpy减少到最低。子缓冲区有效地将缓冲区分离为易于管理的块。使用线程联合(cothreads)减少线程消耗。线程联合(cothreads)是简单又高速的方法来切换子程序,作为衡量最低消耗600个cpu周期的标准。使用特殊的插件从而支持硬件加速。采用带有说明的插件注册,这样的话只在实际需要使用该插件才会去装载。所有的判断数据都不用互斥锁。

6、引用

What is GStreamer? Foundations gst-launch-1.0


http://chatgpt.dhexx.cn/article/00FhBlQ7.shtml

相关文章

详细的GStreamer开发教程

详细的GStreamer开发教程 文章目录 详细的GStreamer开发教程1. 什么是GStreamer?2. GStreamer架构2.1 Media Applications2.2 Core Framework2.3 Plugins 3. GStreamer组件3.1 Element创建一个 GstElement 3.2 箱柜(bin)元件的状态 3.3 衬垫&…

gstreamer(一)入门和概述

一.概述 在音视频领域接触最多实现的方案通常是通过ffmpeg(PC和sever端居多)或者硬件厂家的的SDK实现特定硬件的编解码功能(机顶盒,电视等嵌入式设备)。这里我们介绍一个在国内不太常用的解决方案----gstr…

二、什么是GStreamer

GStreamer是一个用于创建流媒体应用程序的框架。基本的设计来自俄勒冈研究生院的视频管道,还有一些来自DirectShow的想法。 GStreamer的开发框架使编写任何类型的流媒体应用程序成为可能。GStreamer框架旨在使编写处理音频或视频或两者同时处理的应用程序变得容易。…

Gstreamer 应用开发:1-基础介绍

我们之前的系列,正式的介绍了Gstreamer,并且围绕如何使用USB相机推流实现RTSP服务器来做了介绍,并在Jeston TX1 平台上做了优化急速的一些探索。 今天我们开始围绕如何用命令实现一个音视频混合,或者单独的音频,和单独…

【gstreamer】入门介绍

概述 GStreamer是一个基于流媒体的框架,是一个开放源代码的多媒体框架,用于创建音频和视频处理应用程序。它是一个运行在多个操作系统上的跨平台框架,支持多种不同的多媒体格式。 GStreamer框架的核心是基于插件的体系结构,插件…

Gstreamer基础讲解

Gstreamer讲解 文章目录 Gstreamer讲解基础背景小结 元件(Element)衬垫(Pads)Gstreamer的面向对象Gstreamer的多线程 实用工具Gstreamer常用插件介绍gstreamer工程记录关于YUV的补充知识 基础 背景 ​ 从历史的角度来看,Linux在多媒体方面已…

Gstreamer 简介

转载自:John.Leng - 博客园http://www.cnblogs.com/xleng/ 什么是Gstreamer? Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline&#xff0…

微博视频怎么下载?微博视频下载和保存工具

本文转载自:怎么下载微博视频 ​​​微博视频怎么下载?当你刷微博看到自己特别喜欢的视频时,除了转发该视频到自己的微博外,你可能还想把这个微博视频保存到自己电脑或者手机中,那应该怎么实现weibo视频的下载呢&#…

GitHub 标星 120K+!这些神器仅需一行代码即可下载全网视频!

大家好,我是 JackTian。 今天这篇文章的内容对于经常浏览各大视频网站的同学来说,是一大神器工具。当你看到自己目前所需的视频时想尽各种办法保存至本地,方便后期再次回看。恰巧有些视频可能需要会员才能够下载,有些第三方的视频…

那些你可能不知道的视频下载奇技淫巧

之前已经写过好几篇的奇技淫巧系列了,今天说说怎么快速下载视频。 我平常经常看视频的网站就是爱奇艺,b站,微博,知乎,网易这些。 这里以微博为例,下载周杰伦的《晴天》,微博地址是 https://w…

部分主流视频网站下载方法

如果在微博或其他视频网站上看到非常喜欢的视频,想下载下来,但是又苦于不知如何下载。 这里我推荐一个网站,支持主流的86视频网站(发表博客时)的视频下载。 主流视频网站(16): 搜狐视频 乐视网 酷6网 56…

快手火山抖音视频怎么快速去重消重和去水印秒拍视频批量采集下载怎么快速去重消重去水印视频批量采...

快手火山抖音视频怎么快速去重消重和去水印 秒拍视频批量采集下载 怎么快速去重消重去水印 视频批量采集下载软件,怎么找到视频批量采集下载软件 趣头条今日头条等自媒体视频批量采集下载软件有哪些? 大鱼号视频批量采集下载去重消重去水印软件 视频怎么…

硕鼠——前些年很好用的视频下载神器

前言 首先解释一下为什么要说是前几年。因为它太好用,知道的人越来越多,导致引起了视频平台的注意,以版权为由禁止自己的视频从硕鼠下载。这里推荐小众软件Annie,在我的另一篇中有介绍,传送门。 官方网站 http://w…

网页保存视频最有效的几种方法

最近朋友问我了这样的问题: 如何才能把网络上的视频下载下来当做课堂资料播放呢? 的确,这个问题也困过我: 想要下载视频作为课件素材播放: 在微博收藏了许多有关「技能学习」的视频,但等到想看的时候发…

性能比肩美拍秒拍的Android视频录制编辑特效解决方案

前言 众所周知,Android平台开发分为Java层和C层,即Android SDK和Android NDK。常规产品功能只需要涉及到Java层即可,除非特殊需要是不需要引入NDK的。但如果是进行音视频开发呢? Android系统Java层API对音视频的支持在MediaCode…

仿秒拍视频网UI主题模板+Emlog内核开发

介绍: 高仿秒拍视频网emlog主题模板,相似度非常高,EMLOG加上这款模板完全可以用来当做视频网站使用,这款模板可以插入秒拍网的视频,只需要输入秒拍网的视频ID就可以直接调用播放,并且支持直接调用MP4视频链接播放&…

android 上传图片视频教程,秒拍怎么上传长视频 秒拍APP拍长视频并上传图文教程...

大家都知道秒拍是十秒拍大片,但是如果要拍长视频怎么办呢?拍了长视频又怎么上传呢?下面针对这些问题,小编就为大家带来秒拍拍长视频和上传的方法教程,希望可以帮到大家。 软件名称:秒拍 一下视频 for andro…

微博视频下载教程

文章目录 一、电脑端二、手机端三、其它写在最后 一、电脑端 1.网页搜索,点击官网。 2.在输入框搜索ID,以下图为例,点击相关用户。 3.点击【微博】,才可以看到全部内容。刚进来默认是【精选】,只有部分内容。 4.找到一…

用python下载视频代码_python实现视频下载

最近一两年短视频业务风生水起,各个视频网站都有各自特色的短视频内容。如果有这样一个程序,可以把各大视频网站的热门用户最新发布的视频都下载下来,不仅方便自己观看,还可以将没有版权的视频发布在个人社交网站上,增…

在电脑上如何直接下载秒拍的视频?

在生活中,我们想下载秒拍的视频,但是却找不到下载的标志?这该怎么办呢? 没有关系,不要着急,今天我就一步一步地教你下载 1.首先我们打开你想要下载的秒拍的视频的网页: 2.然后对于Chrome浏览器的…