Gstreamer 02

gstreamer 01 播放視頻的功能
1、引用#include <gst/gst.h>,新鮮的方法名都來自這裏
2、流程:
1)初始化
2)創建pepeline gst_parse_launch+playbin(一種element)用於簡單調試。通常在創建較複雜的pipeline時,我們需要通過gst_element_factory_make來創建element,然後將其加入到GStreamer Bin中,並連接起來
3)gst_element_set_state (pipeline, GST_STATE_PLAYING) //設置播放狀態
4)bus = gst_element_get_bus (pipeline);
msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);
當到達文件末端(EOS)或出錯(直接關閉播放窗口,斷開網絡)時,播放會自動停止。
5)釋放資源bus和pipeline

gstreamer 02 單獨創建element
1、分離器(demuxer)例如mp4的demuxer(qtdemux)會將mp4文件中的音頻和視頻的分離到audio src pad和video src pad。而mp4的muxer(mp4mux)則相反,會將audio sink pad和video sink pad的數據合併到一個src pad(生成pad)
2、各種Element,element在代碼裏叫GstElement
1) 只能生成數據的element,filesrc。只能接收數據sink element(sink pad只是接收接口),例如播放聲音的alsasink。
3、Bin和Pipeline 將各個element按順序放到bin裏,play自動就流到底
1) Element連起來不就行了,爲啥還需要bin和pipeline呢?看繼承關係,都是element之子
GObject
╰──GInitiallyUnowned
╰──GstObject
╰──GstElement
╰──GstBin
╰──GstPipeline
2)bin—管理一羣element,每次都操作每個element重複工作太多,用bin(容器)管理,常見的bin有decodebin,autovideoconvert等
3)比如音視頻同步,需要時鐘,pipeline提供時鐘,爲應用提供了bus系統,用於消息的接收。pipeline上所有的element都可以使用這個bus嚮應用程序發送消息
4)bus解決裏多線程之間消息處理的問題。條理清晰
5) source = gst_element_factory_make (“videotestsrc”, “source”);
第一個參數是element的類型,可以通過這個字符串,找到對應的類型,從而創建element對象。第二個參數指定了創建element的名字,當我們沒有保存創建element的對象指針時,我們可以通過gst_bin_get_by_name從pipeline中取得該element的對象指針。如果第二個參數爲NULL,則GStreamer內部會爲該element自動生成一個唯一的名字。

GStreamer 03 Pad
1、Pad支持的數據類型才能通過Pad,Pad通過Pad Capabilities(簡稱爲Pad Caps)來描述支持的數據類型。
當我們需要將同一路視頻流同時進行顯示和存儲,這時候我們就需要用到tee element

GStreamer04 - 動態連接Pipeline
1、音視頻分離的例子中,只有當demuxer收到足夠的消息後,才能向下進行,所以這個時候收到消息我們才能動態鏈接pipeline

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章