GStreamer插件开发指南

合集下载

PythonGstreamer入门

PythonGstreamer入门

PythonGstreamer入门历时一个月的Python Gstreamer入门阶段接近尾声,在这里总结一下自己的学习历程。

首先感谢一下Andy同学和Stephen老师的帮助和指导。

(根据后续学习持续更新)1.基础知识学习阶段首先需要了解Gstreamer是什么,有哪些基本的内容,element、pad、bin、pipeline各是什么,其中又有哪些分类。

这里推荐Gsteamer的官方文档进行学习,可以去Gstreamer官网寻找英文文档,也可以直接搜索Gstreamer应用开发手册寻找中文版。

Gstreamer是使用C语言编写的框架,网络上关于Gstreamer的资料也是C语言编写居多(这也是我想写一篇自己的Python Gstreamer 学习历程的原因之一),不过不管是什么语言编写Gstreamer程序,基本的思路都是一样的,只是语句的表达方式不同而已,关于C语言和Python语言的函数对照表我后面也有提供。

这里推荐一个翻译的Gstreamer基础教程、播放教程博客:Gstreamer基础教程常用知识总结:gstreamer知识总结2.播放功能实现思路想要播放视频首先需要理解视频音频的编码与封装相关知识,这里推荐一个视音频编解码相关博客:视音频编解码技术零基础学习方法一个mkv视频的形成过程为:视音频原始数据——>音视频编码形成压缩数据——>音视频封装为MKV等格式视频。

相对应的我们播放一个视频就需要对这个过程翻转:MKV视频——>解封装——>解码——>播放。

图解:3.播放功能代码实现与资料对于Gstreamer的安装,Ubuntu可能会自带1.0版本,如果查找不到部分元件,可以搜索这些元件所属的插件包,这里提供一个元件和Gstreamer插件包对应的文档:gstreamer插件下面根据顺序介绍一下我编写代码的过程以及部分代码:(1)使用playbin实现对音视频的播放playbin是一个集成的箱柜可以直接用来播放多种音视频。

GStreamer插件开发指南

GStreamer插件开发指南

GStreamer插件开发指南GStreamer是一个功能强大的开放源代码多媒体框架,用于处理和播放各种类型的媒体数据。

GStreamer插件是用于扩展GStreamer功能的模块,可以添加新的元件、过滤器和其他处理模块,以满足特定的需求。

1. 了解GStreamer框架:熟悉GStreamer的核心概念、基本组件和数据流模型是开发插件的基础。

阅读GStreamer的文档和教程,获取关于GStreamer的基本知识。

2.确定插件的功能:确定你希望新插件实现的功能和目标。

这可以是一个新的音频或视频处理算法,或者一个特定格式的文件解码器。

确保你的目标明确和可行。

3. 构建插件的框架:在开始实现具体功能之前,需要创建插件的框架。

这包括定义插件的接口、实例化对象和设置参数。

使用GStreamer提供的插件模板,使插件具备GObject的特性。

4. 实现插件的功能:根据插件的目标,实现相应的功能。

这可以是一个音频或视频处理算法、一个文件解码器或一个特定格式的编码器。

根据GStreamer的架构,将功能以数据流的形式连接到其他元件。

5. 调试和测试插件:在完成插件功能的实现后,进行调试和测试工作。

使用GStreamer提供的调试工具和技术,验证插件的正确性和稳定性。

这可能涉及创建测试文件、分析数据流、查找性能问题等。

6. 文档和发布插件:为你的插件创建文档,包括插件的功能、接口和使用方法。

将插件发布到GStreamer的插件仓库或其他适当的发布平台,以供其他开发者和用户使用。

7.迭代和改进插件:随着时间的推移和用户的反馈,可能需要对插件进行迭代和改进。

收集用户反馈,修复问题和改进插件的性能和功能。

GStreamer插件的开发是一个复杂的过程,需要有一定的编程和多媒体处理经验。

通过学习和研究现有的GStreamer插件,你可以更好地理解和掌握插件开发的技巧和方法。

通过不断实践和改进,你可以开发出高质量和有用的GStreamer插件。

gstreamer plugin process

gstreamer plugin process

Gstreamer Plugin创建全过程(以filesink插件为例)Gstreamer中pad支持两种schedule方式:docs/design/part-activation.txtpush-based scheduling: 这种scheduling方法中,downstream elements的sink pad上需要定义chain函数(gst_pad_set_chain_function ),upstream elements调用这个chain函数来完成将buffer从upstream(source pad)到downstream elements(sink pad)的传递。

这种scheduling方式中source elements递归调用downstream elements的chain函数,最后一直调用到目的elements的才能函数。

(由于chain函数是定义在sink pad上,而source element是没有sink pad的,因此source element是不提供chain函数的).调用的顺序是从sink element到source element。

(递归调用).在这种模式下,upstream elements通过调用downstream elements sink pad上定义的chain函数主动的将数据传输给downstream elements,因此数据驱动是由upstream element发起的。

一. 创建插件模板gst-launch和gst-inspect是开发插件中比较重要的两个工具。

其中,gst-inspcet用来查看插件信息以及检测插件是否创建成功。

gst-launch用来播放插件命令。

如:gst-launch-1.0 filesrclocation=/home/ssl/music.mp3 ! mad ! filesink ! autoaudiosink (其中filesink是我们自己创建的插件模板或者插件)(一般情况下,初步安装成功的ubuntu系统都会自带gstreamer-0.10版本,但是有写基础的插件等都需要安装。

GStreamer基础教程10

GStreamer基础教程10

vorbisparse element
Pad Caps element matroskamux
matroskademux
Caps
element pad element
element
pad pad pad
GStreamer
Pad GStreamer pad
pipeline
[objc] view plaincopy
playbin2
GStreamer 01——Hello World
[objc] view plaincopy
1. gst-launch-0.10 playbin2 uri=/media/sintel_trailer-480p.webm
pipeline
gst-launch
elements
PIPELINE-DESCRPTION
[objc] view plaincopy
1. gst-launch-0.10 videotestsrc ! ffmpegcolorspace ! autovideosink
CTRL+C
videotestsrc ffmpegcolorspace autovideosink element GStreamer pad pad
43. Has custom save_thyself() function: gst_element_save_thyself 44. Has custom restore_thyself() function: gst_element_restore_thyself
45. Element has no clocking capabilities.
element
gst-inspect element pad

一步一步创建GStreamer插件(ZZ)

一步一步创建GStreamer插件(ZZ)

一步一步创建GStreamer插件(ZZ)$git clonegit:///gstreamer/gst-template.git2、进入目录gst-template/gst-plugin/src$cdgst-template/gst-plugin/src$../tools/make_elementExampleFilter产生文件gstexamplefilter.c gstexamplefilter.h3、修改Makefile.am文件(注意:是src目录下的Makefile.am)$sudo geditMakefile.amplugin_LTLIBRARIES = libgstexamplefilter_la_SOURCES = gstexamplefilter.clibgstexamplefilter_la_CFLAGS = $(GST_CFLAGS)libgstexamplefilter_la_LIBADD = $(GST_LIBS)libgstexamplefilter_la_LDFLAGS =$(GST_PLUGIN_LDFLAGS)libgstexamplefilter_la_LIBTOOLFLAGS =--tag=disable-staticnoinst_HEADERS = gstexamplefilter.h总共有七行4、导入PKG_CONFIG_PATH环境变量,在命令行输入:$exportPKG_CONFIG_PATH=/usr/lib/pkgconfig5、进入目录gst-template/gst-plugin,修改文件autogen.sh进入上一层目录$cd..编辑autogen.sh文件:$sudo geditautogen.sh如果是通过CVS获取的模板,则修改原来的srcfile=src/main.c为新的:srcfile=src/gstexamplefilter.c如果是通过GIT获取的模板,则在autogen.sh的开始添加:srcfile=src/gstexamplefilter.c6、运行autogen.sh,产生Makefile 文件$./autogen.sh7、开始安装:$./configure$make$sudo makeinstall再进入src子目录中$cd src用ls -a查询会有.libs目录产生(注意:.libs 为隐藏目录)进入.libs$cd .libs$ls -a会发现里面产生了libgstexamplefilter.so8、将插件加入到gstreamer库中把libgstexamplefilter.so这两个文件拷贝到系统目录中:/usr/lib/gstreamer-0.10$sudo cp /usr/lib/gstreamer-0.10/$sudo cp libgstexamplefilter.so/usr/lib/gstreamer-0.10/libgstexamplefilter.so如果gstreamer无法扫描到新加入的plugin,可能是因为路径设置不正确(GST_PLUGIN_PATH环境变量)用gst-inspect命令来查看plugin时,会建立一个cache文件:如在X86上是$HOME/.gstreamer-0.10/registry.x86_64.bin如果有新的plugin加入,可能需要先删除这个cache文件,再重新运行gst-inspect,否则不会把新的plugin扫描到cache中。

gstreamer手册(简体中文版)

gstreamer手册(简体中文版)

第1章. 序言本章将从技术的角度来描述本手册的总体结构。

1.1. GStreamer是什么?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是开放给程序员使用的---当程序员需要使用其它的插件来编写他所需要的应用程序的时候可以使用它。

1.2. 谁需要读这个手册?本手册是从一个程序开发人员的角度来描述GStreamer的: 它叙述了如何利用GStreamer的开发库以及工具来编写一个基于GStreamer的应用程序。

使用Gstreamer作为数据源输出视频数据III填充数据

使用Gstreamer作为数据源输出视频数据III填充数据

使用Gstreamer作为数据源输出视频数据III填充数据GStreamer是一个功能强大的开源框架,用于构建流媒体应用程序。

它提供了一种简单灵活的方式来处理音频和视频数据流。

使用GStreamer 作为数据源输出视频数据可以帮助我们更好地理解如何使用这个框架来构建流媒体应用程序。

在下面的内容中,我将详细介绍如何使用GStreamer 来填充视频数据。

首先,我们需要安装GStreamer框架和相关的插件。

可以通过以下命令在Linux系统上安装GStreamer:```sudo apt-get install gstreamer1.0-tools gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly```安装完成后,可以通过运行以下命令检查是否成功安装:```gst-inspect-1.0```现在,我们可以开始使用GStreamer来填充视频数据了。

下面是一个示例代码:```pythonimport gigi.require_version('Gst', '1.0')from gi.repository import GObject, GstGObject.threads_initGst.init(None)pipeline = Gst.parse_launch"videotestsrc pattern=ball ! videoconvert ! autovideosink"pipeline.set_state(Gst.State.PLAYING)while True:#在此处填充视频数据pass```在上面的示例中,我们创建了一个视频测试源(videotestsrc),以球形图案填充视频数据。

gstreamer使用进阶

gstreamer使用进阶

gstreamer使用进阶gstreamer很牛逼,让多媒体应用程序的开发变的更加简单,但是,也正是由于gstreamer对很多细节的隐藏,使得我们很容易把多媒体编程想得过于简单。

关于gst-launch的使用,这里不做教学,初次接触者可以自行google。

然后,请准备一个摄像头,下面我举的例子,都会用到。

先罗列出一堆例子--gst-launch-0.10 v4l2src ! ximagesinkgst-launch-0.10 v4l2src ! xvimagesinkgst-launch-0.10 v4l2src ! ffmpegcolorspace ! ximagesinkgst-launch-0.10 v4l2src ! ffmpegcolorspace ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-rgb' ! ximagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv' ! ximagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-rgb' ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv' ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv' ! ffmpegcolorspace ! ximagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv' ! ffmpegcolorspace ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv,format=(fourcc)YV12' ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv,format=(fourcc)YUY2' ! xvimagesinkgst-launch-0.10 v4l2src ! 'video/x-raw-yuv,format=(fourcc)YV12' ! ffmpegcolorspace ! xvimagesink gst-launch-0.10 v4l2src ! 'video/x-raw-yuv,format=(fourcc)YUY2' ! ffmpegcolorspace ! xvimagesink然后我提出一个问题---上面这些例子,哪些可以正确执行,哪些不可以?不可以的原因是什么?如果你能够回答我提出的问题,那说明你对视频这一部分已经很清楚了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GStreamer 框架是基于插件的, 有些插件中提供了各种各样的多媒体数字信号编解码器,也有些提供了 其他的功能。所有的插件都能够被链接到任意的已经定义了的数据流管道中。GStreamer 的管道能够被 GUI 编辑器编辑, 能够以 XML 文件来保存。这样的设计使得管道程序库的消耗变得非常少。
GStreamer 核心库函数是一个处理插件、数据流和媒体操作的框架。GStreamer 核心库还提供了一个 API, 这个 API 是开放给程序员使用的---当程序员需要使用其他的插件来编写他所需要的应用程序的时候可 以使用它。
• 附录 ── 关于插件开发的进一步信息
附录中包含一些不适合在手册的其它章节讲述的信息,这些大部分还没有完成。
手册的剩余部分总揽了 GStreamer 插件开发中的基本概念,涵盖的内容包括元件(Elements)和插件 (Plugins), 衬垫, 数据(Data),缓冲区(Buffers)和事件(Events)和 类型和属性。如果你已 经熟悉了对这一部分,你可以将之当作一次回顾,或者直接跳到编写一个插件。
接着,在 Chapter 14,将解释 GStreamer 中的时钟概念。如果你的 element 中需要同步音视频, 你必须知道这些信息。
接下来的几章,我们将讨论应用程序和 element 进行交互的高级方法。之前,我们在添加参数 和 Chapter 8 中学会了如何通过 GObject 的方法来完成这一功能。我们将在 Chapter 15 中讨论动态 参数,这是一种预先定义 element 行为的方法。下一步,我们会在 Chapter 17 中学习到接口的 方方面面。接口是个非常特别的东西-应用级元件的特定方式,基于 GObject 的 GInterface 之上。 最后,你将在 Chapter 18 中学到 GStreamer 是怎样处理元数据的。
1.2. 谁应该读该指南?
该指南叙述了如何为 GStreamer 编写新的模块。本指南针对以下几种人:
• 那些想给 GStreamer 增数据类型转换器,或者新的编码器或者解码器。
• 那些想支持新的输入输出设备的人。例如:某人可能会想增加将数据输出到新的视频输出系统或 从一个数码相机或耳机中读取数据的功能。
本手册旨在帮助你了解 GStreamer 的框架 0.10.9.1 版)以便你能够开发新的插件来扩展当前的功能。 本手册通过用 C 语言开发一个示例插件──一个音频过滤器──来定位大多数问题。然而,接下来的部 分会通过编写其它类型的插件引入另一些问题,在本手册的结尾介绍了一些 GStreamer 的 Python 绑定。
GStreamer 插件开发指南 (0.10.9.1)
I. 介绍
GStreamer 是一个用来创建流媒体应用程序的非常强大和通用的框架。GStreamer 框架的许多优点来源 于它的模块性 :GStreamer 可以无缝地接纳新的插件模块。但是由于模块性和强大的功能通常以极高的 复杂性为代价(例如 CORBA),编写一个新的插件并不总是一件简单的事。
滤镜是一类处理流数据的重要插件。数据的生产者和消费者分别被称为 source 和 sink 元件。箱柜(Bin) 元件可以包含其它的元件。箱柜的主要职责是调度它包含的元件并使得数据流更平滑。热插拔 (autoplugger)元件是另一种箱柜,它可以动态的加载其它元件,并将它们连接起了形成一个可以处 理两个任意流的滤镜。
在该部分的第一章不同的调度模式 我们将解释一些 element 调度的基本知识。这部分不会很深 入,只是一种介绍性的阐述为什么那些东西会那样工作。如果你对 GStreamer 的内部感兴趣,请 阅读这一章。接下来,我们将这一知识运用于另一种类型的数据传输 Chapter 5:不同的调度模 式基于环路的(Loop-based)元件将让你能对其输入速率有更多的控制。这些在编写 muxers 或 demuxers 时是很有用的。
2.3.1. 缓冲区分配 2.4. MIME 类型(Mimetypes)和属性
2.4.1. 基本类型
Chapter 1. 前言
1.1. GStreamer 是什么?
GStreamer 是一个创建流媒体应用程序的框架。其基本设计思想来自于俄勒冈(Oregon)研究生学院有关 视频管道的创意, 同时也借鉴了 DirectShow 的设计思想。
在最后一章,Chapter 19 中,将讨论 GStreamer 的事件机制。一方面,事件也是应用程序和 element 间交互的方法,例如定位事件。另一方面,事件也是 element 间进行交互的一种方法,例如,element 可以通过事件传递媒体流断开的状况,在管道内转发标签等等。
• 创建特殊类型的元件 ── 编写其它类型的插件
正如你所见,我们有许多的东西需要学习,让我们就此开始吧!
• 通过扩展 GstBin 创建复杂的 element,这样可以创建包含其它插件的插件。 • 通过在类型侦测函数(typedetect functions)中加入新的 mime 类型,可以让你的插件处理全
新的媒体类型。
Chapter 2. 基础概念介绍
• 高阶滤镜概念 ── GStreamer 插件开发的高级特性信息。
通过对初步知识的学习,你应该能够创建一个有很好的特性的音频或视频过滤器插件了。然而, GStreamer 为插件编写者提供了更多的东西。这一部分的章节包含了一些更高级的主题。例如调 度,GStreamer 的类型定义,时钟,接口和标签。因为这些特性是针对特定应用的 (purpose-specific),你可以按任何顺序阅读它们,它们大多不依赖于其他章节的知识。
目录 1. 前言
1.1. GStreamer 是什么? 1.2. 谁应该读该指南? 1.3. 预备知识 1.4. 该指南的结构 2. 基本知识 2.1. 元件(Elements)和插件(Plugins) 2.2. 衬垫(Pads) 2.3. 数据(Data),缓冲区(Buffers)和事件(Events)
1.3. 预备知识
该指南假定你已经稍微了解了 GStreamer 的基本工作原理。你也许希望首先阅读《GStreamer 应用程序 开发手册》,以便获得对 GStreamer 编程概念的了解。另外,不要忘了查看 GStreamer 网站上的已有文 档。
为了理解这份手册,你必须对 C 语言有一个基本的了解。因为 GStreamer 是基于 GObject 编程模型,所 以本指南假定你也已经对 GObject 编程有了一个基本的了解。你或许也想看一下 Eric Harlow's 的 《Developing Linux Applications with GTK+ and GDK》一书。
随后,在增加参数和 Chapter 8 中,我们将演示如何使用 GObject 使 element 在程序中可配置, 以及怎样使你的程序和 element 交互。下一步,你将学习如何快速的创建一个测试程序来测试你 在 Chapter 9 所学的所有知识。这里只涉及一些应用程序开发的基本知识,要想对此有一个全面 的了解,请查看应用程序开发手册。
下一步,我们将在 Chapter 12 中讨论 GStreamer 媒体标识。你将学到怎样定义新的媒体类型及 得到 GStreamer 内部的标准媒体类型列表。
在下一章,你将学习 request-pads 和 sometimes-pads 的概念,这些 pad 都是动态创建的, 或 者是因为应用程序的需要(request),或者是因为媒体类型的要求(sometimes),这些都将在 Chapter 13 中叙述。
• 那些想通过任何方法扩展 GStreamer 的人。你必须事先了解插件系统是如何工作的,这样你才能 知道插件系统对其它代码有什么限制。读完了该手册,你也许会因为插件可以做如此多的事而感 到惊讶。
如果你只是想使用 GStreamer 的已有功能,或者只想使用那些基于 GStreamer 程序,那么你可以不用再 看下去了。如果你只关注与使用现有的插件去便写新的程序──现在有许多这样的插件──你也许想看 的是《GStreamer 应用程序开发手册》如果你只是想获得那些基于 GStreamer 的程序的帮助,那么你应 该查看那些程序的用户手册。
GStreamer 最显著的用途是在构建一个播放器上。GStreamer 已经支持很多格式的文件了, 包括:MP3, Ogg/Vorbis, MPEG-1/2, AVI, Quicktime, mod 等等。从这个角度看,GStreamer 更象是一个播放器。但 是它主要的优点确是在于: 它的可插入组件能够很方便的接入到任意的管道当中。这个优点使得利用 GStreamer 编写一个万能的可编辑音视频应用程序成为可能。
由于前两部分以一个音频过滤器为例,所介绍的概念可以运用到过滤器插件的开发中。同时许多 概念也可以运用到 sources,sinks 和 autopluggers 等其它类型的插件中。这一部分讨论编写其 他特定类型的插件会碰到的问题。本章开始将焦点集中在可以使用基类(Pre-made base classes) 编写的 element 上。接下来,在 写一个 Demuxer 或 Parser, 写一个 N-to-1 元件或 Muxer 和写 一个管理器中,讨论编写特殊的元件。
1.4. 该指南的结构
为了帮助你驾驭这份指南,我们将其分为几个大的部分。每一部分致力于一个特定的 GStreamer 插件开 发相关的广泛概念。该指南的所有部分按照以下顺序组织:
• 编写一个插件 ── 介绍插件的结构,并用一个音频滤镜作为演示。
这一部分涵盖了编写一个插件的所有基本步骤,例如将 element 注册到 GStreamer 并进行一些初 步设置以便能和相邻的 element 互传数据。讨论以一个示例程序开始,该程序创建一些基本的结 构并在构建样板一节中注册一个 element。接着,你将在 Chapter 4, Chapter 5 和 Chapter 6 中 学会怎样通过一段代码得到一个基本的滤镜插件。
相关文档
最新文档