使用Gstreamer 作为数据源输出视频数据 VI 集成gstreamer

使用Gstreamer 作为数据源输出视频数据 VI 集成gstreamer,第1张

在VcamSource的数据接口中,我们提供了6个必要的接口 :

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

编译应用


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/bake/11865917.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存