当前位置:文档之家› 播放器的设计与实现 毕业论文范文-

播放器的设计与实现 毕业论文范文-

郑州大学毕业设计(论文)

题目:播放器的设计与实现

指导教师:职称:

学生姓名:学号:

专业:计算机科学与技术(软件工程)

院(系):信息工程学院

完成时间:2010年05月26 号

2010年05月26日

播放器的设计与实现

摘要

随着计算机的广泛运用,Internet的迅速发展,多媒体技术也是迅速发展。各种音频视频资源在网上随处可见,在人们的日常生活中,几乎不可或缺,于是各种播放器紧跟着发展起来。本文旨在通过在.net开发平台上开发一个简单的视频播放器的过程,了解播放器的功能实现,掌握播放器开发的相关技术,同时利用软件工程的相关理论知识,了解软件开发的方法与步骤。

首先,本文简单介绍下市场上流行的播放器,比如暴风影音等,然后了解这些播放器的功能,还有各种播放器播放的特别编码格式文件,分析各种编码格式的优缺点;其次选择在微软的.net开发平台上使用C#语言进行开发,编写出功能简单实用方便的播放器。主要包括以下几个方面:开发本软件所使用的开发平台与技术;功能模块;功能设计;功能实现等。最后,对本软件的开发过程进行简要总结,并介绍一下本人的体会和感想。

【关键词】:播放器;.NET;DirectX 9.0;C#

Design and implementation of video player

Abstract

Along with the computers are widely used, Internet rapid development and the multimedia technology is also developing rapidly. A variety of audio and video resources can be seen everywhere on the Internet, in people’s daily lives, almost indispensable, then all kinds of Player is developed. This paper aim at to understand the functions implementations of Player, to master the development technologies of Player, and use the theory of software engineering to understand the method and step of software develop, by means of the process to develop a simple video player in the development platform of .Net.

First of all, this paper introduce some popular players in brief on the market, such as storm video, etc., then to understand some functons of these players, all kinds of special coding format file they can play, to analyze the advantages and disadvantages of various coding formats; second I choose Microsoft .Net development platform and use the C # language to write a function of simple and practical and convenient player. Includeing the following main aspects: the development platform and technology of to develop this player; functional module; function design; function realization, etc. Finally, a brief summary of the software development process and some my experience and feelings are described.

【Keywords】:player;.NET;DirectX;C#

目录

第一章概述 (5)

1.1项目背景与意义 (5)

1.2市面流行播放器举例简介 (5)

1.2.1暴风影音 (5)

1.2.2风雷影音 (6)

1.2.3几种常见格式简介 (7)

1.3相关技术及开发工具介绍 (8)

1.3.1Visual Studio .Net集成开发环境简介 (8)

1.3.2C#语言简介 (9)

1.3.3DirectX SDK 9.0简介 (10)

第二章总体功能设计与实现 (12)

2.1功能设计 (12)

2.1.1 功能设计及描述 (12)

2.1.2 功能模块图 (13)

2.2功能实现 (13)

2.2.1 主界面实现 (13)

2.2.2 文件控制的实现 (15)

2.2.3 播放控制的实现 (16)

2.2.4 进度控制的实现 (19)

2.2.5 声音控制 (21)

2.2.6 显示控制的实现 (22)

2.2.7 系统说明 (24)

第三章总结 (26)

致谢 (27)

参考文献 (28)

第一章概述

1.1项目背景与意义

在2000年1月,使用媒体播放器(不论是离线播放器还是网络播放器)的家庭用户是3320万,到2001年1月猛增到4170万。在工作中使用媒体播放器的专业用户数量也较去年同期上升了34.9%,从2000年1月的1160万增加到2001年1月的1570万。而随着计算机的广泛运用,Internet 的迅速发展,多媒体技术也是迅速发展,各种音频视频资源在网上随处可见,于是播放器在人们的日常生活中,几乎是不可或缺的一部分。现在用户量更是庞大到不可思议的地步,比之九年前那是云泥之别。

但是现在的播放器一味追求花哨的外观,庞大的功能,比如一些多媒体播放器在播放网络视频时启动网络加速器,使其他网络用户造成网络堵塞,在目前网络速度很快的情况下这种损人利己的行为是不对的,也是没必要的。就是太多这些没必要的功能、花哨的外观等对用户的计算机造成很大的资源浪费,当用户进行多任务操作时带来很多不便。对于大多数的普通用户来说,很多功能、外观形同虚设,根本用不上。对于他们,他们的计算机来说,这些都是负担。

本人作为学习软件工程专业的一员,对软件工程,程序设计等理论知识有了较深的认识,同事也掌握了一定的软件开发理论,借助这次毕业设计,把这些理论知识付诸实践,结合上述情况,本人选择了开发一个简单方便易操作的个人音频视频播放器,能够播放常见的音频视频格式,满足一般用户听歌看电影的需求。但作为毕业设计,时间紧迫,加之本人没有任何软件开发的经验,他肯定存在许许多多不足之处,但对它的改善和对自己知识的完备不会随着毕业设计的结束而终止。

1.2市面流行播放器举例简介

本小节举例介绍下时下比较常见播放器,比如国产暴风影音、风雷影音等。比较分析它们的功能,及特有的解码功能等;还有再介绍下集中常见的编码格式以及它们的特点。

1.2.1暴风影音

暴风影音是暴风网际公司推出的一款视频播放器,该播放器兼容大多数的视频和音频格式。从2003年开始,5年来,暴风的工程师分析了数以十万计的视频文件,掌握了超过500种视频格式的支持方案。到2009年1月,暴风影音每天使用用户超过2200万,暴风影音成功的帮助了超过1亿5000

万的中国互联网用户轻松的观看视频。来自艾瑞的数据显示:截止2009年1月,暴风影音每天为互联网用户播放超过1.5亿个/次视频文件;每天,有2200万人点击蓝色的胶片图标,打开暴风影音这款软件;每天,通过暴风影音播放的视频文件占中国所有互联网视频播放量的50%。暴风影音已经成为中国最大的互联网视频播放平台。2008年7月,全新的暴风影音2008第一次涵盖了互联网用户观看视频的所有服务形式,包括:本地播放、在线直播、在线点播、高清播放等;

软件特色:通过自动侦测用户的电脑硬件配置;自动匹配相应的解码器、渲染链;自动调整对硬件的支持。它提供和升级了系统对常见绝大多数影音文件和流的支持,包括:RealMedia、QuickTime、MPEG2、MPEG4 (ASP/AVC)、VP3/6/7、Indeo、FLV 等流行视频格式;AC3/DTS/LPCM/AAC/OGG/MPC/APE/FLAC/TTA/WV 等流行音频格式;3GP/Matroska/MP4/OGM/PMP/XVD 等媒体封装及字幕支持等。暴风影音采用NSIS 封装,为标准的Windows 安装程序,特点是单文件多语种(目前为简体中文+ 英文),具有稳定灵活的安装、卸载、维护和修复功能,并对集成的解码器组合进行了尽可能的优化和兼容性调整,适合普通的大多数以多媒体欣赏或简单制作为主要使用需求的用户。

在兼容问题上,暴风影音和一些软件部相容,但问题不大,可以解决,但是要用户自己解决。比如安装暴风影音后,丽台电视卡无法使用,解决也很简单,下载安装该电视卡全套的最新版本驱动和电视播放软件即可(注意仅仅驱动是不行的,一定要包括播放软件);播放AVI的时候画面出错或CPU占有率奇高——解决方案:通常是解码器兼容问题;等等,虽然有点麻烦,但可以解决。

从以上简单的介绍可以看出,暴风影音整体还是个很强大,很好用的播放器。单个人看来,它仍然有一些问题。暴风影音截止到现在版本已经升级很多次了,几乎每次升级都添加了新功能,优化了某些功能,修正个别bug,到现在暴风能播放几百种格式的媒体文件,功能庞大。这些看似很好,但是对于一般用户来说看电影听音乐看网上视频能使用几种格式的文件,甚至有部分用户不能上网,对于这些用户来说绝大部分的功能是白费了,浪费资源而已。

1.2.2风雷影音

功能特色:独创双播放内核,更快速、更清晰、更流畅,国内首家独创真正双播放内核影音播放器,聚合MPlayer和MPC强大优势功能,实现快速解码,挑战最快

播放极限,播放影片更快速、更清晰、更流畅;全面支持高清影片播放(无需安装第三方软件),从2.1版本起,全面支持高清影片播放,且无需另外

安装第三方软件,全面支持HD-DVD/BD-DVD、VC-1、EAC3、EVO、TS、TP、MKV 等高清格式影片;独创高清智能连接技术、VC-1智能桥接技术、启用显卡硬解功能,充分发挥显卡硬解MPEG2,让高清播放更流畅;播放206种影音格式;多分层过滤解码,全面提升影片兼容播放,在双播放内核的基础上采用多分层过滤解码,保证不同格式不同编码的影片都能找到对应的分离器和解码器并顺畅播放,大大提升了影片播放的兼容性;智能连续剧播放,智能连续剧识别,无需多次选择播放连续剧影片,自动连续剧播放,让您不间断欣赏影片更顺畅、更舒心;跳过连续剧片头/片尾,在播放连续剧影片时,可以通过按F9/F10 来设置跳过连续剧的片头/片尾,让剧情播放无缝连接,等等。

从上述功能(并不完全,只是介绍一下特色功能)可以看出,风雷影音也是个很不错的播放器,特别是其在双播放内核、高清影音上别具特色。但是对于部分在网上看视频的用户来说有一点缺陷,它不支持在线播放(只提供对firefox浏览器进行常见流格式的在线播放支持插件)。

1.2.3几种常见格式简介

MPEG格式:它的英文全称为Moving Picture Expert Group,即运动图像专家组格式,家里常看的VCD、SVCD、DVD就是这种格式。MPEG文件格式是运动图像压缩算法的国际标准,它采用了有损压缩方法减少运动图像中的冗余信息,说的更加明白一点就是MPEG的压缩方法依据是相邻两幅画面绝大多数是相同的,把后续图像中和前面图像有冗余的部分去除,从而达到压缩的目的(其最大压缩比可达到200:1)。目前MPEG格式有三个压缩标准,分别是MPEG-1、MPEG-2、和MPEG-4。

AVI格式:音频视频交错(Audio Video Interleaved)的英文缩写。AVI 这个由微软公司发表的视频格式在视频领域已经存在好几个年头了。AVI 格式调用方便、图像质量好,但缺点就是文件体积过于庞大,压缩标准不统一。

RM格式:Networks公司所制定的音频视频压缩规范称之为Real Media,用户可以使用RealPlayer或RealOne Player对符合RealMedia技术规范的网络音频/视频资源进行实况转播,并且RealMedia还可以根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。这种格式的另一个特点是用户使用RealPlayer或RealOne Player播放器可以在不下载音频/视频内容的条件下实现在线播放。

RMVB格式:这是一种由RM视频格式升级延伸出的新视频格式,它的先进之处在于RMVB视频格式打破了原先RM格式那种平均压缩采样的方式,在保证平均压缩比的基础上合理利用比特率资源,就是说静止和动作场面少的画面场景采用较低的编码速率,这样可以留出更多的带宽空间,而这些带宽会在出现快速运动

的画面场景时被利用。这样在保证了静止画面质量的前提下,大幅地提高了运动图像的画面质量,从而图像质量和文件大小之间就达到了微妙的平衡WMV格式:一种独立于编码方式的在Internet上实时传播多媒体的技术标准,Microsoft公司希望用其取代QuickTime之类的技术标准以及WAV、AVI之类的文件扩展名。WMV的主要优点在于:可扩充的媒体类型、本地或网络回放、可伸缩的媒体类型、流的优先级化、多语言支持、扩展性等。

WMA格式:WMA的全称是Windows Media Audio,是微软力推的一种音频格式。WMA格式是以减少数据流量但保持音质的方法来达到更高的压缩率目的,其压缩率一般可以达到1:18,生成的文件大小只有相应MP3文件的一半。这对只装配32M的机型来说是相当重要的,支持了WMA和RA格式,意味着32M的空间在无形中扩大了2倍。此外,WMA还可以通过DRM(Digital Rights Management)方案加入防止拷贝,或者加入限制播放时间和播放次数,甚至是播放机器的限制,可有力地防止盗版。

MP3格式: MP3具有不错的压缩比,使用LAME编码的中高码率的mp3,听感上已经非常接近源WAV文件。使用合适的参数,LAME编码的MP3很适合于音乐欣赏。由于MP3推出年代已久,加之不错的音质及压缩比,不少游戏也使用mp3作事件音效和背景音乐。几乎所有著名的音频编辑软件也提供了对MP3的支持,可以将mp3像wav一样使用,但由于mp3编码是有损的,因此多次编辑后,音质会急剧下降,mp3并不适合保存素材,但作为作品的demo确实相当优秀的。mp3长远的历史和不错的音质,使之成为应用最广的有损编码之一,网络上可以找到大量的mp3资源,mp3player日渐成为一种时尚。不少VCD Player、DVD Player 甚至手机都可以播放mp3,mp3是被支持的最好的编码之一。MP3也并非完美,在较低码率下表现不好。MP3也具有流媒体的基本特征,可以做到在线播放。其音质好,压缩比比较高,被大量软件和硬件支持,应用广泛。适用于比较高要求的音乐欣赏。

1.3相关技术及开发工具介绍

本系统采用面向对象的软件开发办法,以Microsoft公司的可视化集成开发环境 Visual Studio .Net 作为开发平台,以C#作为开发语言实现预定的需求功能。

1.3.1Visual Studio .Net集成开发环境简介

.Net是Microsoft XML Web services 平台。.Net平台为创建新一代分布式Web应用提供了所有的工具和技术(表示技术、构件技术和数据库技术)。它支持标准的Internet协议,包括HTTP协议、XML(可扩展标记语言)和SOAP (简单对象访问协议),从而实现了异构系统间应用程序的集成和通信。.Net平

台包括5个主要部分:

Windows .Net

.Net企业级服务器

.Net Web服务构件

.Net Framework

Visual Studio .Net

Visual Studio .Net是为建立基于.Net Framework应用程序而设的一个可视化集成开发环境(Integrated Development Enviroment,IDE)。它提供了更优秀的多种编译语言的编辑和编译统一的开发平台,他是一个快速开发企业级Web 应用程序以及高性能桌面应用的工具。它为所有的编程语言提供了简单统一的代码编辑器,包括XML编辑器、HTML编辑器、SQL Server接口、以图形化的方法设计服务器构件的设计器、监控远程机器的Server Explorer。可以说,VisualStdio .Net集中了建立分布式应用所需的功能。使用此集成开发工具而不是用SDK编辑C#程序有以下主要原因:

IDE支持首行缩进,切c#程序的关键字等可用不同的颜色直观表示,以便检查。

IDE的语法导航功能可实现动态查找、提示编辑工程中的错误。

便于开发Windows应用程序。可以像Visual Basic一样直接拖放控件来“绘制”Windows窗体。

结合我要编写的程序播放器可知使用此集成开发环境更方便高效。

1.3.2C#语言简介

C#是一种现代的、面向对象的语言,它结合了C/C++和Visual C++的强大功能以及Visual Basic 的简单易用性。C#有以下新特性:

简单。C#做了些该进,使语言更简单。

面向对象。C#支持面向对象的三种编程原则:封装、继承和多态。

类型安全。C#去掉了指针,从根本上保证了程序的稳定性和类型安全。

版本控制。C#实现了版本技术,避免了“DLL灾难”。

兼容性。C#允许在遵守.Net Framework CLS 的条件下访问不同的API,可以与Windows的几种传统服务交互。

灵活性。C#允许声明一些不安全的方法和类,从而使用指针、结构和静态数组。

总之,C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模版,不允许多重继承)。C#综合了VB 简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首

选语言。

1.3.3DirectX SDK 9.0简介

D irect X其实是微软公司推出的一个为Windows平台的多媒体API函数库,它提供标准接口来与显卡和声卡、输入设备等进行交互。它可以让windows为平台的游戏或多媒体程序获得更高的执行效率,加强3d图形和声音效果,并提供设计人员一个共同的硬件驱动标准,让游戏开发者不必为每一品牌的硬件来写不同的驱动程序,也降低用户安装及设置硬件的复杂度。如果没有这组标准API函数库,那你就需要为每一种显卡、声卡的每个组合和每种类型的键盘、鼠标和游戏杆编写不同的代码。DirectX从具体的硬件中抽象出来,并且将一组通用指令转换成硬件的具体命令。这样开发语言通过调用统一标准的Direct X函数库就可以操作每一种显卡、声卡的每个组合和每种类型的键盘、鼠标和游戏杆等多媒体了。

Direct X SDK 9.0安装及类库介绍:.net Framework SDK中并没有包含Direct X SDK,所以为了顺利的完成本文后面介绍,必须先下载、安装Direct X SDK。安装完Direct X后,就会在存在"C:\WINDOWS\https://www.doczj.com/doc/c316087248.html,\Managed DirectX"这样一个目录,此目录中目录中应该有九个DLL文件和九个XML文件。九个DLL文件大致对应于DirectX中的十个命名空间。编程中就是使用其中的命名空间来提供对输入设备、声音、网络播放、图形等的支持。而开发本播放器的程序中只使用了命名空间“Microsoft.DirectX.AudioVideoPlayback”和“Microsoft.DirectX.DirectSound”。Microsoft.DirectX.AudioVideoPlayback命名空间主要就是支持播放音频和视频文件。Microsoft.DirectX.AudioVideoPlayback命名空间中定义了三个类:"Audio"、"Video"和"TextureRenderEventArgs"。其中前两个类是最常用的,分别用来支持音频和视频。本软件开发使用的也是前两个类。

下表就是本程序使用的Microsoft.DirectX.AudioVideoPlayback命名空间中定义的属性及其具体的作用:

表一

下表是本程序使用的Microsoft.DirectX.AudioVideoPlayback命名空间中定义的方法及其具体的作用:

表二

Microsoft.DirectX.DirectSound命名空间主要提供对声音的支持。在这个命名空间中我们只使用了SecondaryBuffer 类,此类包含用于管理起支持作用的声音缓冲器的方法和属性。

了解了以上和本程序有关的基础知识及开发本程序锁使用的有关技术后,下面开始介绍

本程序的具体功能和实现方法。

第二章总体功能设计与实现

在第一章中分析了播放器的功能需求及常见的视频音频编码格式,还有编写本程序使用的技术、工具等。那么从本章开始介绍本程序的功能设计与实现,本文将使用第一章中的技术等从功能设计、功能实现两方面重点介绍。

2.1 功能设计

参考上一章中介绍的播放器的功能,对其功能进行整理筛选,去掉那些华而不实或基本无用的功能,保留最实用最常用的功能,整合编写成本播放器。下面开始主要介绍本播放器的功能设计及描述、功能模块图等。

2.1.1 功能设计及描述

本播放器的主要任务和目的是播放一些常见的音频视频格式文件,达到功能简洁方便,消耗资源少而又不影响日常娱乐的需求。其主要划分为下面六个功能模块,每个功能模块的作用描述如下:

文件控制;主要用于打开播放文件,本程序支持的格式主要是rmvb、rm、avi、mpeg(mpg)、wmv视频格式和MP3、wma、wav音频格式,还有

管理播放列表:建立或删除播放列表。

播放控制;控制视频或音频的播放状态。播放状态有播放、暂停、停止三种状态。还有切换视频(音频),就是播放当前视频(音频)的前一个

视频(音频)或后一个视频(音频)。播放过的视频(音频)按播放顺序

自动显示在当前默认的播放列表中,默认的播放列表对播放过的记录不

进行保存,就是在关闭、重启播放器后以前的播放记录被清空。

进度控制;显示当前视频(音频)的总长度和已播放的长度,可以使用鼠标拖放进度条,跳跃式快速播放。显示是通过时间和进度条两方面同

步显示的。

声音控制;调整音量的大小,显示是否静音;调整声音的声道为左声道、右声道或正常。

显示控制;若播放的是视频文件则显示图像,可以调整屏幕是否为全屏,是否铺满屏幕或按原始比例播放,也可以使用鼠标拖动调整屏幕大小,

本播放器对屏幕有最小范围规定(非最小化),就是小到一定程度时屏幕

不能再缩小。最大屏幕为最大化(全屏除外)。

系统说明;关于(about)说明,提示说明本播放器的一些信息,比如播放器能播放的格式,播放器的开发人开发时间等。

2.1.2 功能模块图

其具体功能模块图如下:

2.2 功能实现

2.2.1 主界面实现

本节主要讲述如何根据上述的功能模块图实现具体的功能。

下图一为本播放器的原始界面,由Visual Studio中已安装模板Windows 应用窗体程序(winform)生成,所用的控件、组件、容器、菜单、工具栏、对话框等都是有Winform提供(如果所要使用的控件等没有提供,则需个人编写)。其中图片可以自己绘制,组件、控件等可用自己编写代码做成最适合自己要求的,这样做出来的东西色彩比较统一,界面比较美观大方,但那样做相当的麻烦,特别是编写新的组件、控件等有很多困难。编写本程序由于时间有限,图片是下载

的,所以在美观上有所欠缺。以后如有时间,另行绘制。由于界面是控件、组件

等拖放组成,大部分代码有窗体设计器自动生成,需个人改动的并不多,所用这

部分就不详细说明了,只把主窗体MainForm的代码示下。

图一

// MainForm

this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

this.BackColor = System.Drawing.Color.Black;

this.ClientSize = new System.Drawing.Size(555, 373);

this.Controls.Add(this.playListBox);

this.Controls.Add(this.controlPanel);

this.Controls.Add(this.playScreen);

this.Controls.Add(this.menuStrip);

this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));

this.MainMenuStrip = this.menuStrip;

this.MinimumSize = new System.Drawing.Size(560, 389);

https://www.doczj.com/doc/c316087248.html, = "MainForm";

this.Text = "久久影音";

this.Resize += new System.EventHandler(this.MainFormResize);

this.menuStrip.ResumeLayout(false);

this.menuStrip.PerformLayout();

this.controlPanel.ResumeLayout(false);

this.controlPanel.PerformLayout();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.pauseButton)).EndInit();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.pictureBoxCenter)).EndInit();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.pictureBoxRight)).EndInit();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.pictureBoxLeft)).EndInit();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.pictureBoxFill)).EndInit();

((https://www.doczj.com/doc/c316087248.html,ponentModel.ISupportInitialize)(this.movieTrack)).EndInit();

this.ResumeLayout(false);

this.PerformLayout();

2.2.2 文件控制的实现

打开文件的功能是许多应用程序的一个常见任务。Windows Forms命名空间包含了一组常用对话框,支持这些类型的活动。在本程序中我们使用的是

OpenFileDialog类,OpenFileDialog类表示常用的文件对话框,用于从磁盘上加

载一个或多个文件,是用于打开现有文件的标准类。Filter属性定义了这个对话

框可用看到的文件类型列表,本程序中它来显示可用播放的文件列表。部分实现

代码如下:

OpenFileDialog dlg = new OpenFileDialog();

dlg.Filter = "Movies (*.avi, *.mpg(mpeg), *.wmv,*.rmvb,*.rm,*.mp3,*.wma)

|*.avi;*.mpg;*.wmv;*.rmvb;*.rm;*.mp3;*.wma|All files (*.*)|*.*";

dlg.InitialDirectory = "C:\\\\";

dlg.RestoreDirectory = false;

dlg.Title = "打开";

if (dlg.ShowDialog() == DialogResult.OK)

{

//如果存在已播放的Video,释放它

if(MyVideo != null )

MyVideo.Dispose();

PlayTheMovie(dlg.FileName);

}

Windows窗体ListView 控件显示了带图标的项的列表。可使用列表视图创建类似于Windows 资源管理器右窗格的用户界面。该控件有四种视图模式,

“LargeIcon”、“SmallIcon”、“List”和“Details”。本播放器的播放列表就是使

用ListView控件建立,使用的是列表视图模式(List模式)显示小图标,总是

显示在单列中。见下图二。

当播放视频(音频)时,视频(音频)会自动显示在默认的播放列表中,代码如下,这行代码出现在播放函数中:

playListView.Items.Add(theMovieName);

创建播放列表其实就是创建一个包含想要播放的视频(音频)名称的文件,然后在这个文件中添加或删除视频(音频),这里使用的是File类中Create

方法。其部分代码如下:

string path = @"c:\久久影音\MyPlayList.txt";

if (File.Exists(path))

File.Delete(path);

using (FileStream fs = File.Create(path))

Byte[] info = new UTF8Encoding(true).GetBytes("This is some text in the file.");

图二

2.2.3 播放控制的实现

播放才是一个播放器最重要的功能。由上章可知Microsoft.DirectX.AudioVideoPlayback命名空间中定义的属性和方法为这块功能的实现提供了很大的便利,比如播放、暂停、停止函数都有提供,详见上一章表一表二。但是在调用这些函数之前还有很多工作需要做。参照下面播放函数PlayTheMovie(string theMovie)部分代码进行分析:

string theMovieName = theMoive;

initialClientWidth = this.ClientSize.Width; //获取窗体工作区的宽度

VideoDefaultSize = MyVideo.DefaultSize; //获取Video的缺省的视频大小

int width = Math.Max(VideoDefaultSize.Width, initialClientWidth); //获取

Video的缺省的宽度和窗体工作区的

宽度较大的一个值

int height = VideoDefaultSize.Height; //获取 Video 的缺省的高度

//重新设置播放视频的视频大小

if (width >= 800)

{

width = (int)(width * 0.55f);

height = (int)(height * 0.55f);

}

this.ClientSize = new Size(width, height + menuStrip.Height +

controlPanel.Height);

MyVideo.Owner = this.playScreen;

上面的代码其实就是重新设置视频和初始播放窗口的大小。刚启动播放器时播放窗口(整个播放器界面)是固定大小的(见图一),但加载视频以后,播放窗口的大小被设置为和视频的缺省值(MyVideo.DefaultSize)一样。经过DirectX 解码后的视频缺省和播放窗口(Owner)的大小并不一样大,有的比播放窗口小,大部分比播放窗口大,甚至比播放窗口大的多,这时需要对视频大小进行调整,按正常比例缩放适应在设置好的播放窗口。

在本程序中,当加载视频后,获取视频缺省值的大小(宽和高)和播放窗口的宽度,然后比较并获取视频缺省的宽度和播放窗口宽度中较大的一个(width),大部分情况下是视频的缺省宽度比较大,再把播放窗口的大小初始化为视频缺省高度(height)和width的0.55倍。这个倍率比较合适,使播放屏幕不至太大或太小。见图二、图三。

有了合适的播放屏幕还不完整,因为此时播放屏幕还不能任意调整大小,视频也不一定显示在播放屏幕的中间。下面的mainFormResize事件调用就是解决这个问题的,详见显示控制模块中屏幕调整功能实现。下面这几行代码的作用就是在上面设置好的播放窗口中把视频显示在播放屏幕的中间,并在播放器的顶端显示视频的名称及视频格式。见图二、图三、图四的顶端显示。

If (playListView.Visible == true)

mainFormResize(null, null);

else

MainFormResize(null, null);

int LastIndex = https://www.doczj.com/doc/c316087248.html,stIndexOf(@”\”);

theMovieName = theMovieName.Substring(LastIndex + 1,

(theMovieName.Length – LastIndex – 1));

this.Text = theMovieName;

在播放视频(音频)过程中,我们都期望能看到视频的总长度以及已经播放的长度。本程序中我们是使用movieTimer组件计时的。视频的总长度是死的,我们只需调用Video的属性Duration即可知道视频的总长度,然后把其转换为

string格式显示即可。见图二。代码如下:

//显示视频的总长度(总时间)

MovieDuration = (int)MyVideo.Duration;

hours = MovieDuration / 3600;

minutes = (MovieDuration - hours * 3600) / 60;

seconds = (MovieDuration - hours * 3600 - minutes * 60);

string hHour = ("00" + hours.ToString());

hHour = hHour.Substring(hHour.Length -2, 2);

string mMinute = ("00" + minutes.ToString());

mMinute = mMinute.Substring(mMinute.Length - 2, 2);

string sSecond = ("00" + seconds.ToString());

sSecond = sSecond.Substring(sSecond.Length - 2, 2);

movieDuration = hHour + ":" + mMinute + ":" + sSecond;

totalTime.Text = "/" + movieDuration;

MyVideo.Play();

movieTimerEnabled = true;

movieTimer.Start();

movieTrack.Value = 0;

pauseButton.Visible = false;

playListView.Items.Add(theMovieName);

上面几行代码则是调用函数,开始播放、计时,进度条开始移动,并把视频名称添加到播放列表里。

视频的总长度很好计算、显示,但是视频当前长的需要另行计算。视频当前长度的计算、显示和总长度的计算、显示很相似,只是调用的属性不同而已。这里我们调用的是CurrentPosition属性,此属性是用来获取活设置播放的当前位置。另外视频的当前长度和进度条也是同步显示,这部分功能则需要另外算法。先获取视频的总长度;然后获取视频的总长部和进度条长度(movieTrack.Maximum)的比值,表示进度条单位长度上的视频长度;再用当前视频长度比上这个比值就得到当前视频长度对应的进度条长度,把其赋值给Value显示出即可。分代码如下:

float calibrationTime;

MovieDuration = (int)MyVideo.Duration;

calibrationTime = (float)((float)MovieDuration /

(float)movieTrack.Maximum);

MovieCurrentPosition = (int)MyVideo.CurrentPosition;

movieTrack.Value = (int)(MovieCurrentPosition / calibrationTime);

至于播放、暂停、停止功能则很容易实现,这些功能实现所使用的函数在Microsoft.DirectX.AudioVideoPlayback 命名空间中都有提供,详细情况请参看上一章。

在本程序中,这三个功能分别有三个按钮,其中播放、暂停按钮是重叠在一起的,当视频处在其中一个状态时,另一个状态的按钮就隐藏不显示。见图二、图三下面按钮区。这三个功能分别是使用三个Button事件实现的:对于播放、暂停功能先判断视频是否为空,为空则各功能按钮不可交互(Enabled;鼠标点击无反应),不为空时若点击暂停按钮时,触发播放事件,终止暂停开始播放,显

示播放按钮标志,若点击播放按钮时触发暂停事件终止暂停开始暂停,显示暂停按钮;对于停止功能则先判断视频是否为空,为空各功能按钮不可交互,不为空则判断视频是否处于停止状态,若停止状态(Stopped)停止按钮不可交互,非停止状态才可点击停止按钮,触发停止事件,调用停止函数(Stop())。

这部分功能在菜单项中“播放”的下拉菜单中也有实现,实现方式很相似,只是播放、暂停功能实现多了一道步骤:先判断视频的状态,播放(Playing)还是暂停(Paused)状态,然后才是根据不同状态调用不同函数。这部分功能亦设有快捷键,暂停/播放的快捷键是Alt+空格键,停止的快捷键是Ctrl+S。

下面只举一个暂停功能实现的代码例子(这是点击播放按钮时执行的代码),其部分代码如下:

if (MyVideo != null)

{

pauseButton.Enabled = true;

playButton.Enabled = false;

MyVideo.Pause();

pauseButton.Visible = true;

playButton.Visible = false;

}

至于实现播放当前视频的上一个下一个视频已不难。先判断当前视频在其所在的播放列表里是否第一个或最后一个,若是第一个则不能播放其上一个,若是最后一个则不能播放其下一个,否则把当前视频的上一个或下一个视频名称作为参数传给播放函数PlayTheMovie。这部分实现比较方便,代码就不再累述。

2.2.4 进度控制的实现

进度控制的实现其实在上节就略有提及,其实就是把进度条和当前播放长度同步结合起来,并能使用鼠标随意拖放进度条进行选择性播放。这里选择使用了Windows Forms提供的TrackBar控件实现这个功能。

TrackBar是可滚动控件,可以通过以下方式配置跟踪条的Value属性值滚动的范围:通过设置Minimum 属性指定该范围的下限,设置Maximum 属性指定该范围的上限。本程序对Minimum的值设为默认值0,Maximum的值设为10000。其事件ValueChanged在跟踪条的Value 属性由于滚动框的移动或者由于代码中的操作而更改时发生。

而本程序中就是通过改变Value的值实现进度条和当前播放时间的同步,代码见上节最后部分。当鼠标拖动进度条时也就是跟踪条的Value属性值发生变

化,此时事件ValueChanged发生。在实现这个功能时还需用到

Microsoft.DirectX.AudioVideoPlayback中Video类的SeekCurrentPosition属性。这个属性实现从指定位置播放的功能,其有两个参数,一是位置,二是寻址方式。位置是浮点型的,注意这里以10000000 之一秒为单位,所以以秒为单位需要乘以10000000。代码和上节最后部分的代码很相似,只不过当事件ValueChanged发生时才执行。参看图二,图三进度条。其部分代码如下:float calibrationTime;

MovieDuration = (int)MyVideo.Duration;

calibrationTime = (float)((float)MovieDuration /

(float)movieTrack.Maximum);

MovieCurrentPosition = (int)MyVideo.CurrentPosition;

movieTrack.Value = (int)(MovieCurrentPosition / calibrationTime);

MyVideo.SeekCurrentPosition(MyVideo.CurrentPositon * 10000000,

SeekPositionFlags.AbsolutePositioning)

图三

相关主题
相关文档 最新文档