Gstreamer 简介
转载自:John.Leng - 博客园http://www.cnblogs.com/xleng/
什么是Gstreamer?
Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
下图是对基于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框架中使用。
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处理数据。
下面我们通过一个文件播放的例子来熟悉上述提及的概念:测试文件 sintel_trailer-480p.ogv
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输出。
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查询总时间,当前时间,文件大小等信息。
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先验证相关功能,然后再编写相应应用。
通过上面ogg视频播放的例子,我们已经看到,一个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.
Streaming
#Server
gst-launch-1.0 -v videotestsrc ! "video/x-raw,framerate=30/1" ! x264enc key-int-max=30 ! rtph264pay ! udpsink host=127.0.0.1 port=1234#Client
gst-launch-1.0 udpsrc port=1234 ! "application/x-rtp, payload=96" ! rtph264depay ! decodebin ! autovideosink sync=false
引用
What is GStreamer?
Foundations
gst-launch-1.0
Gstreamer 简介相关推荐
- gstreamer简介
常用 gchar * caps_string = gst_caps_to_string (new_selected_caps); g_free (caps_string); 需要弄懂的问题 tunne ...
- Gstreamer说明
http://general.blog.51cto.com/927298/294928 http://general.blog.51cto.com/927298/294931 ============ ...
- GStreamer使用详解
1.Gstreamer简介 Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤 ...
- c语言项目开发全程实录视频,C语言项目开发全程实录(第2版)(软件项目开发全程实录)简介,目录书摘...
目录: 第1章 火车订票系统(DEV C 实现) 视频讲解:36分钟 1.1 开发背景 1.2 需求分析 1.3 系统设计 1.3.1 系统目标 1.3.2 系统功能结构 1.3.3 系 ...
- 全面解析C语言多媒体开源框架GStreamer
目录 1.GStreamer简介 2.GStreamer基本概念 2.1.元件(Element) 2.2.箱柜(Bin) 2.3.管道(Pipeline) 2.4.衬垫(Pad) 2.5.能力集(Ca ...
- deepstream学习笔记(二):gstreamer与deepstream-test1说明
Gstreamer介绍 gstreamer简介 gstreamer tools 相关工具介绍 gstreamer 组成说明 Element pad bin 与 pipeline Communicati ...
- Xavier NX载板RTSO-6002/E 系列烧录及环境搭建
http://www.realtimes.cn/cn/product/product-21-889.html realtimes2022 官方资料 使用版本:R32.5.1_for TX2_Xavie ...
- 【GStreamer】gstreamer工具详解之:gst-discoverer-1.0
四.gst-discoverer-1.0 1.简介 gst-discoverer-1.0用于显示文件元数据和流信息,它可以运行在单独的文件或整个目录(递归到子目录中). 2.命令格式: gst-dis ...
- 【GStreamer】gstreamer工具详解之:ges-launch-1.0
三.ges-launch-1.0 1.简介 ges-launch-1.0:视频裁剪编辑,GStreamer编辑服务原型工具 详见官网:https://gstreamer.freedesktop.org ...
最新文章
- 反向代理服务器(Reverse Proxy)
- YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. /HTML/ 标签: yum 2014-05-26
- DNS 服务器地址大全
- 内核同步 (来自chinaunix总结)
- Selenium UI自动化测试(四)Python+Unittest+HTMLTestRunner测试报告—百度hao123实例
- SQL Server实例的十大安全注意事项
- [转载] 晓说——第23期:大师照亮八十年代
- 克隆网站工具_4 种开源云安全工具
- 堆排序HeapSort
- wordpress音乐播放器插件–PoiPlayer
- 《批创思维导论》网课章节测验及答案
- Hybird App开发,懂得小程序+kbone+finclip就够了!
- 什么是软件设计模式?
- 免费的思维导图软件都有哪些?
- windows10双系统删除linux,双系统删除教程详解:Windows(linux)双系统,教你如何删除其中一个!...
- win10下office2013命令激活参考
- 贴吧云签到php源码,Tieba-Cloud-Sign: 百度贴吧云签到,在服务器上配置好就无需进行任何操作便可以实现贴吧的全自动签到。配合插件使用还可实现云灌水、点赞、封禁、删帖、审查等功能...
- C语言刷题6:给定b的值,输入a和m,求a*b和a^m的值
- rocketmq 消息删除_RocketMq Topic创建和删除
- EasyDarwin开源流媒体服务器Golang版本:拉转推功能之拉流实现方法