使用Gstreamer 作为数据源输出视频数据 IV Sourc
2021-11-17 本文已影响0人
Charles_linzc
作为virtual camera程序,gstreamer部分需要向directshow部分提供媒体数据和媒体类型信息,所以我们需要两类接口:
- 作为媒体信息接口
作为媒体信息接口,我们需要提供足够的信息,以方便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支持的媒体类型,这个接口比较简单,仅支持返回一个具体媒体类型和格式信息。
- 数据接口
数据接口主要用于在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__ */