start接口用来启动gstreamer的pipleLine, 它应该在dll被启动的时候调用,并且在dll退出的时候调用unref.
vcam_source_get_mediatype用来获取媒体类型,用于directshow组件的连接。
其余4个都是获取数据接口。我们主要使用vcam_source_pull_sample2来获取自动生成的数据。
我们需要将库和头文件引入directshow项目中,同时将该项目的静态图,加入连接配置:
在dllmain.cpp中引入头文件VcamSource.h, 在入口函数dllmain处,我们需要调用gstrreamer的初始化函数,确保只调用一次。
增加一个私有属性, VcamSource指针,用来维护对vcamsoure的引用,另外增加析构函数的声明:
修改CVCam,在返回cvcam的时候,同时创建一个VcamSource的实例,这个实例有CVCam保存:
新增一个析构函数,用来在cvcam退出时,减少VcamSource的引用:
在CVCamStream类中,我们首先需要完成fillBuffer的工作,source接口提供了vcam_source_pull_sample2方法,方便我们来获取gstreamer生成的数据。
这里通过GstMapInfo map获取来在gstreamer的数据,然后把他填充到directshow的buffer里。二外做的循环,时为了测试数据帧大小不一致时,使用随机数填充,方便界面发现。实际验证时可去除。
除了FillBuffer外,另外两个重要修改的方法时GetStreamCaps和GetMediaType,这里暂时不调用vcam_source_get_mediatype,减少验证复杂性:
上面的媒体类型和format格式,对应在gstramer重,如下:
完成后,build gst-vcam项目,生成 gstvcam.dll ; 使用regsvr32 gstvcam.dll 进行注册,生成gst-vcam虚拟摄像头信息:
使用graphedit, 创建一个测试graph,可以看到,AVI Decompressor被用来作为转化器:
基本显示一致,只有一个小区域颜色不一致。
Application Development Manual
Gstreamer是一个支持Windows,Linux,Android, iOS的跨平台的多媒体框架,应用程序可以通过管道(Pipeline)的方式,将多媒体处理的各个步骤串联起来,达到预期的效果。每个步骤通过元素(Element)基于GObject对象系统通过插件(plugins)的方式实现,方便了各项功能的扩展。
GStreamer 的核心功能是为插件、数据流和媒体类型处理/协商提供框架。它还提供了一个 API 来使用各种插件编写应用程序。
GStreamer 提供
Gstreamer框架根据各个模块的成熟度以及所使用的开源协议,将core及plugins置于不同的源码包中:
Element是Gstreamer中最重要的对象类型之一。一个element实现一个功能(读取文件,解码,输出等),程序需要创建多个element,并按顺序将其串连起来(使用管道 ! ),构成一个完整的pipeline。
官方Elements与Plugins Lists
element主要有三种:
pads 是元素与外界的接口,有两个属性定义:方向和可用性。两个element必须通过pad才能连接起来,在element通过pad连接成功后,数据会从上一个element的src pad传到下一个element的sink pad然后进行处理。一个element可以同时拥有多个相同的pad。
bin 是一个容器元素,用于管理多个element。由于 bin 本身就是一个元素,因此可以以与任何其他元素相同的方式处理 bin。改变bin的状态时,bin会自动去修改所包含的element的状态,也会转发所收到的消息。如果没有bin,我们需要依次 *** 作我们所使用的element。通过bin降低了应用的复杂度。
Pipeline继承自bin,为程序提供一个bus用于传输消息,并且对所有子element进行同步。当将pipeline的状态设置为PLAYING时,pipeline会在一个/多个新的线程中通过element处理数据。
示例:通过下面的命令播放文件时,会创建如下pipeline:
这个pipeline由8个element构成,每个element都实现各自的功能:
filesrc读取文件,oggdemux解析文件,分别提取audio,video数据,queue缓存数据,vorbisdec解码audio,autoaudiosink自动选择音频设备并输出;theoradec解码video,videoconvert转换video数据格式,autovideosink自动选择显示设备并输出。
参考 Installing on Linux
API reference
示例应用helloworld.c
编译应用
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)