一、項(xiàng)目介紹
本項(xiàng)目實(shí)現(xiàn)了一個基于GTK和libvlc的視頻播放器。使用GTK創(chuàng)建GUI界面,使用libvlc播放視頻。用戶可以通過選擇視頻文件,然后啟動播放器來觀看視頻。
二、VLC介紹
VLC是一款自由、開放源代碼的跨平臺媒體播放器,支持播放幾乎所有常見的音頻和視頻格式。最初于2001年由法國學(xué)生開發(fā),現(xiàn)在已經(jīng)成為了一個非常受歡迎的媒體播放器,在Windows、macOS、Linux等多個操作系統(tǒng)上都可用。
libvlc是VLC media player使用的核心庫之一。提供了一組應(yīng)用程序接口(API),可以讓開發(fā)人員輕松地將類似于VLC的媒體播放功能嵌入到他們自己的應(yīng)用程序中。libvlc可以與多種編程語言和框架(如C、C++、Python、Java、.NET等)集成,因此被廣泛應(yīng)用于各種媒體相關(guān)的項(xiàng)目中。
VLC是一個獨(dú)立的媒體播放器軟件,而libvlc是VLC media player使用的核心庫之一,可以方便地嵌入到其他應(yīng)用程序中,以實(shí)現(xiàn)類似于VLC的媒體播放功能。
VLC軟件下載(3.X) :https://www.videolan.org/vlc/
libVLC最新4.0官網(wǎng): https://nightlies.videolan.org/
三、GTK介紹
文檔學(xué)習(xí)地址:https://www.gtk.org/docs/
官網(wǎng)地址:https://www.gtk.org/
GTK是一種開源的跨平臺圖形用戶界面(GUI)工具包。最初是為GNU計劃設(shè)計的,現(xiàn)在被廣泛地用于Linux和其他Unix-like操作系統(tǒng)的各種應(yīng)用程序中。GTK提供了一組用于創(chuàng)建圖形用戶界面的功能庫,包括窗口、按鈕、標(biāo)簽、文本輸入框等控件,以及用于渲染這些控件的繪圖引擎。GTK還支持國際化和主題定制,可以讓開發(fā)者創(chuàng)建符合用戶期望和風(fēng)格的應(yīng)用程序界面。
在 Ubuntu 中安裝最新的 GTK 依賴庫的命令:
sudo apt-get update
sudo apt-get install libgtk-3-dev
這個命令將會安裝 GTK3 庫的開發(fā)文件和依賴庫。如果需要在程序中使用 GTK2 庫,則需要安裝 libgtk2.0-dev 包。除此之外,還可以安裝一些其他的GTK擴(kuò)展包,如GStreamer、WebKit 等。
如果要編譯一個基于 GTK 的程序,可以使用 gcc 或 g++ 來進(jìn)行編譯,同時需要鏈接 GTK 庫。假設(shè)源代碼文件為 example.c,編譯命令可以如下:
gcc -o example example.c `pkg-config --cflags --libs gtk+-3.0`
其中,pkg-config 是一個用來管理編譯時的依賴庫的工具。--cflags 和 --libs 分別是輸出 GTK 庫的頭文件路徑和鏈接庫路徑,包含了命令行返回的路徑。
pkg-config --cflags --libs gtk+-3.0` 就是獲取編譯 GTK 程序時需要的參數(shù)。
四、設(shè)計思路
通過GTK調(diào)用libvlc來實(shí)現(xiàn)視頻播放器,需要執(zhí)行以下步驟:
(1)下載和安裝libvlc和相關(guān)依賴庫,可以使用apt-get或者源碼編譯的方式安裝。
sudo apt-get update
sudo apt-get install libvlc-dev libgtk-3-dev
libvlc-dev 是 libvlc 的開發(fā)庫,包括頭文件和鏈接庫;libgtk-3-dev 是 GTK 庫的開發(fā)庫,也包括頭文件和鏈接庫。通過安裝這兩個開發(fā)庫,就可以在 Ubuntu 下進(jìn)行開發(fā)基于 GTK 和 libvlc 的視頻播放器了。
(2)在GTK程序中引入libvlc的頭文件和庫文件,以及GTK的頭文件和庫文件:
#include < gtk/gtk.h >
#include < vlc/vlc.h >
(3)創(chuàng)建GTK窗口和控件:
GtkWidget *window;
GtkWidget *video_widget;
GtkBuilder *builder;
GtkBuilder用于動態(tài)加載UI文件,可以通過glade工具創(chuàng)建UI文件,然后在程序中使用GtkBuilder加載UI文件。video_widget是用于顯示視頻的GTK控件。
(4)初始化libvlc,并創(chuàng)建libvlc_media_player對象和libvlc_media對象:
libvlc_instance_t *vlc_instance;
libvlc_media_t *media;
libvlc_media_player_t *media_player;
// ...
vlc_instance = libvlc_new(0, NULL);
media = libvlc_media_new_path(vlc_instance, "/path/to/video.mp4");
media_player = libvlc_media_player_new_from_media(media);
libvlc_media_player_set_xwindow(media_player, GDK_WINDOW_XID(gtk_widget_get_window(video_widget)));
libvlc_media_player_play(media_player);
// ...
第三行代碼使用libvlc_media_new_path()函數(shù)創(chuàng)建一個libvlc_media對象,用于表示要播放的視頻文件。第四行代碼使用libvlc_media_player_new_from_media()函數(shù)創(chuàng)建一個libvlc_media_player對象,用于播放視頻。第五行代碼使用libvlc_media_player_set_xwindow()函數(shù)將video_widget的XID綁定到libvlc_media_player對象中,從而能夠?qū)⒁曨l顯示在video_widget中。第六行代碼使用libvlc_media_player_play()函數(shù)開始播放視頻。
(5)在GTK窗口中添加視頻控件,并啟動GTK主循環(huán):
builder = gtk_builder_new_from_file("ui.glade");
window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
video_widget = GTK_WIDGET(gtk_builder_get_object(builder, "video_widget"));
// ...
gtk_container_add(GTK_CONTAINER(window), video_widget);
gtk_widget_show_all(window);
gtk_main();
第一行代碼通過GtkBuilder加載UI文件,并獲取main_window和video_widget對象。第三行代碼將video_widget添加到window中,第四行代碼顯示窗口和控件,最后一行代碼啟動GTK主循環(huán)。
五、完整的設(shè)計代碼
【1】main.c代碼
#include < gtk/gtk.h >
#include < vlc/vlc.h >
?
int main(int argc, char *argv[])
{
GtkWidget *window;
GtkWidget *video_widget;
GtkBuilder *builder;
libvlc_instance_t *vlc_instance;
libvlc_media_t *media;
libvlc_media_player_t *media_player;
?
gtk_init(&argc, &argv);
?
builder = gtk_builder_new_from_file("ui.glade");
window = GTK_WIDGET(gtk_builder_get_object(builder, "main_window"));
video_widget = GTK_WIDGET(gtk_builder_get_object(builder, "video_widget"));
?
vlc_instance = libvlc_new(0, NULL);
media = libvlc_media_new_path(vlc_instance, "/path/to/video.mp4");
media_player = libvlc_media_player_new_from_media(media);
libvlc_media_player_set_xwindow(media_player, GDK_WINDOW_XID(gtk_widget_get_window(video_widget)));
libvlc_media_player_play(media_player);
?
gtk_container_add(GTK_CONTAINER(window), video_widget);
gtk_widget_show_all(window);
gtk_main();
?
libvlc_media_player_stop(media_player);
libvlc_media_player_release(media_player);
libvlc_release(vlc_instance);
?
return 0;
}
【2】ui.glade代碼
使用glade工具創(chuàng)建UI文件:
< ?xml version="1.0" encoding="UTF-8"? >
< !-- Generated with glade 3.22.1 -- >
< interface >
< requires lib="gtk+" version="3.20"/ >
< object class="GtkWindow" id="main_window" >
< property name="can_focus" >False< /property >
< child >
< object class="GtkDrawingArea" id="video_widget" >
< property name="can_focus" >False< /property >
< /object >
< /child >
< /object >
< /interface >
審核編輯:湯梓紅
-
嵌入式
+關(guān)注
關(guān)注
5177文章
19996瀏覽量
325128 -
Linux
+關(guān)注
關(guān)注
88文章
11579瀏覽量
217027 -
Ubuntu
+關(guān)注
關(guān)注
5文章
601瀏覽量
32578 -
GUI
+關(guān)注
關(guān)注
3文章
689瀏覽量
42499 -
視頻播放器
+關(guān)注
關(guān)注
0文章
33瀏覽量
12144
發(fā)布評論請先 登錄
音視頻開發(fā)全棧解析

如何調(diào)用mpp硬解+ffmpeg本地播放視頻,RK3576
雷卯針對香橙派Orange Pi 4 LTS開發(fā)板防雷防靜電方案

創(chuàng)通聯(lián)達(dá)助力飛傲M27革新便攜HiFi播放器體驗(yàn)
基于開源鴻蒙的視頻播放開發(fā)樣例

【EASY EAI Orin Nano開發(fā)板試用體驗(yàn)】使用Linux posix文件讀取接口和LVGL的animimg(圖像動畫)控件實(shí)現(xiàn)動畫播放以及
Made with KiCad(135):Echo - 開源的音樂播放器

恒訊科技分析:Ubuntu云服務(wù)器數(shù)據(jù)共享高效方案
Debian和Ubuntu哪個好一些?
Made with KiCad:Tangara 便攜式音樂播放器
BEM在移動端開發(fā)中的應(yīng)用案例
蛇年煥新,數(shù)字標(biāo)牌播放器點(diǎn)亮新春營銷

畢業(yè)設(shè)計競賽選題推薦 | 嵌入式Linux應(yīng)用之音樂播放器項(xiàng)目實(shí)戰(zhàn)(含文檔及源碼)

海貝R1便攜音樂播放器開箱

深妙科技 室內(nèi)外LED電源、LED屏多媒體播放器和二合一視頻處理器維修方法

評論