g_signal_connect(data.appsrc , "need-data", G_CALLBACK(needdata), NULL);
向appsrc中填充数据的办法
#define BUFFER_SIZE 4096
FILE* appSrcFile;
static void needdata (GstElement *source, guint unused_size, CustomData *data)
{
开始需要设置以下5个参数
GstFlowReturn ret;
GstMapInfo gst_map;
GstBuffer *gst_buffer = NULL;
char data_buffer[BUFFER_SIZE];
int data_size = BUFFER_SIZE;
第一步:读取数据存储到data_buffer,长度为data_size,以下为两种方式
1.memset(data_buffer, 0x80, data_size);//初始化data_buffer为0x80,长度为data_size
2. if(appSrcFile == NULL)
{
appSrcFile = fopen(filename, "r");//打开文件
}
//data_buffer中存储着读的数据
data_size = fread(data_buffer,1,data_size,appSrcFile);//返回读取的数量,每次读取一个字节,读的次数为size
printf("read_data() read_counter=%d, size=%d\n", read_counter++, size);
第二步:初始化重新分配gst_buffer的大小为data_size,并调用gst_buffer_map函数
gst_buffer = gst_buffer_new_allocate (NULL, data_size, NULL);
gst_buffer_map (gst_buffer, &gst_map, GST_MAP_WRITE);//以下两种均可
gst_buffer_fill(gst_buffer, 0, data_buffer, data_size);
第三步:将data_buffer中存储的数据复制到gst_map.data,大小为data_size
memcpy( (guchar *)gst_map.data, data_buffer, data_size);
第四步:将gst_buffer中的数据推入source(appsrc)
g_signal_emit_by_name (source, "push-buffer", gst_buffer, &ret);
第五步:释放缓存,线程序
gst_buffer_unmap (gst_buffer, &gst_map);
gst_buffer_unref (gst_buffer);
}