Chinaunix首页 | 论坛 | 博客
  • 博客访问: 144232
  • 博文数量: 35
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2014-11-16 22:30
文章分类

全部博文(35)

文章存档

2016年(2)

2015年(24)

2014年(9)

我的朋友

分类: 嵌入式

2015-12-24 17:05:54

原文地址:GStreamer框架 作者:graylocus

 Gstreamer内部培训资料
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://general.blog.51cto.com/927298/362679
    为了今天2个小时的培训,准备了两周,今天终于做完了。
    效果不敢说,但是经过系统整理这些资料还是学到不少东西。
ppt大家可以自己看,这里只对通信机制说明一下,因为我感觉这是刚入门的新手最头疼的东西。
    因为Gstreamer是个开源的东西,构建思想很好,估计会很有发展前途。希望大家能多多交流,共同学习。
    以下这些也是自己的一点想法,如果不正确的地方,希望大家指出来,共同进步。


1. Message: 是pipeline用来主动向外报告自己的运行状态。这些Message被发送到一个消息队列,也就是 pipeline的 Bus。应用程序就可以从Bus中获取Message,并作出自定义的反应。


2.  Event:   是pipeline中插件之间进行通信的机制,分为下行事件,上行事件和双向事件。也可以由应用程序直接向某一个插件发送事件,但起作用的前提是:该插件定义了该事件的响应操作。通过事件可以控制整个pipeline的运行状态。
下行事件是由source插件向sink插件方向传输,如:
GST_EVENT_EOS
GST_EVENT_NEWSEGMENT
上行事件是由sink插件向source插件方向传输。如:
GST_EVENT_QOS
GST_EVENT_SEEK
双行事件:
GST_EVENT_FLUSH_START
GST_EVENT_FLUSH_STOP



3.   Signal:  应用程序控制某一插件的运行状态,signal可以看做Glib对象的一个属性,属于同步操作,与linux中的系统信号有差别。通过信号可以让某个插件做一些对插件本身变量的操作,比如增加或者删除一些维护信息等等。



4.   应用程序还可以通过探针Probe来探测某个插件的pad中流过的数据,比如:
在 audioconert 插件的src pad 加一个探针,每当有buf到达时,就调用
callback_have_data(),这里这个函数只是打印一下buf的大小,统一一下buf流过的个数。

//main
[..]
   GstPad *m_pad_concert_src = gst_element_get_static_pad(m_gst_convert, "src");   
    gst_pad_add_buffer_probe(m_pad_concert_src, G_CALLBACK(callback_have_data), NULL);
    gst_object_unref(m_pad_concert_src);
[..]
//

/*******Callback handler when probe date received***********/
static gboolean 
callback_have_data(GstPad *padsrc, GstBuffer *buffer, gpointer data){
    gint    iBufSize = 0;
    gchar*     pBuffer = NULL;
        
    iBufSize = GST_BUFFER_SIZE(buffer);
    pBuffer = (gchar*)GST_BUFFER_DATA(buffer);
    
    static gint numBuf = 0;
    g_print("\rBUF %d  Size=%d   ", numBuf++, iBufSize);

    return TRUE;
}


5.  应用程序还可以查询pipline当前的运行状态,比如:
以下代码用来查询当前播放的位置,和总的播放时间。当然还有其他数据可查,大家自己查查吧!

/************************************************/
GstFormat m_format = GST_FORMAT_TIME;
gint64 m_position , m_length;
    
    if(gst_element_query_position(pipeline, &m_format,&m_position) 
        && gst_element_query_duration(pipeline, &m_format, &m_length)){

        g_print("Current: %"GST_TIME_FORMAT"   Total: %" GST_TIME_FORMAT "\r",  
            GST_TIME_ARGS(m_position),GST_TIME_ARGS(m_length));
    }
/************************************************/



其他的照抄如下:























阅读(1986) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~