




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C 语言基于 GTK+Libvlc 实现的简易视频播放器小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文。简易播放器,你值得拥有友情提示:这里只是前篇,只是一些简单的功能,其他功能将会在后篇为大家介绍一、课程说明如果你学习过之前上线的 pygtk 实现有道词典的项目课,那应该对 gtk 的使用有一些了解了,这个项目课学起来会相对轻松一些。 关于 Gtk 或者说是通常的图形应用开发的一些基础知识,我们会在以后的基础课程中体现,项目课适合有一定基础的用户学
2、习。二、Gtk 简介GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以找到用来创建 GUI 的许多已经准备好的构造块。最初,GTK+ 是作为另一个著名的开放源码项目 GNU Image Manipulation Program (GIMP) 的副产品而创建的。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 创建了 GTK(它代表 GIMP Toolkit),作为 Motif 工具包的替代,后者在那个时
3、候不是免费的。(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号。)这差不多已经 10 年过去了。今天,在 GTK+ 的最新稳定版本 2.8 版上(3.0 测试中),仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过它已经不是惟一的使用 GTK+ 的程序了。已经为GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce 和GNOME)用 GTK+ 为用户提供完整的工作环境。GTK+虽然是用 C 语言写的,但是您可以使用你熟悉的语言来使用 GTK+,因为GTK+已经被绑定到几乎所有流行的语言上,如:C+,PHP, Gu
4、ile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel使用 GTK+的优秀应用程序:· GIMPGNU 图像处理程序· GNOME、XFCE 等桌面环境和大部分窗口管理器都基于 GTK+· Inkscape类似于 Illustrator、CorelDraw 的矢量图形绘制工具· Pidgin支持多种协议(IRC、Gtalk、Yahoo Talk、MSN、QQ 等等)的聊天工具· Firefox 、Chrome两大流行浏览器· .Gtk+3.0 官方 API
5、文档 其他 Gtk 依赖库 API三、Vlc 简介1. 简介:VLC 多媒体播放器(英语:VLC media player,最初为 VideoLAN Client,是VideoLAN 计划的开放源代码多媒体播放器。)支持众多音频与视频解码器及文件格式,并支持 DVD 影音光盘,VCD 影音光盘及各类流 协议。它也能作为单播或多播的流服务器在 IPv4 或 IPv6 的高速网络连接下使用。调用 FFmpeg 计划的解码器与 libdvdcss 程序库使其有播放多 媒体文件及加密 DVD 影碟的功能。VLC 自建的动态核心模块,使所有的接口(interfaces)、视频和音频输出(video an
6、d audio outputs)、控制(controls)、定标器(scalers)、解码器(codecs)、音频/视频滤波器(audio/video filters)包含于统一的模块之内,便于使用。在播放媒体文件时,无需用户干预,VLC 会根据不同的情况自行调度输入协议(input protocol)、输入文件的格式(input file format)、输入转码器(input codec)、视频卡功能(video card capabilities)和其他参数。VLC media player 具有跨平台的特性,可用于 Linux、Microsoft Windows、Mac OS X、Be
7、OS、OS/2、BSD、安卓、iOS、及 Solaris。2. libvlclibvlc 是 VLC media player 使用的多媒体框架的核心引擎和扩展编程接口,它可以帮助开发者开发广泛的多媒体应用libvlc 多媒体框架结构如下:libvlc API 关系图表如下:LibVlc 官方 API 文档四、gtk 构建 gtk 界面我们首先也只是布局和添加控件,之后再来实现业务逻辑,不多说,直接看图, 这就是我们要先实现的播放器大致的界面布局,不过这个界面将不会是我们最 终要实现的样子,因为这是使用 galde 界面设计器创建的布局,大家初学时最好不要直接使用 glade 来进行布局,因为
8、它会忽略很多细节。先从手写代码的 方式进行布局和添加控件,这样有助于你更好的掌握那些控件的使用方法。1. 先了解这个布局的层次关系window|-vbox|menubar|drawingarea|hbox|hbuttonbox|playbutton|stopbutton|scale|fullscreenbutton2. 实现这个布局的代码如下:/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;/ 每个 gtk 程序都必须要有的,两个参数对应 mian 函
10、数的两个参数,用于在命令行执行程序时传递并解析参数gtk_init(&argc, &argv);/ 创建一个 window 并完成初始化,如设置为顶层窗口,宽度和高度,标题等,并绑定 destory 信号,以便在关闭 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");/创建一个方向垂直间距为 0 的 box 容器,并添加到前面创建的 window 中vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); gtk_container_add(GTK_CONTAINER(window), vbox);/创建一个 menubar 和两个
12、 menuitem 分别为菜单中的“文件”和“打开”, 由于它们为上下级菜单关系,/所以需要单独一个 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 设置为上一级 fileitem 的子菜单,然后将 fileitem 添加进menubar,最后将 menubar 放置进 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);/创建一个 draw_area 控件,用做视频播放显示区域,并放置进 vbox player_widget = gtk_drawing_area_new(); gtk_box_pack_start(GTK_BOX(vbox), player_widget, TRUE, TRUE, 0);/创建一个hbox 作为vbox 的子容器,一个 hbuttonbox 作为hbox 的子容器, hbuttonbox 用于放置两个 button,/ 再将一个 scale(滚动条,用作视频播放进度条,原本的 process 控件不能拖动)添加进 hbox,最后将 hbox 放
15、置进最外面的 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);/创建一个滚动条,使用一个自定义的 adjust 对象初始化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);/ 显示所有控件,并运行 gtk 程序gtk_widget_show_all(window); gt
19、k_main ();return 0;如果你觉得有困难可以直接下载代码:(以下内容是在实验楼网站的虚拟平台上使用的,没有使用实验楼的不需要下面这个步骤)$ wget er/master/gui.c3. 代码说明:上述代码,使用如下命令编译和运行:# 注意 pgk-config.那里不是单引号,是反单引号$ gcc gui.c -o guipkg-config -libs -cflags gtk+-3.0$ ./gui运行后,你将看到代码的解释说明,已经尽可能在注释中说明,代码中一些 gtk 的 API 的使用和详细说明,请参看官方 API 文档,一些 API 的参数如果不太明确,你可以直接在代
20、码中修改为不同的值,然后编译并运行代码,观察效果,帮助理解.五、使用 libvlc 播放媒体文件通过 gtk 中显示1. 使用 libvlc 创建一个媒体播放器对象在 mian 函数中添加如下代码:/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 打开一个视频文件首先给菜单栏中的 open 添加一个点击信号处理函数 on_open,注意一般信号处 理函数的命令规则就是在函数名之前加上"on_",但这不是必需的,然后在on_open 这个信号处理函数中,创建一个 filechoosedialog,并运行。打开文件,获取到 uri(?)后,将其传递给 open_media 函数,使用 vlc 打开并播放视频文件。这里 注意,要想让 vlc 播放的视频显示在窗口中还需要给之前创建的 draw_area 控件绑定一个信号处理函数,这里面会将 vlc 的播放器窗口绘制在控
22、件中。具体实现代码如下: 添加信号处理/ 添加信号处理函数g_signal_connect(filemenu_openitem, "activate", G_CALLBACK(on_open),window);处理函数实现/ 信号处理函数 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);因为我们使用了libvlc 所以上面代码在编译时需要加上libvlc 的编译和链接选项, 可使用 pkg-config 工具获得比如:$ gcc -o videoplayer videoplayer.c pkg-config -cflags -libs gtk+-3.0 libvlc一切正常的话,现在你的播放器应该已经可以播放出视频了,如果你需要一个视频文件来测试播放效果的话,你可以使用我提供的一个视频文件,这是一个相当有趣的视频,所以希望你一定要成功,然后你才能看到这个视频的内容。$ wgethttp:/anything-about- e
26、mo_01.flv六、实现简单的播放控制,暂定/播放和停止这个比较简单了,就是为播放和停止按钮分别绑定两个点击信号处理函数,并更具当前是否为播放状态设置按钮显示为播放还是暂定,及实现视频的暂定和继续播放具体代码如下:同样先添加信号处理:(略)处理函数实现/ 使用 libvlc 传入当前的播放器对象,获取播放状态 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 函数开始播放视频,并将播放按钮的图标换成表示暂定的图标 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);七、实现播放进度显示和拖动
29、进度条跳转1. 视频播放进度的显示要显示播放进度,可以用两种方式,第一种呢,自定义一个信号每当 vlc 的播放进度发生变化时就发送这个信号,然后将滚动条绑定该信号,在该信号的信 号处理函数中获取 vlc 播放进度,并设置为滚动条的值;另一种是添加一个定时器, 每隔一个时间比如 0.5s 去获取 vlc 的播放进度,使用之前创建滚动条是 自定义的一个 GtkAdjuestment 对象了设置滚动条的进度。前一种方法比较复杂,这里我们使用后一种具体代码如下:在 open_media 函数中添加定时器/ 表示每隔 500ms 会调用_update_scale 函数,并将 process_scale
30、作为数据对象传入g_timeout_add(500,_update_scale,process_scale);_update_scale 函数实现/ 该函数为一个GSourceFunc函数类型,要求必须要有返回值,返回类型为gboolean,/ 如要下次继续执行该定时器,须返回G_SOURCE_CONTINUE,否则返回G_SOURCE_REMOVEgboolean _update_scale(gpointer data)/ 获取当前打开视频的长度,时间单位为 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. 实现拖动进度条跳转这个功能可以给 scale 添加一个 value_changed 信号处理函数就可以实现,只是这里有个小问题就是,如果直接这样实现的话,会跟上面的进度显示发生点小冲突,以为上面的进度更新也会触发这里的信号处理函数,导致视频一直在那来回卡动无法正常播放,这里我们可以在更新进度条是使用临时阻塞value_changed 信号的方式避免这个问题具体代码如下: 添加信号处理(略)处理函数实现/ 通过adjuest
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第2课 奇妙折纸-使用网站模块快速建站说课稿-2023-2024学年小学信息技术(信息科技)第四册河北大学版(第2版)
- 浙教版科学七上2.3 生物体的结构层次说课稿
- 一年级下学期美术教学设计(人教版(2012))
- 2025年土木工程学院试题及答案
- 第1课 枚举算法教学设计-2025-2026学年小学信息技术(信息科技)五年级下册鲁教版(信息科技)
- 2025年潜力能力测试题及答案
- 第3节 沉淀溶解平衡说课稿高中化学鲁科版2019选择性必修1 化学反应原理-鲁科版2019
- 8.2二力平衡 教学设计 -2023-2024学年人教版物理八年级下册
- 第三节 体育道德教学设计高中体育与健康人教版全一册-人教版
- 七年级英语期末复习语法知识笔记
- 第6课 书衣之美说课稿初中美术沪书画版五四学制2024六年级上册-沪书画版五四学制2024
- 烟草评级员业务报告范文
- 2025年三基三严考试题题库(含答案)
- 湖北省重点高中智学联盟2024-2025学年高三上学期10月联考物理试题(解析版)
- 《智慧运输运营》全套教学课件
- 2024新教材高中历史 第八单元 中华民族的抗日战争和人民解放战争 第25课 人民解放战争教学设计 部编版必修中外历史纲要上
- 《统计分析与SPSS的应用(第7版)》课件全套 第1-12章 SPSS统计分析软件概述
- 《酒店营销与数字化实务》 习题答案
- 机收甘蔗杂质含量抽样检测操作规程
- 2023年成人学位英语高频词汇
- GB/T 11376-2020金属及其他无机覆盖层金属的磷化膜
评论
0/150
提交评论