本文共 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博客:
element:元件,每个元件包含有多个gstPad(衬垫)
pad:Element的input和output称为Pads(衬垫),这些gstpad随后用于元件(element)之间的连接和通信,并最终构成一个可以传递和处理数据的管道pipeline;
衬垫(Pad)相当于一个元件的插口,各个元件通过这个插口进行连接,这样数据流就可以在这些元件中进行传输。 衬垫会限制特定的数据流类型通过,所以只有当两个衬垫的数据类型一致时,才能建立连接。 数据流的流向都是从一个元件的源衬垫(src)到另一个元件的接收衬垫(sink)。cap:功能(Cap),衬垫有限制特定的数据流流过的功能,那这个功能就是通过功能(Cap)来描述的。功能(Cap)描述了能够通过衬垫或当前通过衬垫的数据流。
bin:用以将一组Element以链接组成一个逻辑单元,Element的容器,同时也是 Element的子类。
箱柜(Bins)是一个可装载一系列元件(element)的容器;因为箱柜(Bins)本身又是元件(element)的子集,所以你能够象操作普通元件(element)一样的操作一个箱柜(Bins) 你可以改变一个箱柜(Bins)的状态来改变箱柜(Bins)内部所有元件(element)的状态; 箱柜(Bins)可以发送总线消息(bus messages)给它的子集元件(element)(这些消息包括:错误消息(error messages),标签消息(tag messages),EOS消息(EOS messages))pipeline:管道(pipelines)是箱柜(Bins)的一个特殊的子类型,管道(pipelines)可以操作包含在它自身内部的所有元件(element);
管道(pipeline)是高级的箱柜(Bins); PipeLine是一种特定的Top-Level的BIN,PipeLine启动后,在单独的线程中运行,传递和处理数据。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中的消息; 应用程序在总线上设置一个消息处理器。当主循环运行的时候,总线将会轮询这个消息处理器是否有新的消息,当消息被采集到后,总线将呼叫相应的回调函数来完成任务。source:Source Element 数据源元件,只有输出端,它仅能用来产生供管道消费的数据,而不能对数据做任何处理。
一个典型的数据源元件的例子是音频捕获单元,它负责从声卡读取原始的音频数据,然后作为数据源提供给其它模块使用。filter:Filter Element 过滤器元件,既有输入端又有输出端,它从输入端获得相应的数据,并在经过特殊处理之后传递给输出端。
一个典型的过滤器元件的例子是音频编码单元,它首先从外界获得音频数据,然后根据特定的压缩算法对其进行编码,最后再将编码后的结果提供给其它模块使用sink:Sink Element 接收器元件,只有输入端,它仅具有消费数据的能力,是整条媒体管道的终端。
一个典型的接收器元件的例子是音频回放单元,它负责将接收到的数据写到声卡上,通常这也是音频处理过程中的最后一个环节demuxer:
sink pad:sink pads指Element的输入(input)。用于元件(element)之间的连接和通信,也叫元件(element)的插座。
source pad:source pads是指Element的输出(output)
Buffer:缓冲区(Buffer),缓冲区包含了你创建的管道里的数据流。
通常一个源元件会创建一个新的缓冲区,同时元件还将会把缓冲区的数据传递给下一个元件。元件会自动处理缓冲区,不需要自己来处理。Events:事件(Events),事件是一系列控制粒子,随着缓冲区被发送到管道的上游和下游。下游事件通知流状态相同的元件,可能的事件包括中断,flush,流的终止信号等等
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。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中的方法。https://gstreamer.freedesktop.org/documentation/installing/on-linux.html
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
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;}
gcc hello.c -o hello `pkg-config --cflags --libs gstreamer-1.0`
如果使用到其他的gstreamer插件,需要添加其他的插件名字
转载地址:http://pbmei.baihongyu.com/