博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【GStreamer】基本概念及安装
阅读量:4262 次
发布时间:2019-05-26

本文共 5705 字,大约阅读时间需要 19 分钟。

一、参考网站

官方主页

https://gstreamer.freedesktop.org/

官方手册

https://gstreamer.freedesktop.org/data/doc/gstreamer/

官方教程:

https://gstreamer.freedesktop.org/documentation/tutorials/index.html

官方基础教程

https://gstreamer.freedesktop.org/documentation/tutorials/basic/index.html

插件列表

https://gstreamer.freedesktop.org/documentation/plugins_doc.html?gi-language=c

博客:

二、基础概念

1、element

element:元件,每个元件包含有多个gstPad(衬垫)

2、pad

pad:Element的input和output称为Pads(衬垫),这些gstpad随后用于元件(element)之间的连接和通信,并最终构成一个可以传递和处理数据的管道pipeline;

衬垫(Pad)相当于一个元件的插口,各个元件通过这个插口进行连接,这样数据流就可以在这些元件中进行传输。
衬垫会限制特定的数据流类型通过,所以只有当两个衬垫的数据类型一致时,才能建立连接。
数据流的流向都是从一个元件的源衬垫(src)到另一个元件的接收衬垫(sink)。

3、cap

cap:功能(Cap),衬垫有限制特定的数据流流过的功能,那这个功能就是通过功能(Cap)来描述的。功能(Cap)描述了能够通过衬垫或当前通过衬垫的数据流。

4、bin

bin:用以将一组Element以链接组成一个逻辑单元,Element的容器,同时也是 Element的子类。

箱柜(Bins)是一个可装载一系列元件(element)的容器;因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins)
你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态;
箱柜(Bins)可以发送总线消息(bus messages)给它的子集元件(element)(这些消息包括:错误消息(error messages),标签消息(tag messages),EOS消息(EOS messages))

5、pipeline

pipeline:管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element);

管道(pipeline)是高级的箱柜(Bins);
PipeLine是一种特定的Top-Level的BIN,PipeLine启动后,在单独的线程中运行,传递和处理数据。

6、bus

bus:Bus负责PipeLine线程和宿主的程序之间的通信,每个PipeLine缺省创建一个Bus。

宿主程序有两种方法使用Bus:
第一种是使用 GLib/Gtk+ main loop及gst_bus_add_watch () or gst_bus_add_signal_watch ()事件回调函数机制。
第二种是程序通过gst_bus_peek () /gst_bus_poll ()主动检查Bus中的消息;
应用程序在总线上设置一个消息处理器。当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。

7、source

source:Source Element 数据源元件,只有输出端,它仅能用来产生供管道消费的数据,而不能对数据做任何处理。

一个典型的数据源元件的例子是音频捕获单元,它负责从声卡读取原始的音频数据,然后作为数据源提供给其它模块使用。

8、filter

filter:Filter Element 过滤器元件,既有输入端又有输出端,它从输入端获得相应的数据,并在经过特殊处理之后传递给输出端。

一个典型的过滤器元件的例子是音频编码单元,它首先从外界获得音频数据,然后根据特定的压缩算法对其进行编码,最后再将编码后的结果提供给其它模块使用

9、sink

sink:Sink Element 接收器元件,只有输入端,它仅具有消费数据的能力,是整条媒体管道的终端。

一个典型的接收器元件的例子是音频回放单元,它负责将接收到的数据写到声卡上,通常这也是音频处理过程中的最后一个环节

10、demuxer

demuxer:

11、sink pad

sink pad:sink pads指Element的输入(input)。用于元件(element)之间的连接和通信,也叫元件(element)的插座。

12、source pad

source pad:source pads是指Element的输出(output)

13、buffer

Buffer:缓冲区(Buffer),缓冲区包含了你创建的管道里的数据流。

通常一个源元件会创建一个新的缓冲区,同时元件还将会把缓冲区的数据传递给下一个元件。元件会自动处理缓冲区,不需要自己来处理。

14、events

Events:事件(Events),事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的元件,可能的事件包括中断,flush,流的终止信号等等

15、Bus Message、Event、Signal:

Q: Bus message和Event有什么不同?和signal又有什么不同?

A: bus message是用于gstreamer和application之间交互用的,比如EOS,如果是bus message则是gstreamer告诉app – End of Stream。
而Event是用于gstreamer内部的,比如src element发出EOS Event,然后该event顺着pipeline一路传递到downstream elements,这些elements可以得到通知,从而做一些cleanup的工作,然后继续将event传递下去。
这应该就是bus message和event不同的地方。
对于EOS,可以参考gst_event_new_eos函数的说明,说的很清楚,element产生EOS,然后顺着一路下去,一直到最后的sink element,如果pipeline中所有的sink element都发出了EOS,那么,gstreamer自动产生一个EOS的GstMessage,这就能被app程序捕捉到了。
所以,GstMessage是用于app和gstreamer沟通的,内部则是event。
signal和message/event都不一样,signal其实来自于GObject体系,是application和gobject交互用的。
在gstreamer中,element本身也是gobject,所以,通过signal,就可以将app和element联系起来,当element发生了一些事情相让app知道时,就可以用signal的方式来通知app – 比如动态创建了一个Pad。
和Bus message不同,bus message是pipeline上的,一般是app和pipeline交互的一种方法。signal则具体到了每个element。

16、Property, Dynamic Controllable Property, Interface:

Q: Property, Dynamic Controllable Property, Interface有什么不同?

A: Property来自GObject,就是对象的属性,使用_install_property函数定义。每个property可以对应的定义get/set方法;
Dynamic Controllable Property是一种可以在stream-time,其实就是runtime动态修改Property value的东西,是gstreamer引入的,对于一些和GUI交互的时候,这种东西有点用处。
我们可以定义多长时间就自动给某个Property赋成什么样的值,所以叫Dynamic Controllable Property,可以参考AppDev Manual Chapater 15的内容;
Interface也是来自GObject,和Java的Interface非常类似,GObject不支持多重继承,所以和Java一样,整出一个Interface来间接实现多重继承。
Interface定义的时候和一个GObject类似,只不过只需要定义Class Structure而不需要定义Instance Structure(因为Interface无法实例化),
在Interface中定义好需要实现的函数(GLib 2.14之后Interface中可以定义Property了,当然也需要实现该Interface的gobject来实现该Property),
然后和平常一样生成一个gobject,如果该gobject需要implement某个interface的话,
在g_type_register_static注册完后,再调用g_type_add_interface_static就可以实现一个interface。
g_type_add_interface_static中要提供一个GInterfaceInfo的structure,其中要指定interface的init函数,
我们就可以在这个函数中,将Interface中定义好的函数指针换成我们gobject中函数的指针,这样就等于实现了这个interface中的方法。

三、安装和编译

1、参考官网:

https://gstreamer.freedesktop.org/documentation/installing/on-linux.html

2、安装:
sudo apt-get install libgstreamer1.0-0 gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-doc gstreamer1.0-tools
3、demo测试

hello.c

#include 
#include
int main(int argc, char *argv[]) {
GstElement *pipeline; GstBus *bus; GstMessage *msg; /* Initialize GStreamer */ gst_init (&argc, &argv); const gchar *nano_str; guint major, minor, micro, nano; gst_init (&argc, &argv); gst_version(&major, &minor,µ, &nano); if (nano == 1) nano_str = "(CVS)"; else if (nano == 2) nano_str = "(Prerelease)"; else nano_str = ""; printf ("This program is linked against GStreamer %d.%d.%d.%d %s\n", major, minor, micro, nano, nano_str); /* Build the pipeline */ pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/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); /* Free resources */ if (msg != NULL) gst_message_unref (msg); gst_object_unref (bus); gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0;}
4、编译:
gcc hello.c -o hello `pkg-config --cflags --libs gstreamer-1.0`

如果使用到其他的gstreamer插件,需要添加其他的插件名字

转载地址:http://pbmei.baihongyu.com/

你可能感兴趣的文章
Messenger和aidl的关系&aidl支持多线程吗,messenger呢
查看>>
AndroidManifest.xml文件何时被加载?如何查看apk的AndroidManifest
查看>>
如何判断一个对象是否可回收,GC回收对象的过程方式,finilized函数
查看>>
java普通for循环和增强for循环中做集合增删会不会出错?
查看>>
抽象类和接口区别
查看>>
JVM学习之对象内存布局,对象头
查看>>
Python urllib模块访问网络
查看>>
JVM学习之java线程安全&锁优化技术
查看>>
兼容ProgressBar圆形设置颜色
查看>>
git detached HEAD 修改后如何提交修改到其他分支
查看>>
Android获取系统中的其他应用信息
查看>>
Android视频编解码之MediaCodec简单入门
查看>>
Android原始视频格式YUV,NV12,NV21,YV12,YU12(I420)
查看>>
View绘制01-Android渲染系统中的View
查看>>
View绘制02-View生命周期
查看>>
View绘制系列(3)-自定义View简介
查看>>
View绘制系列(5)-Canvas基础图形绘制
查看>>
Android横竖屏切换
查看>>
判断SD是否存在及其容量查询
查看>>
linux查看文本的5+1种方式
查看>>