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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Gstreamer 作为数据源输出视频数据 VI 集成gstreamer相关的知识,希望对你有一定的参考价值。

参考技术A 在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被用来作为转化器:

基本显示一致,只有一个小区域颜色不一致。

gstreamer视频对话需要经过网络吗

参考技术A gstreamer视频对话需要经过网络的
使用gstreamer appsrc通过网络播放视频流。gstreamer appsrc通过网络进行视频流式传输
我在这里找到了很好的例子。
gstreamer appsrc test application
http://amarghosh.blogspot.kr/2012/01/gstreamer-appsrc-in-action.html
使用上面的例子,我可以在X Window使用的Xlib播放视频。当管道设置为PLAYING状态时,以某种方式发出“需要数据”信号并将start_feed回调函数中的数据从视频文件中读取后注入appsrc GstBuffer并播放示例视频。

以上是关于使用Gstreamer 作为数据源输出视频数据 VI 集成gstreamer的主要内容,如果未能解决你的问题,请参考以下文章

控制 gstreamer 源插件的输出速率

如何使用Vala将GStreamer视频输出到Gdk.Pixbuf?

如何从 gstreamer 中的源请求更多缓冲区?

GStreamer 警告:无法查询视频位置:状态=0,值=-1,持续时间=-1

GTK3.0中如何使用gstreamer同时播放视频和音频

gstreamer视频对话需要经过网络吗