C語言基于GTK+Libvlc實(shí)現(xiàn)的簡(jiǎn)易視頻播放器-(一)_第1頁
C語言基于GTK+Libvlc實(shí)現(xiàn)的簡(jiǎn)易視頻播放器-(一)_第2頁
C語言基于GTK+Libvlc實(shí)現(xiàn)的簡(jiǎn)易視頻播放器-(一)_第3頁
C語言基于GTK+Libvlc實(shí)現(xiàn)的簡(jiǎn)易視頻播放器-(一)_第4頁
C語言基于GTK+Libvlc實(shí)現(xiàn)的簡(jiǎn)易視頻播放器-(一)_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、C 語言基于 GTK+Libvlc 實(shí)現(xiàn)的簡(jiǎn)易視頻播放器小編心語:現(xiàn)下,各種視頻播放軟件層出不窮,競(jìng)爭(zhēng)也越演越烈,不知道大家有木有這個(gè)想法,小編有時(shí)在想能不能做一款屬于自己的視頻播放器呢小編特意去實(shí)驗(yàn)樓,整理出了這篇關(guān)于如何實(shí)現(xiàn)簡(jiǎn)易視頻播放器的博文。簡(jiǎn)易播放器,你值得擁有友情提示:這里只是前篇,只是一些簡(jiǎn)單的功能,其他功能將會(huì)在后篇為大家介紹一、課程說明如果你學(xué)習(xí)過之前上線的 pygtk 實(shí)現(xiàn)有道詞典的項(xiàng)目課,那應(yīng)該對(duì) gtk 的使用有一些了解了,這個(gè)項(xiàng)目課學(xué)起來會(huì)相對(duì)輕松一些。 關(guān)于 Gtk 或者說是通常的圖形應(yīng)用開發(fā)的一些基礎(chǔ)知識(shí),我們會(huì)在以后的基礎(chǔ)課程中體現(xiàn),項(xiàng)目課適合有一定基礎(chǔ)的用戶學(xué)

2、習(xí)。二、Gtk 簡(jiǎn)介GTK+ 是一種圖形用戶界面(GUI)工具包。也就是說,它是一個(gè)庫(kù)(或者,實(shí)際上是若干個(gè)密切相關(guān)的庫(kù)的集合),它支持創(chuàng)建基于 GUI 的應(yīng)用程序??梢园?GTK+ 想像成一個(gè)工具包,從這個(gè)工具包中可以找到用來創(chuàng)建 GUI 的許多已經(jīng)準(zhǔn)備好的構(gòu)造塊。最初,GTK+ 是作為另一個(gè)著名的開放源碼項(xiàng)目 GNU Image Manipulation Program (GIMP) 的副產(chǎn)品而創(chuàng)建的。在開發(fā)早期的 GIMP 版本時(shí),Peter Mattis 和 Spencer Kimball 創(chuàng)建了 GTK(它代表 GIMP Toolkit),作為 Motif 工具包的替代,后者在那個(gè)時(shí)

3、候不是免費(fèi)的。(當(dāng)這個(gè)工具包獲得了面向?qū)ο筇匦院涂蓴U(kuò)展性之后,才在名稱后面加上了一個(gè)加號(hào)。)這差不多已經(jīng) 10 年過去了。今天,在 GTK+ 的最新穩(wěn)定版本 2.8 版上(3.0 測(cè)試中),仍然在進(jìn)行許多活動(dòng),同時(shí),GIMP 無疑仍然是使用 GTK+ 的最著名的程序之一,不過它已經(jīng)不是惟一的使用 GTK+ 的程序了。已經(jīng)為GTK+ 編寫了成百上千的應(yīng)用程序,而且至少有兩個(gè)主要的桌面環(huán)境(Xfce 和GNOME)用 GTK+ 為用戶提供完整的工作環(huán)境。GTK+雖然是用 C 語言寫的,但是您可以使用你熟悉的語言來使用 GTK+,因?yàn)镚TK+已經(jīng)被綁定到幾乎所有流行的語言上,如:C+,PHP, Gu

4、ile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel使用 GTK+的優(yōu)秀應(yīng)用程序:· GIMPGNU 圖像處理程序· GNOME、XFCE 等桌面環(huán)境和大部分窗口管理器都基于 GTK+· Inkscape類似于 Illustrator、CorelDraw 的矢量圖形繪制工具· Pidgin支持多種協(xié)議(IRC、Gtalk、Yahoo Talk、MSN、QQ 等等)的聊天工具· Firefox 、Chrome兩大流行瀏覽器· .Gtk+3.0 官方 API

5、文檔 其他 Gtk 依賴庫(kù) API三、Vlc 簡(jiǎn)介1. 簡(jiǎn)介:VLC 多媒體播放器(英語:VLC media player,最初為 VideoLAN Client,是VideoLAN 計(jì)劃的開放源代碼多媒體播放器。)支持眾多音頻與視頻解碼器及文件格式,并支持 DVD 影音光盤,VCD 影音光盤及各類流 協(xié)議。它也能作為單播或多播的流服務(wù)器在 IPv4 或 IPv6 的高速網(wǎng)絡(luò)連接下使用。調(diào)用 FFmpeg 計(jì)劃的解碼器與 libdvdcss 程序庫(kù)使其有播放多 媒體文件及加密 DVD 影碟的功能。VLC 自建的動(dòng)態(tài)核心模塊,使所有的接口(interfaces)、視頻和音頻輸出(video an

6、d audio outputs)、控制(controls)、定標(biāo)器(scalers)、解碼器(codecs)、音頻/視頻濾波器(audio/video filters)包含于統(tǒng)一的模塊之內(nèi),便于使用。在播放媒體文件時(shí),無需用戶干預(yù),VLC 會(huì)根據(jù)不同的情況自行調(diào)度輸入?yún)f(xié)議(input protocol)、輸入文件的格式(input file format)、輸入轉(zhuǎn)碼器(input codec)、視頻卡功能(video card capabilities)和其他參數(shù)。VLC media player 具有跨平臺(tái)的特性,可用于 Linux、Microsoft Windows、Mac OS X、Be

7、OS、OS/2、BSD、安卓、iOS、及 Solaris。2. libvlclibvlc 是 VLC media player 使用的多媒體框架的核心引擎和擴(kuò)展編程接口,它可以幫助開發(fā)者開發(fā)廣泛的多媒體應(yīng)用libvlc 多媒體框架結(jié)構(gòu)如下:libvlc API 關(guān)系圖表如下:LibVlc 官方 API 文檔四、gtk 構(gòu)建 gtk 界面我們首先也只是布局和添加控件,之后再來實(shí)現(xiàn)業(yè)務(wù)邏輯,不多說,直接看圖, 這就是我們要先實(shí)現(xiàn)的播放器大致的界面布局,不過這個(gè)界面將不會(huì)是我們最 終要實(shí)現(xiàn)的樣子,因?yàn)檫@是使用 galde 界面設(shè)計(jì)器創(chuàng)建的布局,大家初學(xué)時(shí)最好不要直接使用 glade 來進(jìn)行布局,因?yàn)?/p>

8、它會(huì)忽略很多細(xì)節(jié)。先從手寫代碼的 方式進(jìn)行布局和添加控件,這樣有助于你更好的掌握那些控件的使用方法。1. 先了解這個(gè)布局的層次關(guān)系window|-vbox|menubar|drawingarea|hbox|hbuttonbox|playbutton|stopbutton|scale|fullscreenbutton2. 實(shí)現(xiàn)這個(gè)布局的代碼如下:/filename:gui.c#include <gtk/gtk.h>#include <gdk/gdkx.h>#include<glib.h>#define BORDER_WIDTH 6int main(int ar

9、gc, char* argv)GtkWidget*window,*vbox,*hbox,*menubar,*filemenu,*fileitem,*filemenu_openitem,*hbuttonbox,*player_widget,*stop_button,*full_screen_button,*playpause_button,*process_scale,*play_icon_image,*pause_icon_image,*stop_icon_image; GtkAdjustment *process_adjuest;/ 每個(gè) gtk 程序都必須要有的,兩個(gè)參數(shù)對(duì)應(yīng) mian 函

10、數(shù)的兩個(gè)參數(shù),用于在命令行執(zhí)行程序時(shí)傳遞并解析參數(shù)gtk_init(&argc, &argv);/ 創(chuàng)建一個(gè) window 并完成初始化,如設(shè)置為頂層窗口,寬度和高度,標(biāo)題等,并綁定 destory 信號(hào),以便在關(guān)閉 gtk 窗口后程序能完全退出window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_default_size(GTK_WINDOW(window), 400, 300); g_signal_connect(window, "destroy", G_CALLBACK(gtk_mai

11、n_quit),NULL);gtk_container_set_border_width (GTK_CONTAINER (window), 0); gtk_window_set_title(GTK_WINDOW(window), "GTK+ libVLC Demo");/創(chuàng)建一個(gè)方向垂直間距為 0 的 box 容器,并添加到前面創(chuàng)建的 window 中vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(window), vbox);/創(chuàng)建一個(gè) menubar 和兩個(gè)

12、 menuitem 分別為菜單中的“文件”和“打開”, 由于它們?yōu)樯舷录?jí)菜單關(guān)系,/所以需要單獨(dú)一個(gè) menu 來放置"open_menu_item",也就是代碼中的filemenu_openitemmenubar = gtk_menu_bar_new();fileitem = gtk_menu_item_new_with_label ("File"); filemenu_openitem = gtk_menu_item_new_with_label("Open");filemenu = gtk_menu_new(); gtk_men

13、u_shell_append(GTK_MENU_SHELL(filemenu),filemenu_openitem);/ 將 filemenu 設(shè)置為上一級(jí) fileitem 的子菜單,然后將 fileitem 添加進(jìn)menubar,最后將 menubar 放置進(jìn) vboxgtk_menu_item_set_submenu(GTK_MENU_ITEM(fileitem), filemenu); gtk_menu_shell_append(GTK_MENU_SHELL(menubar), fileitem); gtk_box_pack_start(GTK_BOX(vbox), menubar,

14、FALSE, FALSE, 0);/創(chuàng)建一個(gè) draw_area 控件,用做視頻播放顯示區(qū)域,并放置進(jìn) vbox player_widget = gtk_drawing_area_new(); gtk_box_pack_start(GTK_BOX(vbox), player_widget, TRUE, TRUE, 0);/創(chuàng)建一個(gè)hbox 作為vbox 的子容器,一個(gè) hbuttonbox 作為hbox 的子容器, hbuttonbox 用于放置兩個(gè) button,/ 再將一個(gè) scale(滾動(dòng)條,用作視頻播放進(jìn)度條,原本的 process 控件不能拖動(dòng))添加進(jìn) hbox,最后將 hbox 放

15、置進(jìn)最外面的 vboxhbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); hbuttonbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);gtk_container_set_border_width(GTK_CONTAINER(hbuttonbox), BORDER_WIDTH);gtk_button_box_set_layout(GTK_BUTTON_BOX(hbuttonbox), GTK_BUTTONBOX_START);playpause_button = gtk_button_n

16、ew_from_icon_name("media-playback-start", GTK_ICON_SIZE_BUTTON);stop_button = gtk_button_new_from_icon_name("media-playback-stop", GTK_ICON_SIZE_BUTTON);gtk_box_pack_start(GTK_BOX(hbuttonbox), playpause_button, FALSE, FALSE, 0);gtk_box_pack_start(GTK_BOX(hbuttonbox), stop_button,

17、 FALSE, FALSE,0);gtk_box_pack_start(GTK_BOX(hbox), hbuttonbox, FALSE, FALSE, 0);/創(chuàng)建一個(gè)滾動(dòng)條,使用一個(gè)自定義的 adjust 對(duì)象初始化process_adjuest = gtk_adjustment_new(0.00, 0.00, 100.00, 1.00, 0.00,0.00);process_scale = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL,process_adjuest);gtk_box_pack_start(GTK_BOX(hbox), process_

18、scale, TRUE, TRUE, 0);gtk_scale_set_draw_value (GTK_SCALE(process_scale), FALSE);gtk_scale_set_has_origin (GTK_SCALE(process_scale), TRUE); gtk_scale_set_value_pos(GTK_SCALE(process_scale), 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0);/ 顯示所有控件,并運(yùn)行 gtk 程序gtk_widget_show_all(window); gt

19、k_main ();return 0;如果你覺得有困難可以直接下載代碼:(以下內(nèi)容是在實(shí)驗(yàn)樓網(wǎng)站的虛擬平臺(tái)上使用的,沒有使用實(shí)驗(yàn)樓的不需要下面這個(gè)步驟)$ wget er/master/gui.c3. 代碼說明:上述代碼,使用如下命令編譯和運(yùn)行:# 注意 pgk-config.那里不是單引號(hào),是反單引號(hào)$ gcc gui.c -o guipkg-config -libs -cflags gtk+-3.0$ ./gui運(yùn)行后,你將看到代碼的解釋說明,已經(jīng)盡可能在注釋中說明,代碼中一些 gtk 的 API 的使用和詳細(xì)說明,請(qǐng)參看官方 API 文檔,一些 API 的參數(shù)如果不太明確,你可以直接在代

20、碼中修改為不同的值,然后編譯并運(yùn)行代碼,觀察效果,幫助理解.五、使用 libvlc 播放媒體文件通過 gtk 中顯示1. 使用 libvlc 創(chuàng)建一個(gè)媒體播放器對(duì)象在 mian 函數(shù)中添加如下代碼:/setup vlcvlc_inst = libvlc_new(0, NULL);media_player = libvlc_media_player_new(vlc_inst); g_signal_connect(G_OBJECT(player_widget), "realize",G_CALLBACK(player_widget_on_realize), media_play

21、er);2. 使用 filechooserdialog 打開一個(gè)視頻文件首先給菜單欄中的 open 添加一個(gè)點(diǎn)擊信號(hào)處理函數(shù) on_open,注意一般信號(hào)處 理函數(shù)的命令規(guī)則就是在函數(shù)名之前加上"on_",但這不是必需的,然后在on_open 這個(gè)信號(hào)處理函數(shù)中,創(chuàng)建一個(gè) filechoosedialog,并運(yùn)行。打開文件,獲取到 uri(?)后,將其傳遞給 open_media 函數(shù),使用 vlc 打開并播放視頻文件。這里 注意,要想讓 vlc 播放的視頻顯示在窗口中還需要給之前創(chuàng)建的 draw_area 控件綁定一個(gè)信號(hào)處理函數(shù),這里面會(huì)將 vlc 的播放器窗口繪制在控

22、件中。具體實(shí)現(xiàn)代碼如下: 添加信號(hào)處理/ 添加信號(hào)處理函數(shù)g_signal_connect(filemenu_openitem, "activate", G_CALLBACK(on_open),window);處理函數(shù)實(shí)現(xiàn)/ 信號(hào)處理函數(shù) void on_open(GtkWidget *widget, gpointer data) GtkWidget *dialog;GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;dialog = gtk_file_chooser_dialog_new("ope

23、n file", GTK_WINDOW(widget), action, _("Cancel"), GTK_RESPONSE_CANCEL, _("Open"), GTK_RESPONSE_ACCEPT, NULL);if(gtk_dialog_run(GTK_DIALOG(dialog) = GTK_RESPONSE_ACCEPT) char *uri;uri = gtk_file_chooser_get_uri(GTK_FILE_CHOOSER(dialog); open_media(uri);g_free(uri);gtk_widget_

24、destroy(dialog);/ 傳入視頻文件 uri,使用 libvlc 播放視頻文件 void open_media(const char* uri) media = libvlc_media_new_location(vlc_inst, uri); libvlc_media_player_set_media(media_player, media);current_play_time = 0.0f; gtk_scale_set_value_pos(GTK_SCALE(process_scale),current_play_time/video_length*100);play(); l

25、ibvlc_media_release(media);因?yàn)槲覀兪褂昧薼ibvlc 所以上面代碼在編譯時(shí)需要加上libvlc 的編譯和鏈接選項(xiàng), 可使用 pkg-config 工具獲得比如:$ gcc -o videoplayer videoplayer.c pkg-config -cflags -libs gtk+-3.0 libvlc一切正常的話,現(xiàn)在你的播放器應(yīng)該已經(jīng)可以播放出視頻了,如果你需要一個(gè)視頻文件來測(cè)試播放效果的話,你可以使用我提供的一個(gè)視頻文件,這是一個(gè)相當(dāng)有趣的視頻,所以希望你一定要成功,然后你才能看到這個(gè)視頻的內(nèi)容。$ wgethttp:/anything-about- e

26、mo_01.flv六、實(shí)現(xiàn)簡(jiǎn)單的播放控制,暫定/播放和停止這個(gè)比較簡(jiǎn)單了,就是為播放和停止按鈕分別綁定兩個(gè)點(diǎn)擊信號(hào)處理函數(shù),并更具當(dāng)前是否為播放狀態(tài)設(shè)置按鈕顯示為播放還是暫定,及實(shí)現(xiàn)視頻的暫定和繼續(xù)播放具體代碼如下:同樣先添加信號(hào)處理:(略)處理函數(shù)實(shí)現(xiàn)/ 使用 libvlc 傳入當(dāng)前的播放器對(duì)象,獲取播放狀態(tài) void on_playpause(GtkWidget *widget, gpointer data) if(libvlc_media_player_is_playing(media_player) = 1) pause_player();else play();void on_sto

27、p(GtkWidget *widget, gpointer data) pause_player();libvlc_media_player_stop(media_player);/ play 函數(shù)開始播放視頻,并將播放按鈕的圖標(biāo)換成表示暫定的圖標(biāo) void play(void) libvlc_media_player_play(media_player); pause_icon_image =gtk_image_new_from_icon_name("media-playback-pause",GTK_ICON_SIZE_BUTTON);gtk_button_set_im

28、age(GTK_BUTTON(playpause_button), pause_icon_image);void pause_player(void) libvlc_media_player_pause(media_player);play_icon_image = gtk_image_new_from_icon_name("media-playback-start", GTK_ICON_SIZE_BUTTON);gtk_button_set_image(GTK_BUTTON(playpause_button), play_icon_image);七、實(shí)現(xiàn)播放進(jìn)度顯示和拖動(dòng)

29、進(jìn)度條跳轉(zhuǎn)1. 視頻播放進(jìn)度的顯示要顯示播放進(jìn)度,可以用兩種方式,第一種呢,自定義一個(gè)信號(hào)每當(dāng) vlc 的播放進(jìn)度發(fā)生變化時(shí)就發(fā)送這個(gè)信號(hào),然后將滾動(dòng)條綁定該信號(hào),在該信號(hào)的信 號(hào)處理函數(shù)中獲取 vlc 播放進(jìn)度,并設(shè)置為滾動(dòng)條的值;另一種是添加一個(gè)定時(shí)器, 每隔一個(gè)時(shí)間比如 0.5s 去獲取 vlc 的播放進(jìn)度,使用之前創(chuàng)建滾動(dòng)條是 自定義的一個(gè) GtkAdjuestment 對(duì)象了設(shè)置滾動(dòng)條的進(jìn)度。前一種方法比較復(fù)雜,這里我們使用后一種具體代碼如下:在 open_media 函數(shù)中添加定時(shí)器/ 表示每隔 500ms 會(huì)調(diào)用_update_scale 函數(shù),并將 process_scale

30、作為數(shù)據(jù)對(duì)象傳入g_timeout_add(500,_update_scale,process_scale);_update_scale 函數(shù)實(shí)現(xiàn)/ 該函數(shù)為一個(gè)GSourceFunc函數(shù)類型,要求必須要有返回值,返回類型為gboolean,/ 如要下次繼續(xù)執(zhí)行該定時(shí)器,須返回G_SOURCE_CONTINUE,否則返回G_SOURCE_REMOVEgboolean _update_scale(gpointer data)/ 獲取當(dāng)前打開視頻的長(zhǎng)度,時(shí)間單位為 msvideo_length = libvlc_media_player_get_length(media_player); curr

31、ent_play_time = libvlc_media_player_get_time(media_player);gtk_adjustment_set_value(process_adjuest,current_play_time/video_leng th*100);return G_SOURCE_CONTINUE;2. 實(shí)現(xiàn)拖動(dòng)進(jìn)度條跳轉(zhuǎn)這個(gè)功能可以給 scale 添加一個(gè) value_changed 信號(hào)處理函數(shù)就可以實(shí)現(xiàn),只是這里有個(gè)小問題就是,如果直接這樣實(shí)現(xiàn)的話,會(huì)跟上面的進(jìn)度顯示發(fā)生點(diǎn)小沖突,以為上面的進(jìn)度更新也會(huì)觸發(fā)這里的信號(hào)處理函數(shù),導(dǎo)致視頻一直在那來回卡動(dòng)無法正常播放,這里我們可以在更新進(jìn)度條是使用臨時(shí)阻塞value_changed 信號(hào)的方式避免這個(gè)問題具體代碼如下: 添加信號(hào)處理(略)處理函數(shù)實(shí)現(xiàn)/ 通過adjuest

溫馨提示

  • 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. 人人文庫(kù)網(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)論