《Linux C從入門(mén)到精通》明日科技第20章MP3 音樂(lè)播放器_第1頁(yè)
《Linux C從入門(mén)到精通》明日科技第20章MP3 音樂(lè)播放器_第2頁(yè)
《Linux C從入門(mén)到精通》明日科技第20章MP3 音樂(lè)播放器_第3頁(yè)
《Linux C從入門(mén)到精通》明日科技第20章MP3 音樂(lè)播放器_第4頁(yè)
《Linux C從入門(mén)到精通》明日科技第20章MP3 音樂(lè)播放器_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、GStreamer簡(jiǎn)介 程序中播放音樂(lè)的功能將由程序中播放音樂(lè)的功能將由GStreamerGStreamer多媒體框架提供。多媒體框架提供。GStreamerGStreamer的操作需要應(yīng)用程序的開(kāi)發(fā)者創(chuàng)建管道。每個(gè)管道由一組元素組成的操作需要應(yīng)用程序的開(kāi)發(fā)者創(chuàng)建管道。每個(gè)管道由一組元素組成,每個(gè)元素都執(zhí)行一個(gè)特定功能。通常情況下,一個(gè)管道以某種類(lèi)型的源元素開(kāi)始,這可能是被稱(chēng)為,每個(gè)元素都執(zhí)行一個(gè)特定功能。通常情況下,一個(gè)管道以某種類(lèi)型的源元素開(kāi)始,這可能是被稱(chēng)為sourcesource的元素,它從磁盤(pán)上讀取文的元素,它從磁盤(pán)上讀取文件并提供該文件的內(nèi)容,也可能是通過(guò)一個(gè)網(wǎng)絡(luò)連接提供緩沖數(shù)據(jù)的

2、元素,甚至可能是從一個(gè)視頻捕捉設(shè)備獲取數(shù)據(jù)的元素。管道中還件并提供該文件的內(nèi)容,也可能是通過(guò)一個(gè)網(wǎng)絡(luò)連接提供緩沖數(shù)據(jù)的元素,甚至可能是從一個(gè)視頻捕捉設(shè)備獲取數(shù)據(jù)的元素。管道中還存在一些其他類(lèi)型的元素,如解碼器(用于將聲音文件轉(zhuǎn)換為處理所需的標(biāo)準(zhǔn)格式)、分離器(用于從一個(gè)聲音文件中分解出多個(gè)聲道存在一些其他類(lèi)型的元素,如解碼器(用于將聲音文件轉(zhuǎn)換為處理所需的標(biāo)準(zhǔn)格式)、分離器(用于從一個(gè)聲音文件中分解出多個(gè)聲道)或其他類(lèi)似的處理器。管道以一個(gè)輸出元素結(jié)束,它可以是從一個(gè)文件寫(xiě)入器到一個(gè)高級(jí))或其他類(lèi)似的處理器。管道以一個(gè)輸出元素結(jié)束,它可以是從一個(gè)文件寫(xiě)入器到一個(gè)高級(jí)LinuxLinux音頻體系

3、結(jié)構(gòu)(音頻體系結(jié)構(gòu)(ALSAALSA)音頻輸出元素)音頻輸出元素或一個(gè)基于或一個(gè)基于Open GLOpen GL的視頻播放元素的任何元素。這些輸出元素被稱(chēng)為的視頻播放元素的任何元素。這些輸出元素被稱(chēng)為“sink”sink”(接收器)。(接收器)。gst_element_factory_makegst_element_factory_make() ()用來(lái)創(chuàng)建不同的元件。此函數(shù)是一個(gè)可以構(gòu)建任何用來(lái)創(chuàng)建不同的元件。此函數(shù)是一個(gè)可以構(gòu)建任何GStreamerGStreamer元素的通用構(gòu)造函數(shù)。它的第一個(gè)參數(shù)指元素的通用構(gòu)造函數(shù)。它的第一個(gè)參數(shù)指定要構(gòu)建的元素名。定要構(gòu)建的元素名。GStreame

4、rGStreamer使用字符串名稱(chēng)來(lái)確定元素類(lèi)型,從而方便添加新元素。如果需要,一個(gè)程序可以從配置文件或用戶(hù)那使用字符串名稱(chēng)來(lái)確定元素類(lèi)型,從而方便添加新元素。如果需要,一個(gè)程序可以從配置文件或用戶(hù)那里接受元素名稱(chēng)并使用新的元素而不需要重新編譯程序來(lái)包括定義這些元素名的頭文件。只要指定的元素是正確的(這可以在程序運(yùn)行里接受元素名稱(chēng)并使用新的元素而不需要重新編譯程序來(lái)包括定義這些元素名的頭文件。只要指定的元素是正確的(這可以在程序運(yùn)行時(shí)進(jìn)行檢查),它們就可以完美地操作而不需要改變?nèi)魏未a。函數(shù)的第二個(gè)參數(shù)用于給元素命名。元素名稱(chēng)在程序的其余部分不再使時(shí)進(jìn)行檢查),它們就可以完美地操作而不需要改變

5、任何代碼。函數(shù)的第二個(gè)參數(shù)用于給元素命名。元素名稱(chēng)在程序的其余部分不再使用,但它對(duì)識(shí)別一個(gè)復(fù)雜管道中的元素確實(shí)有其用處。本例中,用,但它對(duì)識(shí)別一個(gè)復(fù)雜管道中的元素確實(shí)有其用處。本例中,sourcesource是是filesrfilesr工廠創(chuàng)建的,功能是讀取磁盤(pán)文件;工廠創(chuàng)建的,功能是讀取磁盤(pán)文件;decoderdecoder是是madmad工工廠創(chuàng)建,用作廠創(chuàng)建,用作MP3MP3解碼器;解碼器;sinksink是是autoaudiosinkautoaudiosink工廠創(chuàng)建,輸出音頻流到聲卡。程序用工廠創(chuàng)建,輸出音頻流到聲卡。程序用gst_bin_add_manygst_bin_add_ma

6、ny() ()函數(shù)將這三個(gè)部件都加函數(shù)將這三個(gè)部件都加入管道入管道pipelinepipeline中,然后用中,然后用gst_element_link_manygst_element_link_many() ()來(lái)連接他們,這樣他們就可以配合工作了。來(lái)連接他們,這樣他們就可以配合工作了。const const gchargchar * *filename;filename;GMainLoopGMainLoop * *loop;loop;/定定義組義組件件GstElementGstElement * *source,source,* *decoder,decoder,* *sink;sink;G

7、stBusGstBus * *bus;bus;/創(chuàng)創(chuàng)建主循建主循環(huán)環(huán),在,在執(zhí)執(zhí)行行 g_main_loop_rung_main_loop_run后正式后正式開(kāi)開(kāi)始循始循環(huán)環(huán)loop = loop = g_main_loop_new(NULL,FALSEg_main_loop_new(NULL,FALSE); ); /創(chuàng)創(chuàng)建管道和建管道和組組件件pipeline = pipeline = gst_pipeline_new(audiogst_pipeline_new(audio-player);-player);source = source = gst_element_factory_make

8、(filesrc,filegst_element_factory_make(filesrc,file-source);-source);decoder = decoder = gst_element_factory_make(mad,madgst_element_factory_make(mad,mad-decoder);-decoder);sink = sink = gst_element_factory_make(autoaudiosink,audiogst_element_factory_make(autoaudiosink,audio-output);-output);if(!pipe

9、line|!source|!decoder|!sinkif(!pipeline|!source|!decoder|!sink) )g_printerr(Oneg_printerr(One element could not be element could not be created.Exiting.ncreated.Exiting.n););return;return; /設(shè)設(shè)置置sourcesource的的location location 參數(shù)參數(shù)。即文件地址。即文件地址. .g_object_set(G_OBJECT(source),locationg_object_set(G_OB

10、JECT(source),location, , filename,NULLfilename,NULL); );/得到管道的消息得到管道的消息總線總線bus = bus = gst_pipeline_get_bus(GST_PIPELINE(pipelinegst_pipeline_get_bus(GST_PIPELINE(pipeline););/添加消息添加消息監(jiān)視監(jiān)視器器GStreamer簡(jiǎn)介gst_bus_add_watch(bus,bus_call,loopgst_bus_add_watch(bus,bus_call,loop); );gst_object_unref(busgst_

11、object_unref(bus); );/把把組組件添加到管道中件添加到管道中. .管道是一管道是一個(gè)個(gè)特殊的特殊的組組件,可以更好的件,可以更好的讓數(shù)讓數(shù)據(jù)流據(jù)流動(dòng)動(dòng)gst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULLgst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULL); );/依次依次連連接接組組件件gst_element_link_many(source,decoder,sink,NULLgst_element_link_many(source,deco

12、der,sink,NULL); );gst_element_set_state(pipeline,GST_STATE_PLAYINGgst_element_set_state(pipeline,GST_STATE_PLAYING); );/每隔每隔10001000毫秒,更新一次毫秒,更新一次滾動(dòng)條滾動(dòng)條的位置的位置g_timeout_addg_timeout_add (1000, ( (1000, (GSourceFuncGSourceFunc) ) cb_set_positioncb_set_position, NULL);, NULL);/開(kāi)開(kāi)始循始循環(huán)環(huán)g_main_loop_run(l

13、oopg_main_loop_run(loop); );gst_element_set_state(pipeline,GST_STATE_NULLgst_element_set_state(pipeline,GST_STATE_NULL); );gst_object_unref(GST_OBJECT(pipelinegst_object_unref(GST_OBJECT(pipeline););為為了了簡(jiǎn)簡(jiǎn)化我化我們們必必須編寫(xiě)須編寫(xiě)的代的代碼碼,我,我們將們將利用由利用由GStreamerGStreamer 0.10 0.10提供的一提供的一個(gè)個(gè)被被稱(chēng)為稱(chēng)為playbinplaybin的便利

14、元素。的便利元素。這這是一是一個(gè)個(gè)高高級(jí)級(jí)元素,元素,它實(shí)際它實(shí)際上是一上是一個(gè)預(yù)個(gè)預(yù)建立的管道。通建立的管道。通過(guò)過(guò)使用使用GStreamerGStreamer的文件的文件類(lèi)類(lèi)型型檢測(cè)檢測(cè)功能,功能,它它可以可以從從任何指定的任何指定的URIURI讀讀取取數(shù)數(shù)據(jù),據(jù),并并確定合適的解確定合適的解碼碼器和器和輸輸出接收器出接收器來(lái)來(lái)正正確地播放確地播放它它。在本例中,。在本例中,這這意味著意味著它它可以可以識(shí)別識(shí)別和正確地解和正確地解碼碼在在GStreamerGStreamer中有相中有相應(yīng)插應(yīng)插件的任何音件的任何音頻頻文件文件 (你你可以通可以通過(guò)過(guò)在在終終端上端上運(yùn)運(yùn)行命令行命令gst-i

15、nspect-0.10gst-inspect-0.10來(lái)來(lái)列出列出 GStreamer0.10GStreamer0.10中的所有中的所有插插件)。件)。/建立建立playbinplaybin對(duì)對(duì)象象GstElementGstElement * *play=play=gst_element_factory_make(“playbingst_element_factory_make(“playbin”, “play”);”, “play”);/設(shè)設(shè)置打置打開(kāi)開(kāi)文件文件g_object_set(G_OBJECT(playg_object_set(G_OBJECT(play), “), “uri”,u

16、ri,NULLuri”,uri,NULL); );/增加回增加回調(diào)調(diào)函函數(shù)數(shù)gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULLgst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULL); );/設(shè)設(shè)置播放、置播放、暫暫停和停止停和停止?fàn)顟B(tài)狀態(tài)。gst_element_set_state(playgst_element_set_state(play, GST_STATE_PLAYING);, GST_ST

17、ATE_PLAYING);gst_element_set_state(playgst_element_set_state(play, GST_STATE_PAUSED);, GST_STATE_PAUSED);gst_element_set_state(playgst_element_set_state(play, GST_STATE_NULL);, GST_STATE_NULL);這樣這樣就可以控件就可以控件Mp3Mp3文件的播放了。文件的播放了。界面設(shè)計(jì) 主窗口gst_bus_add_watch(bus,bus_call,loopgst_bus_add_watch(bus,bus_call

18、,loop); );gst_object_unref(busgst_object_unref(bus); );/把把組組件添加到管道中件添加到管道中. .管道是一管道是一個(gè)個(gè)特殊的特殊的組組件,可以更好的件,可以更好的讓數(shù)讓數(shù)據(jù)流據(jù)流動(dòng)動(dòng)gst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULLgst_bin_add_many(GST_BIN(pipeline),source,decoder,sink,NULL); );/依次依次連連接接組組件件gst_element_link_many(source,decoder,sink,NUL

19、Lgst_element_link_many(source,decoder,sink,NULL); );gst_element_set_state(pipeline,GST_STATE_PLAYINGgst_element_set_state(pipeline,GST_STATE_PLAYING); );/每隔每隔10001000毫秒,更新一次毫秒,更新一次滾動(dòng)條滾動(dòng)條的位置的位置g_timeout_addg_timeout_add (1000, ( (1000, (GSourceFuncGSourceFunc) ) cb_set_positioncb_set_position, NULL);

20、, NULL);/開(kāi)開(kāi)始循始循環(huán)環(huán)g_main_loop_run(loopg_main_loop_run(loop); );gst_element_set_state(pipeline,GST_STATE_NULLgst_element_set_state(pipeline,GST_STATE_NULL); );gst_object_unref(GST_OBJECT(pipelinegst_object_unref(GST_OBJECT(pipeline););為為了了簡(jiǎn)簡(jiǎn)化我化我們們必必須編寫(xiě)須編寫(xiě)的代的代碼碼,我,我們將們將利用由利用由GStreamerGStreamer 0.10 0.1

21、0提供的一提供的一個(gè)個(gè)被被稱(chēng)為稱(chēng)為playbinplaybin的便利元素。的便利元素。這這是一是一個(gè)個(gè)高高級(jí)級(jí)元素,元素,它實(shí)際它實(shí)際上是一上是一個(gè)預(yù)個(gè)預(yù)建立的管道。通建立的管道。通過(guò)過(guò)使用使用GStreamerGStreamer的文件的文件類(lèi)類(lèi)型型檢測(cè)檢測(cè)功能,功能,它它可以可以從從任何指定的任何指定的URIURI讀讀取取數(shù)數(shù)據(jù),據(jù),并并確定合適的解確定合適的解碼碼器和器和輸輸出接收器出接收器來(lái)來(lái)正正確地播放確地播放它它。在本例中,。在本例中,這這意味著意味著它它可以可以識(shí)別識(shí)別和正確地解和正確地解碼碼在在GStreamerGStreamer中有相中有相應(yīng)插應(yīng)插件的任何音件的任何音頻頻文件文

22、件 (你你可以通可以通過(guò)過(guò)在在終終端上端上運(yùn)運(yùn)行命令行命令gst-inspect-0.10gst-inspect-0.10來(lái)來(lái)列出列出 GStreamer0.10GStreamer0.10中的所有中的所有插插件)。件)。/建立建立playbinplaybin對(duì)對(duì)象象GstElementGstElement * *play=play=gst_element_factory_make(“playbingst_element_factory_make(“playbin”, “play”);”, “play”);/設(shè)設(shè)置打置打開(kāi)開(kāi)文件文件g_object_set(G_OBJECT(playg_obje

23、ct_set(G_OBJECT(play), “), “uri”,uri,NULLuri”,uri,NULL); );/增加回增加回調(diào)調(diào)函函數(shù)數(shù)gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULLgst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULL); );/設(shè)設(shè)置播放、置播放、暫暫停和停止停和停止?fàn)顟B(tài)狀態(tài)。gst_element_set_state(playgst_element_set_state

24、(play, GST_STATE_PLAYING);, GST_STATE_PLAYING);gst_element_set_state(playgst_element_set_state(play, GST_STATE_PAUSED);, GST_STATE_PAUSED);gst_element_set_state(playgst_element_set_state(play, GST_STATE_NULL);, GST_STATE_NULL);這樣這樣就可以控件就可以控件Mp3Mp3文件的播放了。文件的播放了。代碼設(shè)計(jì) 支持網(wǎng)站:本講大綱:建立工程文件建立工程文件 主程序設(shè)計(jì)主程序設(shè)計(jì)

25、生成生成playbinplaybin對(duì)對(duì)象象 打開(kāi)文件打開(kāi)文件 播放播放Mp3Mp3 暫停播放暫停播放 停止播放停止播放 界面更新界面更新 播放控制播放控制 建立工程文件打開(kāi)打開(kāi)eclipseeclipse集成開(kāi)發(fā)環(huán)境,新建一個(gè)集成開(kāi)發(fā)環(huán)境,新建一個(gè)linuxlinux GCC GCC項(xiàng)目,項(xiàng)目名稱(chēng)為項(xiàng)目,項(xiàng)目名稱(chēng)為Mp3Mp3。設(shè)置項(xiàng)目的編譯鏈接參數(shù),使該項(xiàng)目能夠運(yùn)行設(shè)置項(xiàng)目的編譯鏈接參數(shù),使該項(xiàng)目能夠運(yùn)行g(shù)tkgtk和和gstgst。如圖如圖20-420-4中中, ,選擇選擇C/C/C+SettingsC+Settings。在在GCC C CompilerGCC C Compiler中選擇

26、中選擇MiscellaneousMiscellaneous,在,在Other flagsOther flags中加入中加入 pkg-configpkg-config cflagscflags gtk+-2.0 gstreamer-0.10 gtk+-2.0 gstreamer-0.10在在GCC C LinkerGCC C Linker中選擇中選擇MiscellaneousMiscellaneous,在,在Linker flagsLinker flags中加入中加入 pkg-configpkg-config libslibs gtk+-2.0 gstreamer-0.10 gtk+-2.0 g

27、streamer-0.10在在GCC C CompilerGCC C Compiler中選擇中選擇includeinclude,在,在Include Paths(-L)Include Paths(-L)中加入中加入 “usr/include/gtk-2.0/gtk”usr/include/gtk-2.0/gtk”和和“usr/include/gstreamer-0.10”usr/include/gstreamer-0.10”主程序設(shè)計(jì)主程序的主要功能是加載主程序的主要功能是加載gladeglade界面,設(shè)置各信號(hào)響應(yīng)函數(shù)。界面,設(shè)置各信號(hào)響應(yīng)函數(shù)。#include Mp3.h#include

28、Mp3.hintint main(intmain(int argcargc, char , char * *argvargv) GtkBuilderGtkBuilder * *builder;builder;gtk_init(&argcgtk_init(&argc, &, &argvargv); );/初始化初始化gtkgtk環(huán)環(huán)境境gst_init(&argcgst_init(&argc, &, &argvargv); ); /初始化初始化gstgst環(huán)環(huán)境境builder= builder= gtk_builder_newgtk_builder_new();/();/創(chuàng)創(chuàng)建建GtkBuil

29、derGtkBuilder對(duì)對(duì)像像gtk_builder_add_from_file(buildergtk_builder_add_from_file(builder, Mp3.glade, NULL);, Mp3.glade, NULL);加加載載gladeglade文件文件main_windowmain_window = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , MainWindowMainWindow);/);/加加載載主窗口主窗口/加加載載各各組組件件p

30、lay_buttonplay_button = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , play_buttonplay_button););pause_buttonpause_button = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , pause_buttonpause_button););stop_buttonstop_but

31、ton = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , stop_buttonstop_button););open_fileopen_file = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , open_fileopen_file););status_labelstatus_label = = GTK_WIDGET(gtk_build

32、er_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , status_labelstatus_label););time_labeltime_label = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , time_labeltime_label););artist_labelartist_label = = GTK_WIDGET(gtk_builder_get_object(builderG

33、TK_WIDGET(gtk_builder_get_object(builder, , artist_labelartist_label););title_labeltitle_label = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_get_object(builder, , title_labeltitle_label););seek_scaleseek_scale = = GTK_WIDGET(gtk_builder_get_object(builderGTK_WIDGET(gtk_builder_

34、get_object(builder, , seek_scaleseek_scale););/設(shè)設(shè)置滑置滑塊組塊組件的起止范件的起止范圍圍gtk_range_set_adjustment(GTK_SCALE(seek_scalegtk_range_set_adjustment(GTK_SCALE(seek_scale), ),GTK_ADJUSTMENT(gtk_adjustment_new(0,0,100,1,1,0.1);GTK_ADJUSTMENT(gtk_adjustment_new(0,0,100,1,1,0.1);/播放、播放、暫暫停、停止初始停、停止初始狀態(tài)狀態(tài)不可用不可用 gt

35、k_widget_set_sensitive(GTK_WIDGET(play_buttongtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE);), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(pause_buttongtk_widget_set_sensitive(GTK_WIDGET(pause_button), FALSE);), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(stop_buttongtk_widget_set_sensitiv

36、e(GTK_WIDGET(stop_button), FALSE);), FALSE);/為為各各組組件件設(shè)設(shè)置信置信號(hào)響應(yīng)號(hào)響應(yīng)函函數(shù)數(shù)g_signal_connect(play_buttong_signal_connect(play_button, clicked, , clicked, G_CALLBACK(play_clickedG_CALLBACK(play_clicked), NULL);), NULL);g_signal_connect(pause_buttong_signal_connect(pause_button, clicked, , clicked, G_CALLBAC

37、K(pause_clickedG_CALLBACK(pause_clicked), NULL);), NULL);g_signal_connect(stop_buttong_signal_connect(stop_button, clicked, , clicked, G_CALLBACK(stop_clickedG_CALLBACK(stop_clicked), NULL);), NULL);g_signal_connect(seek_scaleg_signal_connect(seek_scale, value-changed, , value-changed, G_CALLBACK(se

38、ek_value_changedG_CALLBACK(seek_value_changed), NULL);), NULL);g_signal_connect(open_fileg_signal_connect(open_file, clicked, , clicked, G_CALLBACK(open_file_clickedG_CALLBACK(open_file_clicked), NULL);), NULL);gtk_builder_connect_signals(buildergtk_builder_connect_signals(builder, NULL);/ , NULL);/

39、 自動(dòng)關(guān)聯(lián)所有信號(hào)處理函數(shù)自動(dòng)關(guān)聯(lián)所有信號(hào)處理函數(shù)g_object_unref(G_OBJECT(builderg_object_unref(G_OBJECT(builder);/ );/ 釋放釋放builderbuilder的空間的空間gtk_widget_show_all(main_windowgtk_widget_show_all(main_window);/ );/ 顯示窗口內(nèi)所有的組件顯示窗口內(nèi)所有的組件gtk_maingtk_main();();return 0;return 0; 生成playbin對(duì)象首先在頭文件中定義一個(gè)全局的首先在頭文件中定義一個(gè)全局的GstElementG

40、stElement對(duì)象對(duì)象playplay,表示正在運(yùn)行的,表示正在運(yùn)行的Mp3Mp3組件的引用,一個(gè)組件的引用,一個(gè)Mp3Mp3定時(shí)器的引用定時(shí)器的引用timeout_sourcetimeout_source。static static GstElementGstElement* *play NULL;play NULL;static static guintguint timeout_sourcetimeout_source 0; 0;定義一個(gè)加載定義一個(gè)加載Mp3Mp3文件的函數(shù)文件的函數(shù)load_fileload_file。gbooleangboolean load_file(cons

41、tload_file(const gchargchar * *uriuri) ) if(build_gstreamer_pipeline(uri)returnif(build_gstreamer_pipeline(uri)return TRUE; TRUE; return FALSE; return FALSE; 函數(shù)函數(shù)build_gstreamer_pipelinebuild_gstreamer_pipeline() ()以一個(gè)以一個(gè)URIURI為參數(shù),并構(gòu)建為參數(shù),并構(gòu)建playbinplaybin元素,指向該元素的指針被保存在變量元素,指向該元素的指針被保存在變量playplay中中,

42、以備后用。,以備后用。static static gbooleangboolean build_gstreamer_pipeline(constbuild_gstreamer_pipeline(const gchargchar* *uriuri) ) / /* * If If thereisalreadyapipelinethereisalreadyapipeline, destroy it, destroy it* */ / if (play) if (play) gst_element_set_state(play,GST_STATE_NULLgst_element_set_state(p

43、lay,GST_STATE_NULL); ); gst_object_unref(GST_OBJECT(playgst_object_unref(GST_OBJECT(play); ); play=NULL; play=NULL; / /* *Create Create aplaybinaplaybin element element* */ / play=play=gst_element_factory_make(“playbingst_element_factory_make(“playbin”, “play”);”, “play”);if (!if (!play)returnplay)r

44、eturn FALSE; FALSE; g_object_set(G_OBJECT(playg_object_set(G_OBJECT(play), “), “uri”,uri,NULLuri”,uri,NULL); );/ /* *Connect the message Connect the message buscallbackbuscallback* */ / gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULLgst_bus_add_watch(gst_pipeline_get_bus(

45、GST_PIPELINE(play),bus_callback,NULL); );return TRUE; return TRUE; 打開(kāi)文件當(dāng)單擊打開(kāi)文件按鈕時(shí),我們將調(diào)用調(diào)用當(dāng)單擊打開(kāi)文件按鈕時(shí),我們將調(diào)用調(diào)用GtkFileChooseDialogGtkFileChooseDialog構(gòu)件,它是一個(gè)用來(lái)打開(kāi)和保存文構(gòu)件,它是一個(gè)用來(lái)打開(kāi)和保存文件的完整對(duì)話(huà)框。它還有一個(gè)模式可以用來(lái)打開(kāi)目錄,但在本例中,我們將由它獲取件的完整對(duì)話(huà)框。它還有一個(gè)模式可以用來(lái)打開(kāi)目錄,但在本例中,我們將由它獲取Mp3Mp3文件名文件名, ,調(diào)用上面的調(diào)用上面的load_file(constload_file(c

46、onst gchargchar * *uriuri) ),實(shí)現(xiàn)創(chuàng)建,實(shí)現(xiàn)創(chuàng)建GstreamerGstreamer管道。管道。static void static void open_file_clicked(GtkWidgetopen_file_clicked(GtkWidget * *widget, widget, gpointergpointer data) data) GtkWidgetGtkWidget* *file_chooserfile_chooser gtk_file_chooser_dialog_new(“OpenFilegtk_file_chooser_dialog_new(

47、“OpenFile”, ”, GTK_WINDOW(main_window),GTK_FILE_CHOOSER_ACTION_OPENGTK_WINDOW(main_window),GTK_FILE_CHOOSER_ACTION_OPEN, , GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN, GTK_STOCK_CANCEL,GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN, GTK_RESPONSE_ACCEPT,NULL); GTK_RESPONSE_ACCEPT,NULL); ( (gtk_dialog_run

48、(GTK_DIALOG(file_choosergtk_dialog_run(GTK_DIALOG(file_chooser) GTK_RESPONSE_ACCEPT) ) GTK_RESPONSE_ACCEPT) char char* *filename; filename; filename =filename =gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(file_choosergtk_file_chooser_get_uri(GTK_FILE_CHOOSER(file_chooser); ); g_signal_emit_by_name(G_OB

49、JECT(stop_buttong_signal_emit_by_name(G_OBJECT(stop_button), “clicked”); ), “clicked”); if (if (current_filenamecurrent_filename) ) g_free(current_filenameg_free(current_filename); );current_filenamecurrent_filename filename; filename; if (if (load_file(filenameload_file(filename) ) gtk_widget_set_s

50、ensitive(GTK_WIDGET(play_button),TRUEgtk_widget_set_sensitive(GTK_WIDGET(play_button),TRUE); ); gtk_widget_destroy(file_choosergtk_widget_destroy(file_chooser); ); 播放Mp3static void static void play_clicked(GtkWidgetplay_clicked(GtkWidget * *widget, widget, gpointergpointer data) data) if ( if (curre

51、nt_filenamecurrent_filename) ) if ( if (play_fileplay_file()() gtk_widget_set_sensitive(GTK_WIDGET(stop_buttongtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE);), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(pause_buttongtk_widget_set_sensitive(GTK_WIDGET(pause_button), TRUE);), TRUE); else else

52、 g_print(Failedg_print(Failed to playn); to playn); gbooleangboolean play_fileplay_file() () if (play) if (play) / /* * Start playing Start playing * */ / gst_element_set_state(playgst_element_set_state(play, GST_STATE_PLAYING);, GST_STATE_PLAYING); gtk_widget_set_sensitive(GTK_WIDGET(stop_buttongtk

53、_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE);), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(pause_buttongtk_widget_set_sensitive(GTK_WIDGET(pause_button), TRUE);), TRUE); timeout_sourcetimeout_source = g_timeout_add(200, ( = g_timeout_add(200, (GSourceFunc)update_time_callbackGSourceFunc)upda

54、te_time_callback, play);, play); return TRUE; return TRUE; return FALSE; return FALSE; gst_element_set_state(playgst_element_set_state(play, GST_STATE_ PLAYING);, GST_STATE_ PLAYING);實(shí)現(xiàn)實(shí)現(xiàn)播放的功能,播放的功能,執(zhí)執(zhí)行播放功能一定要在打行播放功能一定要在打開(kāi)開(kāi)文件功能文件功能執(zhí)執(zhí)行后,已行后,已經(jīng)經(jīng)取得了播放的文件名取得了播放的文件名時(shí)時(shí)才能才能執(zhí)執(zhí)行。在播放操作完成后,要行。在播放操作完成后,要對(duì)對(duì)按按鈕狀態(tài)

55、鈕狀態(tài)作相作相應(yīng)應(yīng)的的調(diào)調(diào)整,使初使始整,使初使始狀態(tài)狀態(tài)下不下不可用的可用的暫暫停和停止停和停止變變成可用。成可用。暫停播放static void static void pause_clicked(GtkWidgetpause_clicked(GtkWidget * *widget, widget, gpointergpointer data) data) if (play) if (play) GstStateGstState state; state;gst_element_get_state(playgst_element_get_state(play, &state, NULL,

56、-1);, &state, NULL, -1);if(stateif(state = GST_STATE_PLAYING) = GST_STATE_PLAYING)gst_element_set_state(playgst_element_set_state(play, GST_STATE_PAUSED);, GST_STATE_PAUSED);gtk_button_set_label(GTK_BUTTON(pause_buttongtk_button_set_label(GTK_BUTTON(pause_button), ), 繼續(xù)繼續(xù));); gtk_widget_set_sensitiv

57、e(GTK_WIDGET(stop_buttongtk_widget_set_sensitive(GTK_WIDGET(stop_button), FALSE);), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(play_buttongtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE);), FALSE); else else if(stateif(state = GST_STATE_PAUSED) = GST_STATE_PAUSED)gst_element_set_state(playg

58、st_element_set_state(play, GST_STATE_PLAYING);, GST_STATE_PLAYING); gtk_button_set_label(GTK_BUTTON(pause_buttongtk_button_set_label(GTK_BUTTON(pause_button), ), 暫暫停停);); gtk_widget_set_sensitive(GTK_WIDGET(stop_buttongtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE);), TRUE); gtk_widget_set_s

59、ensitive(GTK_WIDGET(play_buttongtk_widget_set_sensitive(GTK_WIDGET(play_button), TRUE);), TRUE); return ;return ; 暫停播放之后要用繼續(xù)播放功能,因此,通過(guò)狀態(tài)測(cè)試,確認(rèn)當(dāng)前是播放狀態(tài)還是暫停狀態(tài),以實(shí)現(xiàn)在兩個(gè)狀態(tài)之暫停播放之后要用繼續(xù)播放功能,因此,通過(guò)狀態(tài)測(cè)試,確認(rèn)當(dāng)前是播放狀態(tài)還是暫停狀態(tài),以實(shí)現(xiàn)在兩個(gè)狀態(tài)之間進(jìn)行切換。間進(jìn)行切換。停止播放static void static void stop_clicked(GtkWidgetstop_clicked(GtkWidget *

60、 *widget, widget, gpointergpointer data) data) / /* * Remove the timeout function Remove the timeout function * */ / if ( if (timeout_sourcetimeout_source) ) g_source_remove(timeout_sourceg_source_remove(timeout_source); ); timeout_sourcetimeout_source = 0; = 0; / /* * Stop playback and delete the p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論