前言:

Gstreamer 提供以 GstMessage 和 GstBus 为基础的消息传递机制,所有GstMessage 发送的时候都需要指定 GstBus 用来明确当前 message 将在哪条 Bus 上流转。所有的 GstMessage 最终都会进入一个handler,这个handler函数可以通过两种方式设置 gst_bus_set_sync_handler 和 gst_bus_add_watch。 如果没有设置 handler 函数,那么GstMessage将永远不会被处理,从而造成内存泄漏。

gst_bus_set_sync_handler

handler函数被同步执行,所谓的同步是指 handler的运行线程 和 element里调用 gst_bus_post 发送 Message 的线程

或者说,调用 gst_bus_post 会直接同步进入 handler 处理函数。
 

gst_bus_add_watch

通过此函数添加的handler函数不会在 gst_bus_post 调用时被同步唤起,而是在某个其他时间点在 g_mainloop 里被唤起从而处理 GstMessage。而g_mainloop一般都是主线程。所以这种情况用的不多。原因如下:

  1. 实时性较差,gst_bus_post会立刻返回,此时调用发送 GstMessage 的线程并不知道外界是否按照自己的意图处理完 message。有时候甚至很久都不会被处理,因为主线程一般比较忙。
  2. 占用主线程资源,主线程一般都是ui线程,因此阻塞主线程会导致ui卡住。

还有一种异步的方法是 gst_bus_add_signal_watch