在(Linux)ubuntu下通过GTK调用libvlc开发视频播放器
一、项目介绍
本项目实现了一个基于GTK和libvlc的视频播放器。使用GTK创建GUI界面,使用libvlc播放视频。用户可以通过选择视频文件,然后启动播放器来观看视频。
二、VLC介绍
VLC是一款自由、开放源代码的跨平台媒体播放器,支持播放几乎所有常见的音频和视频格式。最初于2001年由法国学生开发,现在已经成为了一个非常受欢迎的媒体播放器,在Windows、macOS、Linux等多个操作系统上都可用。
libvlc是VLC media player使用的核心库之一。提供了一组应用程序接口(API),可以让开发人员轻松地将类似于VLC的媒体播放功能嵌入到他们自己的应用程序中。libvlc可以与多种编程语言和框架(如C、C++、Python、Java、.NET等)集成,因此被广泛应用于各种媒体相关的项目中。
VLC是一个独立的媒体播放器软件,而libvlc是VLC media player使用的核心库之一,可以方便地嵌入到其他应用程序中,以实现类似于VLC的媒体播放功能。
VLC软件下载(3.X) :https://www.videolan.org/vlc/
libVLC最新4.0官网: https://nightlies.videolan.org/
三、GTK介绍
文档学习地址:https://www.gtk.org/docs/
官网地址:https://www.gtk.org/
GTK是一种开源的跨平台图形用户界面(GUI)工具包。最初是为GNU计划设计的,现在被广泛地用于Linux和其他Unix-like操作系统的各种应用程序中。GTK提供了一组用于创建图形用户界面的功能库,包括窗口、按钮、标签、文本输入框等控件,以及用于渲染这些控件的绘图引擎。GTK还支持国际化和主题定制,可以让开发者创建符合用户期望和风格的应用程序界面。
在 Ubuntu 中安装最新的 GTK 依赖库的命令:
sudo apt-get update
sudo apt-get install libgtk-3-dev
这个命令将会安装 GTK3 库的开发文件和依赖库。如果需要在程序中使用 GTK2 库,则需要安装 libgtk2.0-dev 包。除此之外,还可以安装一些其他的GTK扩展包,如GStreamer、WebKit 等。
如果要编译一个基于 GTK 的程序,可以使用 gcc 或 g++ 来进行编译,同时需要链接 GTK 库。假设源代码文件为 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 程序时需要的参数。
四、设计思路
通过GTK调用libvlc来实现视频播放器,需要执行以下步骤:
(1)下载和安装libvlc和相关依赖库,可以使用apt-get或者源码编译的方式安装。
sudo apt-get update
sudo apt-get install libvlc-dev libgtk-3-dev
libvlc-dev 是 libvlc 的开发库,包括头文件和链接库;libgtk-3-dev 是 GTK 库的开发库,也包括头文件和链接库。通过安装这两个开发库,就可以在 Ubuntu 下进行开发基于 GTK 和 libvlc 的视频播放器了。
(2)在GTK程序中引入libvlc的头文件和库文件,以及GTK的头文件和库文件:
#include <gtk/gtk.h>
#include <vlc/vlc.h>
(3)创建GTK窗口和控件:
GtkWidget *window;
GtkWidget *video_widget;
GtkBuilder *builder;
GtkBuilder用于动态加载UI文件,可以通过glade工具创建UI文件,然后在程序中使用GtkBuilder加载UI文件。video_widget是用于显示视频的GTK控件。
(4)初始化libvlc,并创建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()函数创建一个libvlc_media对象,用于表示要播放的视频文件。第四行代码使用libvlc_media_player_new_from_media()函数创建一个libvlc_media_player对象,用于播放视频。第五行代码使用libvlc_media_player_set_xwindow()函数将video_widget的XID绑定到libvlc_media_player对象中,从而能够将视频显示在video_widget中。第六行代码使用libvlc_media_player_play()函数开始播放视频。
(5)在GTK窗口中添加视频控件,并启动GTK主循环:
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主循环。
五、完整的设计代码
【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工具创建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>
- 点赞
- 收藏
- 关注作者
评论(0)