|
目前在做项目,使用到gstreamer。 项目主要是以自己搭建的流媒体服务器为数据源,专门写了一个模块,接收流媒体服务器的数据,将数据解析。将ts流利用gstreamer最终显示出来。
gstreamer本身提供的插件框架不能支持这种应用。 所以我自己写了2个插件,一个作为源,一个是解码+sink的。 源插件是根据filesrc改写的。主要是将filesrc里面原有的读文件的去掉,增加2个元素,一个是我要传送的数据的地址,一个是这个数据的长度。然后在filesrc里面的gst_file_src_create_read函数中进行copy,如下:(src->fd, src->bufsize是我增加的2个元素)
gst_file_src_create_read (GstFileSrc * src, guint64 offset, guint length,
GstBuffer ** buffer)
{
int ret;
GstBuffer *buf;
buf = gst_buffer_new_and_alloc (length);
GST_LOG_OBJECT (src, "Reading %d bytes", length);
memcpy(GST_BUFFER_DATA (buf), (void *)src->fd, src->bufsize);
length = src->bufsize;
GST_BUFFER_SIZE (buf) = length;
GST_BUFFER_OFFSET (buf) = offset;
GST_BUFFER_OFFSET_END (buf) = offset + length;
*buffer = buf;
// src->read_position += length;
return GST_FLOW_OK;
另外我没有采用gstreamer的loop函数,而是在自己模块的循环处理里面,当收到数据的时候,调用了 g_main_iteration(FALSE);这个函数。这个函数我试过是可以替代loop的。
可是最终显示的效果很差,偶然能够显对1-2帧。其他的就不行了。 |
|