为了今天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_STOP3. 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));
}
/************************************************/
其他的照抄如下: