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

下載本文檔

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

文檔簡(jiǎn)介

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

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

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

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

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

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

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

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

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

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

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

12、er,sink,NULL);gst_element_set_state(pipeline,GST_STATE_PLAYING);gst_element_set_state(pipeline,GST_STATE_PLAYING);/每隔每隔10001000毫秒,更新一次毫秒,更新一次滾動(dòng)條滾動(dòng)條的位置的位置g_timeout_add (1000, (GSourceFunc) cb_set_position, NULL);g_timeout_add (1000, (GSourceFunc) cb_set_position, NULL);/開開始循始循環(huán)環(huán)g_main_loop_run(loop);

13、g_main_loop_run(loop);gst_element_set_state(pipeline,GST_STATE_NULL);gst_element_set_state(pipeline,GST_STATE_NULL);gst_object_unref(GST_OBJECT(pipeline);gst_object_unref(GST_OBJECT(pipeline);為為了了簡(jiǎn)簡(jiǎn)化我化我們們必必須編寫須編寫的代的代碼碼,我,我們將們將利用由利用由GStreamer 0.10GStreamer 0.10提供的一提供的一個(gè)個(gè)被被稱為稱為playbinplaybin的便利元素。的便利元

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

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

16、, “uri”,uri,NULL);/增加回增加回調(diào)調(diào)函函數(shù)數(shù)gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULL);gst_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(play, GST_STATE_PLAYING);gst_element_set_state(play, GST_STATE_PLAY

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

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

19、ent_link_many(source,decoder,sink,NULL);gst_element_set_state(pipeline,GST_STATE_PLAYING);gst_element_set_state(pipeline,GST_STATE_PLAYING);/每隔每隔10001000毫秒,更新一次毫秒,更新一次滾動(dòng)條滾動(dòng)條的位置的位置g_timeout_add (1000, (GSourceFunc) cb_set_position, NULL);g_timeout_add (1000, (GSourceFunc) cb_set_position, NULL);/開開始循

20、始循環(huán)環(huán)g_main_loop_run(loop);g_main_loop_run(loop);gst_element_set_state(pipeline,GST_STATE_NULL);gst_element_set_state(pipeline,GST_STATE_NULL);gst_object_unref(GST_OBJECT(pipeline);gst_object_unref(GST_OBJECT(pipeline);為為了了簡(jiǎn)簡(jiǎn)化我化我們們必必須編寫須編寫的代的代碼碼,我,我們將們將利用由利用由GStreamer 0.10GStreamer 0.10提供的一提供的一個(gè)個(gè)被被稱為

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

22、終終端上端上運(yùn)運(yùn)行命令行命令gst-inspect-0.10gst-inspect-0.10來來列出列出 GStreamer0.10GStreamer0.10中的所有中的所有插插件)。件)。/建立建立playbinplaybin對(duì)對(duì)象象GstElement GstElement * *play=gst_element_factory_make(“playbin”, “play”);play=gst_element_factory_make(“playbin”, “play”);/設(shè)設(shè)置打置打開開文件文件g_object_set(G_OBJECT(play), “uri”,uri,NULL);g

23、_object_set(G_OBJECT(play), “uri”,uri,NULL);/增加回增加回調(diào)調(diào)函函數(shù)數(shù)gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULL);gst_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(play, GST_STATE_PLAYING);gst_element_set_

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

25、in對(duì)對(duì)象象 打開文件打開文件 播放播放Mp3Mp3 暫停播放暫停播放 停止播放停止播放 界面更新界面更新 播放控制播放控制 建立工程文件打開打開eclipseeclipse集成開發(fā)環(huán)境,新建一個(gè)集成開發(fā)環(huán)境,新建一個(gè)linux GCClinux GCC項(xiàng)目,項(xiàng)目名稱為項(xiàng)目,項(xià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+SettingsC/C+Settings。在在GCC C CompilerGCC C Compiler中選擇中選擇Miscellaneous

26、Miscellaneous,在,在Other flagsOther flags中加入中加入 pkg-config cflags gtk+-2.0 gstreamer-0.10pkg-config cflags gtk+-2.0 gstreamer-0.10在在GCC C LinkerGCC C Linker中選擇中選擇MiscellaneousMiscellaneous,在,在Linker flagsLinker flags中加入中加入 pkg-config libs gtk+-2.0 gstreamer-0.10pkg-config libs gtk+-2.0 gstreamer-0.10在

27、在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 Mp3.hint main(

28、int argc, char int main(int argc, char * *argv)argv) GtkBuilder GtkBuilder * *builder;builder;gtk_init(&argc, &argv);gtk_init(&argc, &argv);/初始化初始化gtkgtk環(huán)環(huán)境境gst_init(&argc, &argv); gst_init(&argc, &argv); /初始化初始化gstgst環(huán)環(huán)境境builder= gtk_builder_new();/builder= gtk_build

29、er_new();/創(chuàng)創(chuàng)建建GtkBuilderGtkBuilder對(duì)對(duì)像像gtk_builder_add_from_file(builder, Mp3.glade, NULL);gtk_builder_add_from_file(builder, Mp3.glade, NULL);加加載載gladeglade文件文件main_window = GTK_WIDGET(gtk_builder_get_object(builder, MainWindow);/main_window = GTK_WIDGET(gtk_builder_get_object(builder, MainWindow);/

30、加加載載主窗口主窗口/加加載載各各組組件件play_button = GTK_WIDGET(gtk_builder_get_object(builder, play_button);play_button = GTK_WIDGET(gtk_builder_get_object(builder, play_button);pause_button = GTK_WIDGET(gtk_builder_get_object(builder, pause_button);pause_button = GTK_WIDGET(gtk_builder_get_object(builder, pause_but

31、ton);stop_button = GTK_WIDGET(gtk_builder_get_object(builder, stop_button);stop_button = GTK_WIDGET(gtk_builder_get_object(builder, stop_button);open_file = GTK_WIDGET(gtk_builder_get_object(builder, open_file);open_file = GTK_WIDGET(gtk_builder_get_object(builder, open_file);status_label = GTK_WIDG

32、ET(gtk_builder_get_object(builder, status_label);status_label = GTK_WIDGET(gtk_builder_get_object(builder, status_label);time_label = GTK_WIDGET(gtk_builder_get_object(builder, time_label);time_label = GTK_WIDGET(gtk_builder_get_object(builder, time_label);artist_label = GTK_WIDGET(gtk_builder_get_o

33、bject(builder, artist_label);artist_label = GTK_WIDGET(gtk_builder_get_object(builder, artist_label);title_label = GTK_WIDGET(gtk_builder_get_object(builder, title_label);title_label = GTK_WIDGET(gtk_builder_get_object(builder, title_label);seek_scale = GTK_WIDGET(gtk_builder_get_object(builder, see

34、k_scale);seek_scale = GTK_WIDGET(gtk_builder_get_object(builder, seek_scale);/設(shè)設(shè)置滑置滑塊組塊組件的起止范件的起止范圍圍gtk_range_set_adjustment(GTK_SCALE(seek_scale),gtk_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);/播放、

35、播放、暫暫停、停止初始停、停止初始狀態(tài)狀態(tài)不可用不可用 gtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE);gtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(pause_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(pause_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(sto

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

37、clicked), NULL);g_signal_connect(pause_button, clicked, G_CALLBACK(pause_clicked), NULL);g_signal_connect(stop_button, clicked, G_CALLBACK(stop_clicked), NULL);g_signal_connect(stop_button, clicked, G_CALLBACK(stop_clicked), NULL);g_signal_connect(seek_scale, value-changed, G_CALLBACK(seek_value_cha

38、nged), NULL);g_signal_connect(seek_scale, value-changed, G_CALLBACK(seek_value_changed), NULL);g_signal_connect(open_file, clicked, G_CALLBACK(open_file_clicked), NULL);g_signal_connect(open_file, clicked, G_CALLBACK(open_file_clicked), NULL);gtk_builder_connect_signals(builder, NULL);/ gtk_builder_

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

40、定義一個(gè)全局的首先在頭文件中定義一個(gè)全局的GstElementGstElement對(duì)象對(duì)象playplay,表示正在運(yùn)行的,表示正在運(yùn)行的Mp3Mp3組件的引用,一個(gè)組件的引用,一個(gè)Mp3Mp3定時(shí)器的引用定時(shí)器的引用timeout_sourcetimeout_source。static GstElementstatic GstElement* *play NULL;play NULL;static guint timeout_source 0;static guint timeout_source 0;定義一個(gè)加載定義一個(gè)加載Mp3Mp3文件的函數(shù)文件的函數(shù)load_fileload_fil

41、e。gboolean load_file(const gchar gboolean load_file(const gchar * *uri) uri) if(build_gstreamer_pipeline(uri)return TRUE; if(build_gstreamer_pipeline(uri)return TRUE; return FALSE; return FALSE; 函數(shù)函數(shù)build_gstreamer_pipeline()build_gstreamer_pipeline()以一個(gè)以一個(gè)URIURI為參數(shù),并構(gòu)建為參數(shù),并構(gòu)建playbinplaybin元素,指向該元素的

42、指針被保存在變量元素,指向該元素的指針被保存在變量playplay中中,以備后用。,以備后用。static gboolean build_gstreamer_pipeline(const gcharstatic gboolean build_gstreamer_pipeline(const gchar* *uri) uri) / /* * If thereisalreadyapipeline, destroy it If thereisalreadyapipeline, destroy it* */ / if (play) if (play) gst_element_set_state(pla

43、y,GST_STATE_NULL); gst_element_set_state(play,GST_STATE_NULL); gst_object_unref(GST_OBJECT(play); gst_object_unref(GST_OBJECT(play); play=NULL; play=NULL; / /* *Create aplaybin elementCreate aplaybin element* */ / play=gst_element_factory_make(“playbin”, “play”);play=gst_element_factory_make(“playbi

44、n”, “play”);if (!play)return FALSE; if (!play)return FALSE; g_object_set(G_OBJECT(play), “uri”,uri,NULL);g_object_set(G_OBJECT(play), “uri”,uri,NULL);/ /* *Connect the message buscallbackConnect the message buscallback* */ / gst_bus_add_watch(gst_pipeline_get_bus(GST_PIPELINE(play),bus_callback,NULL

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

46、 ,調(diào)用上面的調(diào)用上面的load_file(const gchar load_file(const gchar * *uri)uri),實(shí)現(xiàn)創(chuàng)建,實(shí)現(xiàn)創(chuàng)建GstreamerGstreamer管道。管道。static void open_file_clicked(GtkWidget static void open_file_clicked(GtkWidget * *widget, gpointer data)widget, gpointer data)GtkWidgetGtkWidget* *file_chooser gtk_file_chooser_dialog_new(“OpenFile”

47、, file_chooser gtk_file_chooser_dialog_new(“OpenFile”, GTK_WINDOW(main_window),GTK_FILE_CHOOSER_ACTION_OPEN, GTK_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_

48、RESPONSE_ACCEPT,NULL); (gtk_dialog_run(GTK_DIALOG(file_chooser) GTK_RESPONSE_ACCEPT) (gtk_dialog_run(GTK_DIALOG(file_chooser) GTK_RESPONSE_ACCEPT) char char* *filename; filename; filename =gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(file_chooser); filename =gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(fi

49、le_chooser); g_signal_emit_by_name(G_OBJECT(stop_button), “clicked”); g_signal_emit_by_name(G_OBJECT(stop_button), “clicked”); if (current_filename) g_free(current_filename);if (current_filename) g_free(current_filename);current_filename filename; current_filename filename; if (load_file(filename) i

50、f (load_file(filename) gtk_widget_set_sensitive(GTK_WIDGET(play_button),TRUE); gtk_widget_set_sensitive(GTK_WIDGET(play_button),TRUE); gtk_widget_destroy(file_chooser);gtk_widget_destroy(file_chooser); 播放Mp3static void play_clicked(GtkWidget static void play_clicked(GtkWidget * *widget, gpointer dat

51、a)widget, gpointer data) if (current_filename) if (current_filename) if (play_file() if (play_file() gtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(pause_button), TRUE); gtk_widget_set_sensitive(GT

52、K_WIDGET(pause_button), TRUE); else else g_print(Failed to playn); g_print(Failed to playn); gboolean play_file() gboolean play_file() if (play) if (play) / /* * Start playing Start playing * */ / gst_element_set_state(play, GST_STATE_PLAYING); gst_element_set_state(play, GST_STATE_PLAYING); gtk_wid

53、get_set_sensitive(GTK_WIDGET(stop_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(pause_button), TRUE); gtk_widget_set_sensitive(GTK_WIDGET(pause_button), TRUE); timeout_source = g_timeout_add(200, (GSourceFunc)update_time_callback, play);

54、 timeout_source = g_timeout_add(200, (GSourceFunc)update_time_callback, play); return TRUE; return TRUE; return FALSE; return FALSE; gst_element_set_state(play, GST_STATE_ PLAYING);gst_element_set_state(play, GST_STATE_ PLAYING);實(shí)現(xiàn)實(shí)現(xiàn)播放的功能,播放的功能,執(zhí)執(zhí)行播放功能一定要在打行播放功能一定要在打開開文件功能文件功能執(zhí)執(zhí)行后,已行后,已經(jīng)經(jīng)取得了播放的文件名取得

55、了播放的文件名時(shí)時(shí)才能才能執(zhí)執(zhí)行。在播放操作完成后,要行。在播放操作完成后,要對(duì)對(duì)按按鈕狀態(tài)鈕狀態(tài)作相作相應(yīng)應(yīng)的的調(diào)調(diào)整,使初使始整,使初使始狀態(tài)狀態(tài)下不下不可用的可用的暫暫停和停止停和停止變變成可用。成可用。暫停播放static void pause_clicked(GtkWidget static void pause_clicked(GtkWidget * *widget, gpointer data)widget, gpointer data) if (play) if (play) GstState state;GstState state;gst_element_get_state

56、(play, &state, NULL, -1);gst_element_get_state(play, &state, NULL, -1);if(state = GST_STATE_PLAYING)if(state = GST_STATE_PLAYING)gst_element_set_state(play, GST_STATE_PAUSED);gst_element_set_state(play, GST_STATE_PAUSED);gtk_button_set_label(GTK_BUTTON(pause_button), gtk_button_set_label(GTK

57、_BUTTON(pause_button), 繼續(xù)繼續(xù));); gtk_widget_set_sensitive(GTK_WIDGET(stop_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(stop_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(play_button), FALSE); else if(state = GST_STATE_PAUSED)els

58、e if(state = GST_STATE_PAUSED)gst_element_set_state(play, GST_STATE_PLAYING);gst_element_set_state(play, GST_STATE_PLAYING); gtk_button_set_label(GTK_BUTTON(pause_button), gtk_button_set_label(GTK_BUTTON(pause_button), 暫暫停停);); gtk_widget_set_sensitive(GTK_WIDGET(stop_button), TRUE); gtk_widget_set_

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

60、 stop_clicked(GtkWidget static void stop_clicked(GtkWidget * *widget, gpointer data)widget, gpointer data) / /* * Remove the timeout function Remove the timeout function * */ / if (timeout_source) g_source_remove(timeout_source); if (timeout_source) g_source_remove(timeout_source); timeout_source = 0; timeout_source = 0; / /* * Stop playback and delete the pipeli

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論