C语言基于GTK+Libvlc实现的简易视频播放器
    小编心语:现下,各种视频播放软件层出不穷,竞争也越演越烈,不知道大家有木有这个想法,小编有时在想能不能做一款属于自己的视频播放器呢~小编特意去实验楼,整理出了这篇关于如何实现简易视频播放器的博文。简易播放器,你值得拥有~
友情提示:这里只是前篇,只是一些简单的功能,其他功能将会在后篇为大家介绍——
一、课程说明
如果你学习过之前上线的pygtk实现有道词典的项目课,那应该对gtk的使用有一些了解了,这个项目课学起来会相对轻松一些。 关于Gtk或者说是通常的图形应用开发的一些基础知识,我们会在以后的基础课程中体现,项目课适合有一定基础的用户学习。
二、Gtk简介
GTK+ 是一种图形用户界面(GUI)工具包。也就是说,它是一个库(或者,实际上是若干个密切相关的库的集合),它支持创建基于 GUI 的应用程序。可以把 GTK+ 想像成一个工具包,从这个工具包中可以到用来创建 GUI 的许多已经准备好的构造块。
最初,GTK+ 是作为另一个著名的开放源码项目 —— GNU Image Manipulation Program (GIMP) —— 的副产品而创建的。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 创建了 GTK(它代表 GIMP Toolkit),作为 Motif 工具包的替代,后者在那个时候不是免费的。(当这个工具包获得了面向对象特性和可扩展性之后,才在名称后面加上了一个加号。)
这差不多已经 10 年过去了。今天,在 GTK+ 的最新稳定版本 —— 2.8 版上(3.0测试中),仍然在进行许多活动,同时,GIMP 无疑仍然是使用 GTK+ 的最著名的程序之一,不过它已经不是惟一的使用 GTK+ 的程序了。已经为 GTK+ 编写了成百上千的应用程序,而且至少有两个主要的桌面环境(Xfce 和 GNOME)用 GTK+ 为用户提供完整的工作环境。
GTK+虽然是用C语言写的,但是您可以使用你熟悉的语言来使用GTK+,因为GTK+已经被绑定到几乎所有流行的语言上,如:C++,PHP, Guile,Perl, Python, TOM, Ada95, Objective C, Free Pascal, and Eiffel
使用GTK+的优秀应用程序:
GIMP-GNU图像处理程序
GNOME、XFCE等桌面环境和大部分窗口管理器都基于GTK+
Inkscape-类似于Illustrator、CorelDraw的矢量图形绘制工具
Pidgin-支持多种协议(IRC、Gtalk、Yahoo Talk、MSN、QQ等等)的聊天工具
Firefox 、Chrome-两大流行浏览器
...
Gtk+3.0官方API文档 其他Gtk依赖库API
三、Vlc简介
1.简介:
VLC多媒体播放器(英语:VLC media player,最初为VideoLAN Client,是VideoLAN计划的开放源代码多媒体播放器。)支持众多音频与视频解码器及文件格式,并支持DVD影音
光盘,VCD影音光盘及各类流 协议。它也能作为单播或多播的流服务器在IPv4或IPv6的高速网络连接下使用。调用FFmpeg计划的解码器与libdvdcss程序库使其有播放多 媒体文件及加密DVD影碟的功能。
VLC自建的动态核心模块,使所有的接口(interfaces)、视频和音频输出(video and 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、BeOS、OS/2、BSD、安卓、iOS、及Solaris。
2.libvlc
libvlc是VLC media player使用的多媒体框架的核心引擎和扩展编程接口,它可以帮助开发者开发广泛的多媒体应用
libvlc多媒体框架结构如下:
libvlc API关系图表如下:
LibVlc官方API文档
四、gtk构建gtk界面
我们首先也只是布局和添加控件,之后再来实现业务逻辑,不多说,直接看图,这就是我们要先实现的播放器大致的界面布局,不过这个界面将不会是我们最 终要实现的样子,因为这是使用galde界面设计器创建的布局,大家初学时最好不要直接使用glade来进行布局,因为它会忽略很多细节。先从手写代码的 方式进行布局和添加控件,这样有助于你更好的掌握那些控件的使用方法。
1.先了解这个布局的层次关系
window|mysql数据库脚本怎么执行---vbox|-------menubar|-------drawingarea|-------hbox        |---hbuttonbox        |  |---pl
aybutton        |  |eclipse改颜---stopbutton        |---scale        |---fullscreenbutton
2.实现这个布局的代码如下:
//filename:gui.c#include <gtk/gtk.h>#include <gdk/gdkx.h>#include <glib.h>#define BORDER_WIDTH 6int main(int argc, 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函数的两个参数,用于在命令行执行程序时传递并解析参数    gtk_init(&argc, &argv);    // 创建一个window并完成初始化,如设置为顶层窗口,宽度和高度,标题等,并绑定destory信号,以便在关闭gtk窗口后程序能完全退出c语言教学视频推荐    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);    gtk_window_set_default_size(GTK_WINDOW(window), 400, 300);    g_signal_connect(wi
ndow, "destroy", G_CALLBACK(gtk_main_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和两个menuitem分别为菜单中的“文件”和“打开”,由于它们为上下级菜单关系,    //所以需要单独一个menu来放置"open_menu_item",也就是代码中的filemenu_openitem    menubar = gtk_menu_bar_new();    fileitem = gtk_menu_item_new_with_label ("File");    filemenu_openitem = gtk_menu_item_new_with_label("Open"blur事件);    filemenu = gtk_menu_new();    gtk_menu_shell_append(GTK_MENU_SHELL(filemenu), filemenu_openitem);    // 将filemenu设置为上一级fileitem的子菜单,然后将fileitem添加进menubar,最后将menubar放置进vbox    gtk_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, FALSE, FALSE, 0);    //创建一个draw_area控件,用做视频播放显示区域,并放置进vbox    player_widget = gtk_drawing_area_new();    gtk_box_pack_start(GTK_BOX(vbox), player_widget, TRUE, TRUE, 空白符号直接复制0);    est time和北京时间//创建一个hbox作为vbox的子容器,一个hbuttonbox作为hbox的子容器,hbuttonbox用于放置两个button,    // 再将一个scale(滚动条,用作视频播放进度条,原本的process控件不能拖动)添加进hbox,最后将hbox放置进最外面的vbox    hbox = 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_new_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), sto
p_button, 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_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);    gtk_main ();    return 0;}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。