2017年12月4日 星期一

[轉] gstreamer學習筆記(3):message,event,signal區別


  • message
    在gstreamer中,message或者說Bus message(因為message都是在GSTBus上傳遞的),是用於gstreamer和application之間交互用的,比如當一個文件播放結束的時候,gstreamer會發一個EOS的message到GstBus上,如果app有去偵聽(函數gst_bus_add_watch),那麼在處理消息的callback函數中就可以收到這個消息。
  • event
Most of the event API is used inside plugins. Applications usually only construct and use seek events. To do that gst_event_new_seek() is used to create a seek event. It takes the needed parameters to specify seeking time and mode.
以上是關於GstEvent描述的一部分內容,也就是說,一般來說event是用於gstreamer內部element與element之間(或者說pad與pad之間)傳遞事件的,比如source element的數據已經結束了,那麼他就會發出一個EOS event,然後順著pipeline依次向down stream的方向傳遞, 這些elements可以得到通知,從而做一些cleanup的工作,當最終所有的sink element都收到並處理了這個EOS event之後,gstreamer內部就是產生一條GSTMessage,並post至GstBus,如果APP有監聽,那麼它就能知道當前播放已經結束了。 
而對於APP能用的就只有一個seek event。
  • signal
    signal不是gstreamer特有的東西,它是來自於GObject體系,是用於app和GObject之間進行交互的一種機制。在gstreamer中,element本身也是gobject,所以,通過signal,就可以將app和element聯繫起來。 
    當element發生了一些事情相讓app知道時,就可以用signal的方式來通知app比如動態創建了一個Pad。當然也可以在element與element之間使用, 比如在Gstplaybin當中就會偵聽uridecoderbin發出來的autoplug-factories,autoplug-select等信號。
signal和Bus message不同,bus message是pipeline上的,一般是app和pipeline交互的一種方法。signal則具體到了每個element。
整體框圖如(此圖來自網絡): 
這裡寫圖片描述

沒有留言:

張貼留言