课题_基于VLC的播放器开发
- 格式:doc
- 大小:106.00 KB
- 文档页数:2
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+ 为用户提供完整的工作环境。
用CC++开发基于VLC SDK的视频播放器在windows系统如果开发万能播放器,一般都是基本DirectShow来开发,开发也很简单,但缺点也很多,一个文件格式是否能够播放完全取决于你是否安装了正确的解析器和解码器,即使现在有了万能解器安装包也会出现很多问题,不过自从很多开源软件的出现,比如大名鼎鼎的ffmpeg,vlc等,一切都变得简单起来,基于ffmpeg sdk开发就不多介绍了,本文主要介绍基于 VLC SDK来开发自己的播放器,一切都是那么的简单.1.先下载VLC player, , 安装的时候要安装开发库(SDK)2.用VC 6.0/2003/2005/2008/2010 IDE均可开发自己的测试程序3.创建一个控制台程序,当然创建一个窗口程序更好,由于只是为了关注于如何使用VLC SDK,所以都无所谓的4.在工程中设置好vlc的 include和lib路径,一般VLC sdk路径是C:\Program Files\VideoLAN\VLC\sdk5.复制libvlc.dll, libvlccore.dll,plugins目录到工程debug目录,如果是release需要复制到release目录,目录结构如图:之后就是完整的代码:#include <stdio.h>#include <tchar.h>#include <time.h>#include <windows.h>#include <vlc/vlc.h>#pragma comment(lib, "libvlc.lib")#pragma comment(lib, "libvlccore.lib")int main(int argc, char* argv[]){libvlc_instance_t * vlc_ins = NULL;libvlc_media_player_t * vlc_player = NULL;libvlc_media_t * vlc_media = NULL;const char * vlc_args[] ={"-I","dummy","--ignore-config","--extraintf=logger","--verbose=2",};// 创建一个VLC实例vlc_ins = libvlc_new(sizeof(vlc_args)/sizeof(vlc_args[0]), vlc_args);if(vlc_ins != NULL){// 创建一个VLC播放器vlc_player = libvlc_media_player_new(vlc_ins);if(vlc_player != NULL){// 通过文件路径创建一个媒体实例,这里是我的测试文件vlc_media = libvlc_media_new_path(vlc_ins, "d:\\clips\\org.mp4");if(vlc_media != NULL){// 解析媒体实例libvlc_media_parse(vlc_media);// 获取媒体文件的播放长度, 返回 mslibvlc_time_t duration = libvlc_media_get_duration(vlc_media);// 此处是获取媒体包含多个的视频和音频轨以及其他类型的轨道信息libvlc_media_track_info_t *media_tracks = NULL;int trackCount = libvlc_media_get_tracks_info(vlc_media, &media_tracks);// 这里是释放内存,但我测试的时候会有问题,还没仔细研究是为何// free(media_tracks); // crash?// 把打开的媒体文件设置给播放器libvlc_media_player_set_media(vlc_player, vlc_media);// 因为是windows系统,所以需要设置一个HWND给播放器作为窗口,这里就直接使用桌面窗口,这里仅是测试libvlc_media_player_set_hwnd(vlc_player, ::GetDesktopWind ow());// 开始播放视频libvlc_media_player_play(vlc_player);// 这里仅是为了打印一些信息出来,20秒后退出time_t last_time = time(NULL);while((time(NULL) < (last_time + 20))){Sleep(10);// 获取当前播放位置libvlc_time_t play_time = libvlc_media_player_get_time(vlc_player);printf("playing time : %lld ms\r", (__int64)(play_time));// 获取媒体的状态// libvlc_state_t media_state = libvlc_media_get_state(vlc_media);// printf("\nmedia state : %d\n", (int)(media_state));}// 停止libvlc_media_player_stop(vlc_player);// 释放libvlc_media_release(vlc_media);}// 释放libvlc_media_player_release(vlc_player);}// 释放libvlc_release(vlc_ins);}return 0;}编译运行,就可以在桌面上看到播放的视频了,用VLC SDK做自己的播放器是如此的简单。
C#Winform开发程序调⽤VLC播放器控件播放视频. VLC是个好东西,⽀持的格式多,还⽆⼴告,关键还有调⽤它的播放控件不⽤安装.开个⽂章记录下调⽤这个控件的流⽔账,以便以后需要的时候查阅创建⼯程⾸先新建⼀个Winform⼯程.这⾥姑且叫做VLC.Test吧复制⽂件在⾃⼰的项⽬⽬录⾥创建⼀个Lib⽬录,⾥⾯再创建⼀个VLC⽬录,在VLC的安装⽬录能找到这三个⽂件/⽂件夹复制到⾃⼰的项⽬⾥在项⽬属性⾥配置⽣成事件这⼀步的效果是在编译程序的时候能⾃动把库⽂件复制到输出⽬录. 毕竟在创建git仓库的时候是要屏蔽输出⽬录的.xcopy "$(ProjectDir)\Lib\VLC\*" "$(ProjectDir)$(OutDir)" /s /e /r /h /d /y对API进⾏声明由于VLC的DLL是Native DLL,在C#中需要进⾏声明才能⽤,不过好在这条路已经有⼈⾛过了:借⽤写的⼀个Class(⽂章末尾会附带git地址)添加测试视频在⼯程⾥添加了⼀个视频,并设置⾃动复制到输出⽬录编写代码将这⼏⾏代码加在窗⼝的load事件中:VlcPlayer.VlcPlayerBase VlcPlayerBase = new VlcPlayer.VlcPlayerBase(Environment.CurrentDirectory + "\\vlc\\plugins\\"); VlcPlayerBase.SetRenderWindow(pictureBox1.Handle.ToInt32());VlcPlayerBase.LoadFile("银河与极光.mp4");VlcPlayerBase.Play();运⾏即可播放.播放效果代码获取。
利用MCI在VC++环境下设计一个播放器一、实验目的通过动手制作基于Vc++的音乐播放器,了解播放器的原理。
并通过自己动手,在windows 播放器组件的基础上,用自己的算法,去实现自己的界面和自己的播放模式。
二、实验仪器或设备Pc机一台、 windows xp以上操作系统开发环境:Vc++6.0三、总体设计(设计原理、设计方案及流程等)1、设计原理:Microsoft Visual C++是Microsoft公司推出的开发Win32环境程序,面向对象的可视化集成编程系统。
它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。
它以拥有“语法高亮”,IntelliSense(自动编译功能)以及高级除错功能而著称。
比如,它允许用户进行远程调试,单步执行等。
还有允许用户在调试期间重新编译被修改的代码,而不必重新启动正在调试的程序。
其编译及建置系统以预编译头文件、最小重建功能及累加连结著称。
这些特征明显缩短程式编辑、编译及连结的时间花费,在大型软件计划上尤其显著。
visual C++ 6.0集成了MFC6.0,于1998发行。
发行至今一直被广泛地用于大大小小的项目开发。
但是,这个版本在WindowsXP下运行会出现问题,尤其是在调试模式的情况下(例如:静态变量的值并不会显示)。
这个调试问题可以通过打一个叫“Visual C++ 6.0Processor Pack”的补丁来解决。
奇怪的是,这个网页强调用户也必须运行Windows 98、Windows NT4.0、或Windows 2000。
2、设计方案:通过Vc++6.0的可视化程序设计界面,运用基本对话框和按钮以及时间条进行界面设计,而后对各个按钮空间,以及时间条空间进行时间编码,依据自己的算法,实现自己的播放器。
用VC做视频播放器网址:/space.php?do=thread&id=10426三设计过程和算法描述(宋体,四号)6.2.1 利用VC6.0的MFC AppWizard创建工程首先:注册该控件在windows“运行”里写入:regsvr32 msdrm.ocx 单击确定1.在VC++集成开发环境中,选择菜单File|New,弹出New对话框。
2.在Projects选项卡中选择MFC AppWizard(exe),并在Location项中输入“D:\Samples”。
3.在Project name中输入“CTLY2412”,项中的内容自动设置为“D:\Samples\Player”。
4.按下OK按钮,在弹出的MFC AppWizard-Step-1对话框中选择Dialog based项,生成基于对话框的应用程序。
5.按下Finish按钮,在弹出的对话框中按下OK按钮,等待创建完相应的工程。
6.2.2 为对话框添加菜单1.在工作区中单击Resource View选项卡,展开Dialog资源组,双击IDD_PLAYER_DIALOG。
在右边的工作台中显示可以进行可视化编辑的IDD_PLAYER_DIALOG对话框,并打开一个控件工具窗口。
删除AppWizard在对话框中生成的控件,即一个OK按钮、一个Cancel按钮和一个文本框。
2.鼠标右击Dialog资源组中的IDD_PLAYER_DIALOG条目,在弹出的菜单中选择Insert…选项。
这时,显示Insert Resource(增加资源)窗口,选择其中的Menu项,单击右边的New按钮。
这样,VC++6.0在资源文件Player.rc中增加了一项资源,即一个菜单。
3.双击ID号:IDR_MENU1,则在右边显示一个可编辑的菜单条,该菜单条的最右边是一个虚方框,表示最右边的一个菜单项。
4.双击虚方框,弹出Menu Item Properties(菜单项属性)对话框,在“C编辑”框中输入菜单标题:文件(&F),其中“&”的作用是使其后面的字符加上下划线,让用户可用键盘来选择菜单。
c#winformvlcPlayer播放器vlcPlayer是⼀款免费开源的播放器项⽬,可以播放⼏乎所有的视频格式。
第⼀步:获取dll安装vlcplayer视频播放器,在安装⽬录下⾯获取所需的dll。
dll⽂件夹:plugins还有2个dll:libvlc.dll,libvlccore.dll第⼆步:获取播放器对象基类VlcPlayerBaseusing System;using System.Runtime.InteropServices;using System.Security;using System.Text;namespace VlcPlayer{public class VlcPlayerBase{private IntPtr libvlc_instance_;private IntPtr libvlc_media_player_;///<summary>///视频时长///</summary>private double duration_;///<summary>/// VLC 播放器。
///</summary>///<param name="pluginPath"></param>public VlcPlayerBase(string pluginPath){//string pluginPath = Environment.CurrentDirectory + "\\vlc\\plugins\\"; //插件⽬录string plugin_arg = "--plugin-path=" + pluginPath;string[] arguments = { "-I", "dummy", "--ignore-config", "--no-video-title", plugin_arg };libvlc_instance_ = LibVlcAPI.libvlc_new(arguments);libvlc_media_player_ = LibVlcAPI.libvlc_media_player_new(libvlc_instance_); //创建 libvlc_media_player 播放核⼼}///<summary>///设置播放容器///</summary>///<param name="wndHandle">播放容器句柄</param>public void SetRenderWindow(int wndHandle){if (libvlc_instance_ != IntPtr.Zero && wndHandle != 0){LibVlcAPI.libvlc_media_player_set_hwnd(libvlc_media_player_, wndHandle); //设置播放容器}}///<summary>///播放指定媒体⽂件///</summary>///<param name="filePath"></param>public void LoadFile(string filePath){IntPtr libvlc_media = LibVlcAPI.libvlc_media_new_path(libvlc_instance_, filePath); //创建 libvlc_media_player 播放核⼼if (libvlc_media != IntPtr.Zero){LibVlcAPI.libvlc_media_parse(libvlc_media);duration_ = LibVlcAPI.libvlc_media_get_duration(libvlc_media) / 1000.0; //获取视频时长LibVlcAPI.libvlc_media_player_set_media(libvlc_media_player_, libvlc_media); //将视频绑定到播放器去LibVlcAPI.libvlc_media_release(libvlc_media);//LibVlcAPI.libvlc_media_player_play(libvlc_media_player_); //播放}}///<summary>///播放///</summary>public void Play(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_player_play(libvlc_media_player_);}}///<summary>///暂停播放///</summary>public void Pause(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_player_pause(libvlc_media_player_);}///<summary>///停⽌播放///</summary>public void Stop(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_player_stop(libvlc_media_player_);}}public void Release(){if (libvlc_media_player_ != IntPtr.Zero){LibVlcAPI.libvlc_media_release(libvlc_media_player_);}}///<summary>///获取播放时间进度///</summary>///<returns></returns>public double GetPlayTime(){return LibVlcAPI.libvlc_media_player_get_time(libvlc_media_player_) / 1000.0;}///<summary>///设置播放时间///</summary>///<param name="seekTime"></param>public void SetPlayTime(double seekTime){LibVlcAPI.libvlc_media_player_set_time(libvlc_media_player_, (Int64)(seekTime * 1000));}///<summary>///获取⾳量///</summary>///<returns></returns>public int GetVolume(){return LibVlcAPI.libvlc_audio_get_volume(libvlc_media_player_);}///<summary>///设置⾳量///</summary>///<param name="volume"></param>public void SetVolume(int volume){LibVlcAPI.libvlc_audio_set_volume(libvlc_media_player_, volume);}///<summary>///设置是否全屏///</summary>///<param name="istrue"></param>public void SetFullScreen(bool istrue){LibVlcAPI.libvlc_set_fullscreen(libvlc_media_player_, istrue ? 1 : 0);}///<summary>///视频时长///</summary>///<returns></returns>public double Duration { get { return duration_; } }///<summary>///是否正在播放///</summary>public bool IsPlaying{get{if (Duration > 0 && (int)GetPlayTime() == (int)Duration) this.Stop(); //如果播放完,关闭视频return (int)GetPlayTime() < (int)Duration /* 播放时间进度⼩于视频时长 */&& Duration > 0/* 播放时间进度⼤于0 */&& GetPlayTime() > 0; /* 视频时长⼤于0 */}}///<summary>///获取版本(VS2015 调试模式程序会直接崩掉)///</summary>///<returns></returns>public string Version { get { return LibVlcAPI.libvlc_get_version(); } }}#region vlclib.dllinternal static class LibVlcAPIinternal struct PointerToArrayOfPointerHelper{[MarshalAs(UnmanagedType.ByValArray, SizeConst = 11)]public IntPtr[] pointers;}///<summary>///传⼊播放参数///</summary>///<param name="arguments"></param>///<returns></returns>public static IntPtr libvlc_new(string[] arguments){PointerToArrayOfPointerHelper argv = new PointerToArrayOfPointerHelper();argv.pointers = new IntPtr[11];for (int i = 0; i < arguments.Length; i++){argv.pointers[i] = Marshal.StringToHGlobalAnsi(arguments[i]); //将托管 System.String 中的内容复制到⾮托管内存,并在复制时转换为 ANSI 格式。
基于VC的多媒体播放器的设计与开发在设计和开发基于VC的多媒体播放器时,有几个关键的方面需要考虑。
首先,我们需要确定播放器的功能和特性。
其次,我们需要设计用户界面,并开发与之相应的功能。
最后,我们需要确保播放器的性能和稳定性。
在功能和特性的确定方面,我们可以考虑以下几点:1. 支持多种多媒体文件格式:播放器应该能够支持常见的音频和视频文件格式,如MP3,MP4,AVI等。
2. 播放控制功能:播放器应该具备诸如播放,暂停,停止,快进,快退,循环播放,随机播放等基本的播放控制功能。
3. 音量调节功能:播放器应该提供音量增减的功能,使用户可以根据需要调整音量大小。
4. 播放列表功能:播放器应该允许用户创建和管理自己的播放列表,方便用户播放和组织自己的音频和视频文件。
在用户界面的设计方面,我们可以考虑以下几点:1. 主界面设计:主界面应该简洁明了,让用户能够直观地找到所需的功能按钮和控件。
2. 播放控制按钮:应该将常用的播放控制按钮(如播放,暂停,停止)放置在主界面上,方便用户随时进行操作。
3. 播放进度条:应该显示当前正在播放的媒体文件的播放进度,以便用户了解播放进度。
4. 音量控制按钮:应该提供对音量的调节按钮,让用户能够根据需要增加或减少音量大小。
在功能的开发方面,我们可以使用VC等开发工具来实现:1. 文件解码播放:使用合适的解码器来解码音频和视频文件,并通过音频驱动和显示驱动将其播放出来。
2. 播放控制:根据用户的操作,通过调用相关的API来实现播放,暂停,停止,快进,快退等操作。
3. 播放列表管理:通过读取用户的文件夹和文件,将其组织成播放列表,并实现相应的增加,删除和切换操作。
最后,在性能和稳定性方面,我们可以采取以下措施:1. 优化播放器的代码结构和算法,使其能够高效地解码和播放多媒体文件。
2. 对于文件解码过程中可能发生的异常和错误情况,进行适当的异常处理和错误提示,以确保播放器的稳定性和可靠性。
存档编号基于VC的多媒体播放器的设计与开发教学学院数学与计算机科学学院届别 2013届专业计算机科学与技术学号姓名指导教师完成日期 2013.5.3目录摘要................................... 错误!未定义书签。
关键词:.. (1)Abstract (1)Key words: (2)1. 引言 (2)1.1 MFC简介 (2)1.2 ActiveX Control介绍 (3)2. 需求分析 (3)2.1 功能需求分析 (3)2.2 性能需求分析 (4)2.3 运行需求分析 (4)3. 系统总体设计 (4)3.1 总体设计 (4)3.2总体设计层次图 (5)4. 详细设计 (6)4.1基本界面设置 (6)4.2打开文件与添加列表控制设置 (6)4.3播放控制控件设置 (6)4.4对列表的控制控件设置 (7)4.5菜单控件设置 (7)4.6程序设计的详细说明 (7)5. 编码实现 (10)5.1 ActiveX控件在播放器中应用 (10)5.2 主要实现原理及程序 (11)6.总结 (21)参考文献 (22)摘要本毕业设计“多媒体播放软件设计”就是为了设计一个简单实用的播放器。
首先是利用VC系统的ActiveX控件来实现基础的播放媒体功能。
其次,是通过分析媒体播放的具体过程,在打开媒体设备的过程中应用程序需要做哪些事情,在应用程序中加入对这些过程支持的代码。
再次,对应用程序的流程构造大致的轮廓,再完善程序框架的设计,应用程序外观的设计。
最后,也是最关键的就是编写实现播放媒体的代码将播放器的基本功能实现。
本软件与其他同类型的多媒体播放器相比,具有体积小、支持的播放格式多、系统资源占有少的优势。
同时支持文件的打开、保存、删除等功能。
虽然体积很小,但是基本完成了对常见音频、视频媒体的播放功能。
此篇论文主要阐述的是系统设计时所做的一些工作,包括对系统的需求分析,系统的总体设计以及系统的详细设计,详细说明了系统的一些常用的功能及特性,以便用户使用。
基于VC的多媒体播放器的设计与开发一、引言随着科技的不断进步和互联网的发展,计算机多媒体技术已经被广泛应用于日常生活中。
而多媒体播放器作为计算机多媒体技术的重要应用之一,早已成为人们生活娱乐的重要组成部分。
本文将介绍一种基于VC的多媒体播放器的设计与开发,主要包括系统的功能需求、体系结构设计、核心功能的实现等内容。
二、系统功能需求1. 基本的播放功能:支持常见的音视频文件格式,能够对音乐和视频进行播放、暂停、停止等操作。
2. 画面显示:提供清晰流畅的视频播放效果,支持全屏、窗口模式下的画面显示,能够根据用户需求进行画面大小的调整。
3. 音频输出:支持多种音频输出方式,如扬声器、耳机等,并能够根据用户需求进行音量的调整。
4. 播放控制:提供播放进度条、音量调节、快进快退等播放控制功能,方便用户对音视频进行控制和调节。
5. 播放列表管理:支持用户创建、导入和管理播放列表,方便用户组织和管理自己的音视频文件。
6. 其他功能:支持收藏、分类、搜索等附加功能,方便用户快速找到自己想要播放的音视频文件。
三、体系结构设计基于VC的多媒体播放器的体系结构设计如下:1. 前端界面设计:使用VC进行界面设计,根据用户需求设计简洁、直观的操作界面,使用户可以方便地进行各种操作。
2. 多媒体引擎:使用VC的多媒体编程接口进行音视频播放控制,实现音视频的解码、播放和控制功能。
3. 播放列表管理:设计数据库或文件系统来管理播放列表,实现播放文件的增删改查功能。
4. 用户交互功能:通过与用户的交互实现播放控制、搜索、收藏等功能,提升用户体验。
5. 后台管理功能:实现系统配置、播放规则设置等功能,方便管理员对系统进行管理和维护。
四、核心功能实现1. 多媒体文件格式支持:通过调用VC的多媒体编程接口,实现对常见音视频文件格式的解码和播放功能。
2. 视频播放效果优化:利用VC的图像处理功能实现视频的渲染,提供清晰、流畅的画面显示效果。
基于VLC的网络视频播放器bavon@VLC Media Player(/vlc/)是一个优秀的、跨平台、支持多种传输协议、支持多种视频编码格式的视频播放器(同时也可以作为服务器)。
VLC提供了二次开发包,在windows下可以利用VLC提供的ActiveX控件来进行二次开发。
本文档介绍了如何在win32平台上利用mingw进行VLC的移植,并通过VLC的ActiveX进行二次开发,实现一个多媒体播放器。
在win32平台上利用mingw进行VLC的移植首先是创建VLC的编译环境。
到/project/showfiles.php?group_id=2435下载相关文件。
下载MinGW-5.1.3.exe或者更高的版本,然后运行,按照提示安装,最好选择安装full 版本。
下载MSYS-1.0.10.exe或者更高的版本,然后运行,按照提示安装,中间要正确填写已经安装好的MinGW的目录,例如“j:/MinGW”。
主要要用“/”。
下载msysDTK-1.0.0.exe或者更高的版本,然后运行,按照提示安装。
其次是编译VLC。
下载//pub/testing/win32/contrib-0.8.6e-gcc-3.4.5-only.tar.bz2 到某个目录,如“j:\vlc”。
到/vlc/download-sources.html下载VLC source code tar.gz文件到上述目录。
运行msys程序,在弹出的控制终端中输入mkdir /vlc然后用windows的记事本编辑器编辑msys\1.0\etc\fstab文件,在里面加入一行j:/VLC /vlc,这样可以挂载vlc目录。
在msys的控制终端中输入cd /vlctar jxvf contrib-0.8.6e-gcc-3.4.5-only.tar.bz2 –C /会把解码库解压到/usr/win32-branch目录中。
在当前目录继续输入tar zxvf vlc-0.8.6e.tar.gz将vlc的源代码解压缩到vlc-0.8.6e目录中。
用Visual C++设计的多媒体播放器〔附源程序〕用Visual C++设计的多媒体播放器学生:** 指导教师:**摘要本课程设计的目的是制作一个可播放目前主流媒体格式的多媒体播放器,其根本功能应具有媒体播放、音量调节、播放进度选择、暂停、停顿以及歌曲信息的查询与添加等,使之成为一款简易的媒体播放设备,能够完美的播放市面上大多数的音频、视频文件。
在课程设计中,系统开发平台为Windows XP Professional SP2,程序设计环境采用Visual C++ 6.0。
在程序设计中,我利用了Microsoft公司开发的ActiveX控件可视动画控件ActiveMovie该播放器是基于MFC 集成开发环境,利用ActiveMovieActiveMovie控件;多媒体;播放器目录引言 (1)1.1系统的设计目标和系统的意义 (1)1.2多媒体播放器将到达的效果 (2)1.3软件的开发设计思想 (2)1.4开发工具的介绍 (3)1.5可行性分析和需求分析 (3)2 软件的需求分析和模块设计 (4)2.1软件的需求分析 (4)2.2软件的模块设计 (4)3. 数据库设计 (5)3.1数据需求分析 (5)3.2数据库概念构造设计 (5)3.3数据库逻辑构造设计 (6)3.4数据库构造的实现 (7)4多媒体播放器软件设计 (7)4.1模块实现函数说明 (7)4.2主要变量声明 (8)4.3设计多媒体播放器界面 (9)4.4播放器模块设计 (9)4.5 功能模块设计 (10)4.6歌曲信息模块的设计 (13)4.7 欢送动画模块设计 (16)5 程序实现结果 (17)5.1 程序运行流程图 (17)5.2 播放器实现结果演示 (18)完毕语 (23)考文献……………………………………………………………………………………….. .24附录:源程序清单1 引言随着多媒体硬件环境和软件环境的不断完善,多媒体在人类文化生活中扮演的角色越来越重要。
.存档编号鉴于 VC的多媒体播放器的设计与开发教课学院数学与计算机科学学院届别2013 届专业计算机科学与技术学号姓名指导教师达成日期目录纲要 (1)要点词: (1)Abstract (2)Key words: (3)1.前言 (4)1.1 MFC 简介 (4)1.2 ActiveX Control 介绍 (5)2.需求解析 (5)功能需求解析 (5)性能需求解析 (6)运转需求解析 (7)3.系统整体设计 (7)整体设计 (7)整体设计层次图 (9)4.详尽设计 (10)基本界面设置 (10)翻开文件与增添列表控制设置 (11)4.3 播放控制控件设置 (11)4.4 对列表的控制控件设置 (12)4.5 菜单控件设置 (12)4.6 程序设计的详尽说明 (13)5. 编码实现 (17)5.1 ActiveX 控件在播放器中应用 (17)5.2 主要实现原理及程序 (18)6.总结 (38)参照文件 (39)纲要本毕业设计“多媒体播放软件设计”就是为了设计一个简单实用的播放器。
第一是利用VC 系统的 ActiveX 控件来实现基础的播放媒体功能。
其次,是经过解析媒体播放的详细过程,在翻开媒体设施的过程中应用程序需要做哪些事情,在应用程序中加入对这些过程支持的代码。
再次,对应用程序的流程结构大概的轮廓,再完美程序框架的设计,应用程序外观的设计。
最后,也是最关键的就是编写实现播放媒体的代码将播放器的基本功能实现。
本软件与其余同种类的多媒体播放器对比,拥有体积小、支持的播放格式多、系统资源据有少的优势。
同时支持文件的翻开、保留、删除等功能。
固然体积很小,可是基本达成了对常有音频、视频媒体的播放功能。
此篇论文主要论述的是系统设计时所做的一些工作,包含对系统的需求解析,系统的整体设计以及系统的详尽设计,详尽说了然系统的一些常用的功能及特征,以便用户使用。
要点词: VC ActiveX多媒体系统设计.AbstractMy design" multimedia broadcast software design " in order todesign a practical player Have solved MCI function and orderedthe name type of news and function problem at first. Secondly, it is through analyzing the concrete course that the media broadcasts, what things application program needs doing during the processof turning on apparatus of media, add the code supported to the course into application program. Moreover, to the procedure structure roughly outline of the application program, and then.improve the design of the procedure frame, design of the appearance of the application program. Finally, a key one to write, realize code to show the media realize the basic function of theplayer most too.Compared to this software with other same type multimedia player, have small, form of broadcasting supported more, systematic resources occupy few advantages. Support the tabulation of broadcasting to edit, support the function of opening, save of the file at the same time.Though the volume is very small,the one that has finished to the common audio frequency , video media basically has broadcast the function.Mainly elaborates this thesis is of some work done while designing the system, including the analysis of the demand of the system, detailed design, system design and system, and explains some common functions and characteristics of the system, so thatthe user use.Key words: VC ActiveX Multimedia System Design.1.前言多媒体技术的观点和应用出现于20 世纪 80 年月早期,经过十余年的发展,跟着计算机科学网络的普及和多媒体技术的发展,已成为计算机领域发展的热门技术,针对目前各种媒体格式,如何简单方便的播放各种媒体已成为人们广泛关注的问题,而媒体播放器的开发也变得十分重要。
C#下调用vlc库做一个简单播放器C#下调用vlc调做一调调播放器个第一步,调建一个C#工程。
在Form1中拖一个2个plane;上下布局,、label、tex t、2个button控件。
第二步,把vlc的plugins文件调和libvlccore.dlllibvlc.dll放入DEBUG文件调。
内第三步,调代调~把下面的代调调制到写Form1调中。
public partial class Form1 : Form{public Form1(){InitializeComponent();}//造常调的调构异构体class MediaException{public struct ExceptionStruct{private int raised;private int code;private string message;}}//造构Corehandle调class CoreHandle : SafeHandle{//造方法构public CoreHandle(): base(IntPtr.Zero, true) {}//重的方法写public override bool IsInvalid{get { return handle == IntPtr.Zero; }}protected override bool ReleaseHandle(){if (!IsInvalid){libvlc_release(this);handle = IntPtr.Zero;}return true;}protected override void Dispose(bool disposing){ReleaseHandle();base.Dispose(disposing);}//Dll调调调入[DllImport("libvlc")]private static extern void libvlc_release(CoreHandle coreHandle); }//造构core调class Core{//coreHandle字段和性属private CoreHandle coreHandle;public CoreHandle CoreHandle{get { return coreHandle; }}//造方法构public Core(string[] argv, ref MediaException.ExceptionStruct ex) {byte[][] argvbytes = new byte[argv.Length][];for (int i = 0; i < argv.Length; i++){argvbytes[i] = Encoding.UTF8.GetBytes(argv[i]);}coreHandle = libvlc_new(argv.Length, ReturnIntPtr(argvbytes, argv.Length), ref ex);}//调调函数private IntPtr ReturnIntPtr(byte[][] data, int length){IntPtr[] dataIntPtrArr = new IntPtr[length];for (int i = 0; i < length; i++){dataIntPtrArr[i] = Marshal.AllocHGlobal(data[i].Length *sizeof(byte));Marshal.Copy(data[i], 0, dataIntPtrArr[i], data[i].Length);}IntPtr dataIntPtr = Marshal.AllocHGlobal(length *Marshal.SizeOf(typeof(IntPtr)));Marshal.Copy(dataIntPtrArr, 0, dataIntPtr, length);return dataIntPtr;}//Dll调调调入[DllImport("libvlc")]private static extern CoreHandle libvlc_new(int argc, IntPtr argv, refMediaException.ExceptionStruct ex);}//造构MediaHandle调class MediaHandle : SafeHandle{//造方法构public MediaHandle(): base(IntPtr.Zero, true){}//重的方法写public override bool IsInvalid{get { return handle == IntPtr.Zero; }}protected override bool ReleaseHandle(){if (!IsInvalid){libvlc_media_release(this);handle = IntPtr.Zero;}return true;}protected override void Dispose(bool disposing){ReleaseHandle();base.Dispose(disposing);}//Dll调调调入[DllImport("libvlc")]private static extern void libvlc_media_release(MediaHandle mediaHandle);}//造构Media调class Media{//mediaHandle字段和性属private MediaHandle mediaHandle;public MediaHandle MediaHandle{get { return mediaHandle; }}//造方法构public Media(CoreHandle coreHandle, String filename, ref MediaException.ExceptionStruct ex){//c#调UTF-16调调, libvlc.dll调UTF-8调调, 需要调调.UTF8Encoding utf8 = new UTF8Encoding();mediaHandle = libvlc_media_new(coreHandle, utf8.GetBytes(filename), ref ex);}//Dll调调调入[DllImport("libvlc")]private static extern MediaHandle libvlc_media_new(CoreHandle coreHandle, [MarshalAs(UnmanagedType.LPArray)]byte[] link, ref MediaException.ExceptionStruct ex);}//造构MediaPlayerHandle调class MediaPlayerHandle : SafeHandle{//造方法构public MediaPlayerHandle(): base(IntPtr.Zero, true){}//重的方法写public override bool IsInvalid{get { return handle == IntPtr.Zero; }}protected override bool ReleaseHandle(){if (!IsInvalid){libvlc_media_player_release(this); handle = IntPtr.Zero;}return true;}protected override void Dispose(bool disposing){ReleaseHandle();base.Dispose(disposing);}//Dll调调调入[DllImport("libvlc")]private static extern voidlibvlc_media_player_release(MediaPlayerHandlemediaPlayerHandle);}//造构MediaPlayer调class MediaPlayer{//mediaPlayerHandle字段和性属private MediaPlayerHandle mediaPlayerHandle;public MediaPlayerHandle MediaPlayerHandle{get { return mediaPlayerHandle; }}//造方法构public MediaPlayer(MediaHandle mediaHandle, refMediaException.ExceptionStruct ex){mediaPlayerHandle =libvlc_media_player_new_from_media(mediaHandle, ref ex);}//调置父口窗public void VedioSetParent(CoreHandle coreHandle, IntPtr hDT, ref MediaException.ExceptionStruct ex){libvlc_video_set_parent(coreHandle, hDT, ref ex);}//播放public void Play(ref MediaException.ExceptionStruct ex){libvlc_media_player_play(mediaPlayerHandle, ref ex);}//调停public void Pause(ref MediaException.ExceptionStruct ex){libvlc_media_player_pause(mediaPlayerHandle, ref ex);}//停止public void stop(ref MediaException.ExceptionStruct ex){libvlc_media_player_stop(mediaPlayerHandle, ref ex);}//Dll调调调入[DllImport("libvlc")]private static extern MediaPlayerHandlelibvlc_media_player_new_from_media(MediaHandle libvlc_media_handle, ref MediaException.ExceptionStruct ex);[DllImport("libvlc")]private static extern void libvlc_video_set_parent(CoreHandle coreHandle,IntPtr hDT, ref MediaException.ExceptionStruct ex);[DllImport("libvlc")]private static extern voidlibvlc_media_player_play(MediaPlayerHandlemediaPlayerHandle, ref MediaException.ExceptionStruct ex);[DllImport("libvlc")]private static extern voidlibvlc_media_player_pause(MediaPlayerHandlemediaPlayerHandle, ref MediaException.ExceptionStruct ex);[DllImport("libvlc")]private static extern voidlibvlc_media_player_stop(MediaPlayerHandle mediaPlayerHandle, ref MediaException.ExceptionStruct ex);}//播放按调代调private void button1_Click(object sender, EventArgs e){string path = textBox1.Text;//调行播放的控件的句柄IntPtr hdl = this.panel1.Handle;//播放参数string[] argv = new string[] { "-I", "--ignore-config" };//vlc调象的调建MediaException.ExceptionStruct ex = newMediaException.ExceptionStruct();Core core = new Core(argv, ref ex);Media media = new Media(core.CoreHandle, path, ref ex);MediaPlayer player = new MediaPlayer(media.MediaHandle, ref ex);//回收垃圾GC.Collect();//播放player.VedioSetParent(core.CoreHandle, hdl, ref ex);player.Play(ref ex);//调调回收等相调操作垃圾GC.Collect();GC.WaitForPendingFinalizers();}//退出~调放private void button2_Click(object sender, EventArgs e){string path = textBox1.Text;//调行播放的控件的句柄IntPtr hdl = this.panel1.Handle;//播放参数string[] argv = new string[] { "-I", "--ignore-config" };//vlc调象的调建MediaException.ExceptionStruct ex = newMediaException.ExceptionStruct();Core core = new Core(argv, ref ex);Media media = new Media(core.CoreHandle, path, ref ex);MediaPlayer player = new MediaPlayer(media.MediaHandle, ref ex); GC.Collect();GC.WaitForPendingFinalizers();if (player != null){player.stop(ref ex);player.MediaPlayerHandle.Dispose();player = null;media.MediaHandle.Dispose();media = null;core.CoreHandle.Dispose();core = null;}}}第四步,调调~行。
VLC的C++封装
因为工作需要,研究了一段时间的播放器开发,如果从头开始做,可以学习下FFmpeg,很多播放器都是基于FFmpeg 开发的,但是这样工作量和难度都比较大,如果想很快能拿出一个播放器来用的,可以研究下开源的播放器,参考下射手播放器作者的文章:媒体播放器三大底层架构。
对比下现有的主流播放器:媒体播放器列表,VLC是在各个方面都表现很突出的一款。
VLC 是一款免费、自由、开源的跨平台多媒体播放器及框架,可播放大多数多媒体文件,DVD、音频CD、VCD 以及各类流媒体协议。
VLC是在Linux下用C语言开发的,如果想用其接口,可以将C的接口用C++封装一下,这样使用方便的很多,在CodeProject上搜到一个C++的封装,在他的基础上加了点函数,使用了最新的VLC版本(2.1.0),用MFC做成了如下的样子:
主要实现功能:
1、打开:加载音视频文件(同时开始播放)。
2、播放/暂停:播放暂停文件播放。
3、停止:停止播放。
4、快进:快进5秒。
5、快退:后退5秒。
6、音量:音量调节(0--100)。
7、播放进度控制:使用进度条控制。
基本上实现的功能和CodeProject上那个demo差不多,我修改后可以播放网络流媒体,将加载的文件名修改为流媒体地址就可以了。
播放上面双语字幕的文件时貌似不能正常显示中文,VLC播放器本身也有这个问题,不过可以设置修改。
其他更多的功能还有待研究,VLC的接口注释都很详细,按照它的接口应该可以实现更多的功能,有问题也可以直接在VideoLan的论坛上发帖问。
主要问题:运行时需要依赖的VLC的plugins目录里的DLL(66M大小)太多,有一些DLL是用不到的,如果封装成ActiveX给Web下调用,打包的cab的会比较大,需要裁剪。
VLC的C#封装
如果播放器客户端使用的是.Net开发的,如何使用VLC?可以有以下几种方法:
1、ActiveX控件:可以将上述MFC的播放器封装成ActiveX控件提供给C#调用。
鉴于业余时间有限,现在这部分工作还没做。
2、使用.Net的PInvoke技术将VLC的C接口封装成C#接口,这方面网上的文章也很多.。