美文网首页
使用Gstreamer 作为数据源输出视频数据 IV Sourc

使用Gstreamer 作为数据源输出视频数据 IV Sourc

作者: Charles_linzc | 来源:发表于2021-11-17 16:16 被阅读0次

    作为virtual camera程序,gstreamer部分需要向directshow部分提供媒体数据和媒体类型信息,所以我们需要两类接口:

    1. 作为媒体信息接口
      作为媒体信息接口,我们需要提供足够的信息,以方便directshow用户创建source的output pin,信息包含的内容如下,可参考 使用Gstreamer 作为数据源输出视频数据 II 媒体类型信息:
      video/x-raw,width=1280,height=720,format=YUY2,framerate=(fraction)30/1
      我们自定义一个结构体,VcamMediaInfo, 将包含以上信息,并使用c语言的类型作为属性类型,方便directshow程序集成:
    struct _VcamMediaInfo {
        char* type;
        long  width;
        long  height;
        long  framerate;
    };
    
    void  vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
    

    _VcamMediaInfo 包含了所有的媒体类型信息, vcam_source_get_mediatype用来返回当前source支持的媒体类型,这个接口比较简单,仅支持返回一个具体媒体类型和格式信息。

    1. 数据接口
      数据接口主要用于在directshow filter 在fillbuffer的时候获取数据,GstSample 封装的东西比较多,它包含了数据,类型,时间以及其它任意数据;对我们来说,我们现在之关系数据,所以我们将GstMemory作为返回的数据容器:
    void  vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
    
    void  vcam_source_pull_sample(VcamSource* self, GstSample* sample);
    
    void  vcam_source_pull_preroll(VcamSource* self, GstSample* sample);
    
    void  vcam_source_pull_sample2(VcamSource* self, GstMemory* mem); //返回gstMemory
    
    void  vcam_source_pull_preroll2(VcamSource* self, GstMemory* mem);  //返回gstMemory
    

    为了能够被c++程序调用,我们需要通过extern c 来开发source的头文件,最终得到得头文件如下:

    #ifndef VCAM_SOURCE_H
    #define VCAM_SOURCE_H
    
    #ifdef __cplusplus             
    extern "C" {
    #endif
    #include <gst/gst.h>  //包含gst 头文件,方便调用gstmemory及方法
    
    #define VCAM_TYPE_SOURCE (vcam_source_get_type())
    G_DECLARE_DERIVABLE_TYPE(VcamSource, vcam_source, VCAM, SOURCE, GObject)
    
    typedef struct _VcamSourcePrivate VcamSourcePrivate;
    
    struct _VcamSourceClass {
        GObjectClass parent_class;
        gshort(*start)(VcamSource* self);
    };
    
    typedef struct _VcamMediaInfo  VcamMediaInfo;
    
    struct _VcamMediaInfo {
        char* type;
        long  width;
        long  height;
        long  framerate;
    };
    gshort vcam_source_start(VcamSource* self);
    
    void  vcam_source_get_mediatype(VcamSource* self, VcamMediaInfo* info);
    
    void  vcam_source_pull_sample(VcamSource* self, GstSample* sample);
    
    void  vcam_source_pull_preroll(VcamSource* self, GstSample* sample);
    
    void  vcam_source_pull_sample2(VcamSource* self, GstMemory* mem);
    
    void  vcam_source_pull_preroll2(VcamSource* self, GstMemory* mem);
    
    #ifdef __cplusplus
    }
    #endif
    
    
    #endif /* __VCAM_SOURCE_H__ */
    

    相关文章

      网友评论

          本文标题:使用Gstreamer 作为数据源输出视频数据 IV Sourc

          本文链接:https://www.haomeiwen.com/subject/aarqtrtx.html