0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

在(Linux)ubuntu下通過(guò)GTK調(diào)用libvlc開發(fā)視頻播放器

DS小龍哥-嵌入式技術(shù) ? 來(lái)源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-06-01 15:42 ? 次閱讀

一、項(xiàng)目介紹

本項(xiàng)目實(shí)現(xiàn)了一個(gè)基于GTK和libvlc的視頻播放器。使用GTK創(chuàng)建GUI界面,使用libvlc播放視頻。用戶可以通過(guò)選擇視頻文件,然后啟動(dòng)播放器來(lái)觀看視頻。

image-20230601113711114

image-20230601113645550

二、VLC介紹

VLC是一款自由、開放源代碼的跨平臺(tái)媒體播放器,支持播放幾乎所有常見的音頻和視頻格式。最初于2001年由法國(guó)學(xué)生開發(fā),現(xiàn)在已經(jīng)成為了一個(gè)非常受歡迎的媒體播放器,在Windows、macOS、Linux等多個(gè)操作系統(tǒng)上都可用。

libvlc是VLC media player使用的核心庫(kù)之一。提供了一組應(yīng)用程序接口(API),可以讓開發(fā)人員輕松地將類似于VLC的媒體播放功能嵌入到他們自己的應(yīng)用程序中。libvlc可以與多種編程語(yǔ)言和框架(如C、C++Python、Java、.NET等)集成,因此被廣泛應(yīng)用于各種媒體相關(guān)的項(xiàng)目中。

VLC是一個(gè)獨(dú)立的媒體播放器軟件,而libvlc是VLC media player使用的核心庫(kù)之一,可以方便地嵌入到其他應(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是一種開源的跨平臺(tái)圖形用戶界面(GUI)工具包。最初是為GNU計(jì)劃設(shè)計(jì)的,現(xiàn)在被廣泛地用于Linux和其他Unix-like操作系統(tǒng)的各種應(yīng)用程序中。GTK提供了一組用于創(chuàng)建圖形用戶界面的功能庫(kù),包括窗口、按鈕、標(biāo)簽、文本輸入框等控件,以及用于渲染這些控件的繪圖引擎。GTK還支持國(guó)際化和主題定制,可以讓開發(fā)者創(chuàng)建符合用戶期望和風(fēng)格的應(yīng)用程序界面。

在 Ubuntu 中安裝最新的 GTK 依賴庫(kù)的命令:

sudo apt-get update
 sudo apt-get install libgtk-3-dev

這個(gè)命令將會(huì)安裝 GTK3 庫(kù)的開發(fā)文件和依賴庫(kù)。如果需要在程序中使用 GTK2 庫(kù),則需要安裝 libgtk2.0-dev 包。除此之外,還可以安裝一些其他的GTK擴(kuò)展包,如GStreamer、WebKit 等。

如果要編譯一個(gè)基于 GTK 的程序,可以使用 gcc 或 g++ 來(lái)進(jìn)行編譯,同時(shí)需要鏈接 GTK 庫(kù)。假設(shè)源代碼文件為 example.c,編譯命令可以如下:

gcc -o example example.c `pkg-config --cflags --libs gtk+-3.0`

其中,pkg-config 是一個(gè)用來(lái)管理編譯時(shí)的依賴庫(kù)的工具。--cflags 和 --libs 分別是輸出 GTK 庫(kù)的頭文件路徑和鏈接庫(kù)路徑,包含了命令行返回的路徑。pkg-config --cflags --libs gtk+-3.0` 就是獲取編譯 GTK 程序時(shí)需要的參數(shù)。

四、設(shè)計(jì)思路

通過(guò)GTK調(diào)用libvlc來(lái)實(shí)現(xiàn)視頻播放器,需要執(zhí)行以下步驟:

(1)下載和安裝libvlc和相關(guān)依賴庫(kù),可以使用apt-get或者源碼編譯的方式安裝。

sudo apt-get update
 sudo apt-get install libvlc-dev libgtk-3-dev

libvlc-dev 是 libvlc 的開發(fā)庫(kù),包括頭文件和鏈接庫(kù);libgtk-3-dev 是 GTK 庫(kù)的開發(fā)庫(kù),也包括頭文件和鏈接庫(kù)。通過(guò)安裝這兩個(gè)開發(fā)庫(kù),就可以在 Ubuntu 下進(jìn)行開發(fā)基于 GTK 和 libvlc 的視頻播放器了。

(2)在GTK程序中引入libvlc的頭文件和庫(kù)文件,以及GTK的頭文件和庫(kù)文件:

#include < gtk/gtk.h >
 #include < vlc/vlc.h >

(3)創(chuàng)建GTK窗口和控件:

GtkWidget *window;
 GtkWidget *video_widget;
 GtkBuilder *builder;

GtkBuilder用于動(dòng)態(tài)加載UI文件,可以通過(guò)glade工具創(chuàng)建UI文件,然后在程序中使用GtkBuilder加載UI文件。video_widget是用于顯示視頻的GTK控件。

(4)初始化libvlc,并創(chuàng)建libvlc_media_player對(duì)象和libvlc_media對(duì)象:

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)建一個(gè)libvlc_media對(duì)象,用于表示要播放的視頻文件。第四行代碼使用libvlc_media_player_new_from_media()函數(shù)創(chuàng)建一個(gè)libvlc_media_player對(duì)象,用于播放視頻。第五行代碼使用libvlc_media_player_set_xwindow()函數(shù)將video_widget的XID綁定到libvlc_media_player對(duì)象中,從而能夠?qū)⒁曨l顯示在video_widget中。第六行代碼使用libvlc_media_player_play()函數(shù)開始播放視頻。

(5)在GTK窗口中添加視頻控件,并啟動(dòng)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();

第一行代碼通過(guò)GtkBuilder加載UI文件,并獲取main_window和video_widget對(duì)象。第三行代碼將video_widget添加到window中,第四行代碼顯示窗口和控件,最后一行代碼啟動(dòng)GTK主循環(huán)。

五、完整的設(shè)計(jì)代碼

【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 >

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5059

    文章

    18973

    瀏覽量

    302006
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11207

    瀏覽量

    208713
  • Ubuntu
    +關(guān)注

    關(guān)注

    5

    文章

    559

    瀏覽量

    29501
  • GUI
    GUI
    +關(guān)注

    關(guān)注

    3

    文章

    638

    瀏覽量

    39482
  • 視頻播放器
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    11837
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    變速播放器1和2的區(qū)別

    的區(qū)別。 變速播放器通常允許用戶調(diào)整播放速度,以適應(yīng)不同的觀看或?qū)W習(xí)需求。這類播放器可能具備以下功能: 變速播放 :用戶可以根據(jù)需要加快或減慢播放
    的頭像 發(fā)表于 10-14 09:48 ?129次閱讀

    為什么好的播放器還要配解碼

    好的播放器之所以需要配備解碼,是因?yàn)橐纛l和視頻文件的編碼和解碼是一個(gè)復(fù)雜的過(guò)程,涉及到多種技術(shù)和標(biāo)準(zhǔn)。解碼的作用是將壓縮的音頻和視頻數(shù)據(jù)
    的頭像 發(fā)表于 09-23 18:02 ?619次閱讀

    數(shù)字播放器和解碼

    數(shù)字播放器和解碼的組合能夠提供更優(yōu)質(zhì)的音頻體驗(yàn)。數(shù)字播放器負(fù)責(zé)處理和傳輸音頻數(shù)據(jù),而解碼則負(fù)責(zé)將這些數(shù)據(jù)轉(zhuǎn)換為高質(zhì)量的模擬信號(hào)。它們的配合可以確保你聽到的音頻既清晰又真實(shí)。
    的頭像 發(fā)表于 09-06 17:35 ?729次閱讀
    數(shù)字<b class='flag-5'>播放器</b>和解碼<b class='flag-5'>器</b>

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)視頻播放器,主要包括主頁(yè)面和視頻播放頁(yè)面
    的頭像 發(fā)表于 04-24 14:52 ?746次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)視頻播放器,主要包括主界面和視頻播放界面,
    的頭像 發(fā)表于 04-23 17:25 ?620次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【音樂(lè)播放器

    使用ArkTS語(yǔ)言實(shí)現(xiàn)了一個(gè)簡(jiǎn)易的音樂(lè)播放器應(yīng)用
    的頭像 發(fā)表于 04-23 15:44 ?872次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【音樂(lè)<b class='flag-5'>播放器</b>】

    HarmonyOS開發(fā)案例:【視頻播放器

    基于video、swiper和slider組件,實(shí)現(xiàn)簡(jiǎn)單的視頻播放器,可支持海報(bào)輪播、視頻播放等功能。
    的頭像 發(fā)表于 04-22 21:06 ?409次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>視頻</b><b class='flag-5'>播放器</b>】

    【米爾-芯馳D9360商顯板試用評(píng)測(cè)】使用ffmpeg實(shí)現(xiàn)遠(yuǎn)程視頻監(jiān)控

    rtmp方式推送到easydarwin服務(wù)。 執(zhí)行命令后顯示: 4、打開vlc播放器,輸入地址:rtmp://192.168.3.180:10035/live 點(diǎn)連接后就可以實(shí)現(xiàn)觀看了: 【總結(jié)
    發(fā)表于 04-11 13:07

    為什么cycx3_uvcdcsr.c生成的代碼(GUID),視頻播放器解析出來(lái)是UYVY?

    我這里設(shè)置視頻輸入格式為RAW10 為什么cycx3_uvcdcsr.c生成的代碼(GUID),視頻播放器解析出來(lái)是UYVY
    發(fā)表于 02-29 06:07

    鴻蒙開發(fā)-視頻播放器方案

    HarmonyOS系統(tǒng)中,提供兩種視頻播放開發(fā)的方案: [AVPlayer]:功能較完善的音視頻播放ArkTS/JS API,集成了流媒體
    發(fā)表于 02-19 17:20

    車載播放器怎么選擇格式

    選購(gòu)車載播放器時(shí),格式選擇是一個(gè)關(guān)鍵的因素。不同的格式支持不同的音頻和視頻文件類型,因此購(gòu)買之前了解和理解各種格式是非常重要的。下面將為您詳細(xì)介紹車載播放器的格式選擇。 一、音頻格式
    的頭像 發(fā)表于 01-05 16:36 ?1572次閱讀

    基于FPGA的音頻播放器設(shè)計(jì)

    主要是音頻播放器設(shè)計(jì)不太會(huì),想問(wèn)各位大神怎么樣可以實(shí)現(xiàn)用verilog語(yǔ)言實(shí)現(xiàn)音頻播放,通過(guò)串口輸出
    發(fā)表于 01-03 13:54

    ubuntulinux的區(qū)別

    UbuntuLinux是兩個(gè)相關(guān)但不完全相同的概念,它們之間有著一些區(qū)別。開始深入討論UbuntuLinux之間的區(qū)別之前,讓我們首先
    的頭像 發(fā)表于 11-27 17:06 ?2261次閱讀

    RK3399 Ubuntu通過(guò)Python實(shí)現(xiàn)錄音和播放功能

    本文基于IDO-SBC3968Ubuntu系統(tǒng)通過(guò)Python腳本實(shí)現(xiàn)錄音和播放功能。IDO-SBC3968采用RK3399國(guó)產(chǎn)六核64位CPU高性能處理,支持4KHDMI2.0顯示
    的頭像 發(fā)表于 11-25 08:32 ?694次閱讀
    RK3399 <b class='flag-5'>Ubuntu</b><b class='flag-5'>通過(guò)</b>Python實(shí)現(xiàn)錄音和<b class='flag-5'>播放</b>功能

    MP3播放器詳細(xì)設(shè)計(jì)方案

    簡(jiǎn)介:開發(fā)工具:keil7 主要IC:at89c51sdnd1(atmel) 說(shuō)明:mp3播放器詳細(xì)設(shè)計(jì)方案,包括電路原理圖,物料,源碼,開發(fā)文檔,芯片datasheet等。 用途:?jiǎn)涡酒琺p3的設(shè)計(jì)實(shí)現(xiàn)。
    發(fā)表于 11-15 14:36 ?7次下載
    MP3<b class='flag-5'>播放器</b>詳細(xì)設(shè)計(jì)方案