freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

gstreamer應(yīng)用程序開發(fā)手冊-資料下載頁

2025-06-29 07:49本頁面
  

【正文】 CALLBACK (cb_message_error), NULL)。g_signal_connect (bus, message::eos, G_CALLBACK (cb_message_eos), NULL)。[..] 如果你沒有使用GLib主循環(huán),默認的消息信號將會無效,然而,你可以導(dǎo)出一個小助手給集成提供你使用的主循環(huán),啟動產(chǎn)生總線信號。 (詳細見documentation) . 消息類型(Message types)GStreamer有幾種由總線傳遞的預(yù)定義消息類型,這些消息都是可擴展的。插件可以定義另外的一些消息,應(yīng)用程序可以有這些消息的絕對代碼或者忽略它們。強烈推薦應(yīng)用程序至少要處理錯誤消息并直接的反饋給用戶。所有的消息都有一個消息源、類型和時間戳。這個消息源能被用來判斷由哪個元件發(fā)出消息。例如,在眾多的消息中,應(yīng)用程序只對上層的管道發(fā)出的消息感興趣(如狀態(tài)變換的提示)。下面列出所有的消息種類、代表的意義,以及如何解析具體消息的內(nèi)容。n 錯誤、警告和消息提示:它們被各個元件用來在必要的時候告知用戶現(xiàn)在管道的狀態(tài)。錯誤信息表明有致命的錯誤并且終止數(shù)據(jù)傳送。錯誤應(yīng)該被修復(fù),這樣才能繼續(xù)管道的工作。警告并不是致命的,但是暗示有問題存在。消息提示用來告知非錯誤的信息。這些消息含有一個帶有主要的錯誤類型和消息的GError,和一個任選的調(diào)試字符串。這兩項都可以用gst_message_parse_error (), _parse_warning () 以及 _parse_info ()三個函數(shù)來提取其信息。當(dāng)使用完畢后,錯誤和修正字符串都將被釋放。n 數(shù)據(jù)流結(jié)束(Endofstream)提示:當(dāng)數(shù)據(jù)流結(jié)束的時候,該消息被發(fā)送。管道的狀態(tài)不會改變,但是之后的媒體操作將會停止。應(yīng)用程序可以通過收到這一消息來跳到播放列表的下一首歌。在數(shù)據(jù)流結(jié)束提示出現(xiàn)之后,仍然可以通過向后搜索來回到以前數(shù)據(jù)流前面的位置。之后的播放工作將會自動的繼續(xù)執(zhí)行。這個消息沒有特殊的參數(shù)。n 標(biāo)簽(Tags):當(dāng)元數(shù)據(jù)在數(shù)據(jù)流中被找到的時候,此消息被發(fā)送。一個管道可以發(fā)出多個Tag(如元數(shù)據(jù)的描述里有藝術(shù)家、歌曲名,另外的例子如流的信息采樣率和比特率)。應(yīng)用程序應(yīng)該將元數(shù)據(jù)存儲在緩存里。函數(shù)gst_message_parse_tag () 被用來解析tag的列表,當(dāng)該列表不再使用的時候,函數(shù)gst_tag_list_free () 釋放其相應(yīng)的tag。n 狀態(tài)轉(zhuǎn)換(Statechanges):當(dāng)狀態(tài)成功的轉(zhuǎn)換時發(fā)送該消息。函數(shù)gst_message_parse_state_changed ()可以用來解析轉(zhuǎn)換中的新舊狀態(tài)。n 緩沖(Buffering):當(dāng)緩沖網(wǎng)絡(luò)數(shù)據(jù)流時此消息被發(fā)送。你可以通過函數(shù)gst_message_get_structure ()的返回值,來解析bufferpercent 屬性,從而手動的得到緩沖進度(該緩沖進度以百分比的形式表示)。n 元件消息(Element messages):它是一組特殊的消息,用以標(biāo)識一個特定元件。這樣一組特殊的消息通常表述了一些額外的信息。元件的信息應(yīng)該被詳細的描述,因為這樣一些元件信息將被作為消息而發(fā)送給其他元件。例如:39。qtdemux39。 QuickTime 整流器(demuxer)應(yīng)該把39。redirect39。信息保存于該元件信息當(dāng)中,以便在某種特殊情況下將39。redirect39。元件信息發(fā)送出去。n Applicationspecific消息:我們可以將取得的消息結(jié)構(gòu)解析出來,從而得到有關(guān)Applicationspecific消息的任何信息。通常這些信息是能夠被安全地忽略。應(yīng)用程序消息主要用于內(nèi)部,以備從一些線程排列信息到主線程應(yīng)用的需求。這些在使用元件信號的應(yīng)用中非常實用(這些信號在數(shù)據(jù)流線程的上下文被發(fā)射)。22第8章. 襯墊(Pads)及其功能如我們在Elements一章中看到的那樣,襯墊(Pads)是元件對 外的接口。數(shù)據(jù)流從一個元件的源襯墊(source pad)到另一個元件的接收襯墊(sink pad)。襯墊的功能(capabilities)決定了一個元件所能處理的媒體類型。在這章的后續(xù)講解中,我們將對襯墊的功能做更詳細的說明。 ().. 襯墊(Pads)一個襯墊的類型由2個特性決定:它的數(shù)據(jù)導(dǎo)向(direction)以及它的時效性(availability)。正如我們先前提到 的,Gstreamer定義了2種襯墊的數(shù)據(jù)導(dǎo)向:源襯墊以及接收襯墊。襯墊的數(shù)據(jù)導(dǎo)向這個術(shù)語是從元件內(nèi)部的角度給予定義的: 元件通過它們的接收襯墊接收數(shù)據(jù),通過它們的源襯墊輸出數(shù)據(jù)。如果通過一張圖來形象地表述,接收襯墊畫在元件的左側(cè),而源襯墊畫在元件的右側(cè),數(shù)據(jù)從左向右流動。[1]襯墊的時效性比襯墊的數(shù)據(jù)導(dǎo)向復(fù)雜得多。一個襯墊可以擁有三種類型的時效性: 永久型(always)、隨機型(sometimes)、請求型(on request)。三種時效性的意義顧名思義: 永久型的襯墊一直會存在,隨機型的襯墊只在某種特定的條件下才存在(會隨機消失的襯墊也屬于隨機型),請求型的襯墊只在應(yīng)用程序明確發(fā)出請求時才出現(xiàn)。. 動態(tài)(隨機)襯墊一些元件在其被創(chuàng)建時不會立刻產(chǎn)生所有它將用到的襯墊。例如在一個Ogg demuxer的元件中可能發(fā)生這種情況。這個元件將會讀取Ogg流,每當(dāng)它在Ogg流中檢測到一些元數(shù)據(jù)流時(例如vorbis,theora ),它會為每個元數(shù)據(jù)流創(chuàng)建動態(tài)襯墊。同樣,它也會在流終止時刪除該襯墊。動態(tài)襯墊在demuxer這種元件中可以起到很大的作用。運行g(shù)stinspect oggdemux只會顯示出一個襯墊在元件中: 一個名字叫作39。sink39。的接收襯墊,其它的襯墊都處于39。休眠39。中,你可以從襯墊模板(pad template)中的Exists: Sometimes的屬性看到這些信息。襯墊會根據(jù)你所播放的Ogg文件的類型而產(chǎn)生,認識到這點 對于你創(chuàng)建一個動態(tài)管道特別重要。當(dāng)元件通過它的隨機型(sometimes)襯墊模板創(chuàng)建了一個隨機型(sometimes)的襯墊的時侯,你可以通過對該元件綁定一個信號處理器(signal handler),通過它來得知襯墊被創(chuàng)建。下面一段代碼演示了如何這樣做:名叫39。sink39。的接收襯墊,其它的襯墊都處于39。休眠39。中,顯而易見這是襯墊”有時存在”的特性。襯墊會根據(jù)你所播放的Ogg文件的類型而產(chǎn)生,這點在你 準(zhǔn)備創(chuàng)建一個動態(tài)管道時顯得特別重要,當(dāng)元件創(chuàng)建了一個”有時存在”的襯墊時,你可以通過對該元件觸發(fā)一個信號處理器(signal handler) 來得知襯墊被創(chuàng)建。下面一段代碼演示了如何這樣做:include gst/static voidcb_new_pad (GstElement *element, GstPad *pad, gpointer data){ gchar *name。 name = gst_pad_get_name (pad)。 g_print (A new pad %s was created\n, name)。 g_free (name)。 /* here, you would setup a new pad link for the newly created pad */[..]}int main (int argc, char *argv[]) { GstElement *pipeline, *source, *demux。 GMainLoop *loop。 /* init */ gst_init (amp。argc, amp。argv)。 /* create elements */ pipeline = gst_pipeline_new (my_pipeline)。 source = gst_element_factory_make (filesrc, source)。 g_object_set (source, location, argv[1], NULL)。 demux = gst_element_factory_make (oggdemux, demuxer)。 /* you would normally check that the elements were created properly */ /* put together a pipeline */ gst_bin_add_many (GST_BIN (pipeline), source, demux, NULL)。 gst_element_link_pads (source, src, demux, sink)。 /* listen for newly created pads */ g_signal_connect (demux, padadded, G_CALLBACK (cb_new_pad), NULL)。 /* start the pipeline */ gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING)。 loop = g_main_loop_new (NULL, FALSE)。 g_main_loop_run (loop)。[..]} . 請求襯墊元件同樣可以擁有請求襯墊(request pads)。這種襯墊不是自動被創(chuàng)建,而是根據(jù)請求被創(chuàng)建的。這在多路復(fù)用(multiplexers)類型的元件中有很大的用處。例如 aggregators以及tee元件。Aggregators 元件可以把多個輸入流合并成一個輸出流。 tee元件正好相反,它只有一個輸入流,然后根據(jù)請求把數(shù)據(jù)流發(fā)送到不同的輸出襯墊。只要應(yīng)用程序需要另一份數(shù)據(jù)流,它可以簡單的從tee元件請求到一個 輸出襯墊。下面一段代碼演示了怎樣在一個”tee”元件請求一個新的輸出襯墊:static voidsome_function (GstElement *tee){ GstPad * pad。 gchar *name。 pad = gst_element_get_request_pad (tee, src%d)。 name = gst_pad_get_name (pad)。 g_print (A new pad %s was created\n, name)。 g_free (name)。 /* here, you would link the pad */[..] /* and, after doing that, free our reference */ gst_object_unref (GST_OBJECT (pad))。} gst_element_get_request_pad()方法可以從一個元件中得到一個襯墊,這個襯墊基于襯墊模板的名字(pad template)。同樣可以請求一個同其它襯墊模板兼容的襯墊,這點在某些情況下非常重要。比如當(dāng)你想要將一個元件連接到一個多路復(fù)用型的元件時,你就需要請求一個帶兼容性的襯墊。gst_element_get_patible_pad()方法可以得到一個帶兼容性的襯墊。下面一段代碼將從一個基于Ogg的帶多輸入襯墊的元件中請求一個帶兼容性的襯墊。static voidlink_to_multiplexer (GstPad *tolink_pad, GstElement *mux){ GstPad *pad。 gchar *srame, *sinkname。 srame = gst_pad_get_name (tolink_pad)。 pad = gst_element_get_patible_pad (mux, tolink_pad)。 gst_pad_link (tolinkpad, pad)。 sinkname = gst_pad_get_name (pad)。 gst_object_unref (GST_OBJECT (pad))。 g_print (A new pad %s was created and linked to %s\n, srame, sinkname)。 g_free (sinkname)。 g_free (srame)。} 注[1]事實上,數(shù)據(jù)流可以逆流(upstream)地在一個元件中從源襯墊到接收襯墊。但數(shù)據(jù)總是從一個元件的源襯墊到另一個元件的接收襯墊。(Pads)的性能由于襯墊對于一個元件起了非常重要的作用,因此就有了一個術(shù)語來描述能夠通過襯墊或當(dāng)前通過襯墊的數(shù)據(jù)流。這個術(shù)語就是功能 (capabilities)。在這里,我們將簡要介紹什么是襯墊的功能以及怎么使用它們。這些足以使我們對這個概念有個大 致的了解。如果想要對襯墊的功能有更深入的了解,并知道在GStreamer 中定義的所有的襯墊的功能,請參考插件開發(fā)手冊Plugin Writers Guide。襯墊的功能(capabilities)是與襯墊模板(pad templates)以及襯墊實例相關(guān)聯(lián)的。對于襯墊模板,襯墊的功能(capabilities)描述的是:當(dāng)通過該襯墊模板創(chuàng)建了一個襯墊后,該襯墊允許通過的媒體類型。對于襯墊實例,功能可以描述所有可能通過該襯墊的媒體類型(通常是該襯墊實例所屬的襯墊模板的功能的一份拷貝),或者是當(dāng)前已經(jīng)通過該襯墊的流媒體類型。前一種情況,該襯墊實例還未有任何數(shù)據(jù)流在其中通過。. 分解功能襯墊的功能通過GstCaps 對象來進行描述。一個GstCaps對象會包含一個或多個GstStructure。一個 GstStructure描述一種媒體類型。一個被數(shù)據(jù)流通過的襯墊(negotiated pad)存在功能集(capabilities
點擊復(fù)制文檔內(nèi)容
數(shù)學(xué)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1