当前位置:文档之家› 毕业论文范文 (1)

毕业论文范文 (1)

文本复制检测报告单

打印 保存

№:ADBD2013R_2013041914404820130419235754401328683710 检测文献 基于C#的视频播放器设计 作 者

检测范围

中国学术期刊网络出版总库

中国博士学位论文全文数据库/中国优秀硕士学位论文全文数据库 中国重要会议论文全文数据库 中国重要报纸全文数据库 中国专利全文数据库 大学生论文联合比对库 互联网资源

英文数据库(涵盖期刊、博硕、会议的英文数据以及德国Springer 、英国Taylor&Francis 期刊数据库等) 港澳台学术文献库 优先出版文献库

时间范围 1900-01-01 至 2013-04-19 检测时间

2013-04-19 23:57:54

总文字复制比:11.8%

( 表格 )

( 观点 )

去除引用:11.8%

去除本人:11.8%

重合字数:2428

文献总字数:20597

总段落数: [ 2 ] 疑似段落数: [ 1 ] 疑似段落最大重合字数: [ 2428 ]

前部重合字数: [ 212 ]

后部重合字数: [ 2216 ]

疑似段落最小重合字数: [ 2428 ]

16.4% 基于C#的视频播放器设计_第1部分(总14833字) 0%

基于C#的视频播放器设计_第2部分(总5764字)

( 注释: 无问题部分

文字复制比部

引用部分 ) 基于C#的视频播放器设计_第1部分 总文字复制比:16.4%(2428) 总字数:14833

1 ·基于MPEG-4的视频水印技术的研究与实现

李逸(导师:蒋朝惠) - 《贵州大学硕士论文》- 2009-05-01

14.4% 是否引用:否 2 ·WMP10会在本周发布? - Jack 的blog - 硬件软件咨询,IT 新闻 - 《网络(http://blog.donews.c )》- 2012-06-12

1.4% 是否引用:否 3 ·Windows Media Player 10.0 简体中文版_中国电脑维修联盟 - 电脑维修行业门户 - 《网络(http://download.wxiu )》-

1.4% 是否引用:否 4 ·

IT 下载 https://www.doczj.com/doc/b66229824.html, 1.4%

吉林大学珠海学院毕业论文(设计)

基于C#的视频播放器设计

The Video Player Based on C# Design

完成日期2013年01月24日

吉林大学珠海学院本科毕业论文(设计)开题报告

基于C#的视频播放器设计

摘要

视频播放软件是人机交流的一种形式,里面可以包含大量信息,包括声音、图形图像、视频等。是一种重要的人机交互模式。它做到了把人见到的、听到的、想到的再现在电脑里,而且依照个人的要求与需求,以各种格式、频率、分辨率通过电脑再现或展现出来。

就视频与音频在国内外的应用,在各大媒体和网站上就可以体现。人们用播放器更加容易的展示于传达了信息,将需要传达的视频、音频传达并且基于播放器来再现出来,使人们更加容易方便的获取所需信息。

本选题的意义在于通过研究视频播放器来了解这种人机互动的过程。视频播放器是一种播放数字信号形式存储的视频的软件,此次选用的是在Windows系统下以C#作为平台来研究视频播放器。此次主要研究其目标是通过了解Window s Media Player将所需要播放的视频、音频播放是如何出来的,从此设计出播放器模块之间的调用关系,即用户的播放操作。了解播放后如何进行暂停、停止操作,当视频播放的时候如何进行快进快退,播放位置的处理,并且判断当视频停止的时候判断当前是否可以播放上一个或者下一个,并且对视频的音量进行操作。最后了解它是如何实现将文件由电脑可识别的代码转换成人类可理解的音频视频,并且了解解码器在其中的是如何将数字信号给进行解码而使播放器可以播放这种数字信号的。

关键词: 视频播放器;解码器;解码;模块;人机交互;数字信号

The Video Player Based on C#

Abstract

The video player software is a form of human-machine communication, which can contain a lot of information, i ncluding sound, graphics, images, video, etc.. Is an important mode of human-computer interaction. It did the people se e, hear, think of and then the computer now, and in accordance with the requirements and needs of the individual, thro ugh the computer in various formats, frequencies, resolution reproduction or unfolded.

Video and audio applications at home and abroad, can be reflected in the major media and website. The player display easier to convey information, will need to convey the video, audio communication and is based on the player t o reproduce, make people easier and more convenient to obtain the required information.

The significance of the topics is to study the video player to understand this process of human-computer interacti on. The video player is a play digital signals stored in the form of video software, the choices are in the Windows sy stem in C # as a platform to study the video player. The main research goals for Windows Media Player will want to play video, audio player is out, from design the player module calls between user playback operation. Understand how to play after pause, stop the operation, when the video playback, fast forward and rewind, play position processing, an d to determine when the video stops when the judge that you can play on one or the next, and the volume of the vid eo operation. Finally, to understand how it is to achieve human-perceivable audio and video file can be identified by th e computer code conversion, and understand the decoder in which digital signal to decode the player can play the digit al signal.

Key words:Video Player;decoder;decoding;module;Human-Computer Interaction;digital signal

目录

1 绪论 (1)

1.1 研究背景 (1)

1.2 研究环境简介1

1.2.1 COM组件概述 (1)

1.2.2 axWindowsMediaPlayer概述 (2)

1.2.3 Xvid视频解码器概述 (2)

2 需求分析 (3)

2.1 系统需求3

2.2 需求分析3

2.3 系统功能分析图4

2.4 系统模块组成4

2.4.1 系统功能模块 (4)

2.4.2 系统功能模块的实现 (5)

2.4.2.1 声音模块 (5)

2.4.2.2 打开模块 (6)

2.4.2.3 播放模块 (6)

2.4.2.4 暂停模块 (6)

2.4.2.5 停止模块 (7)

2.4.2.6 上一个模块 (7)

2.4.2.7 下一个模块 (7)

2.4.2.8 快进模块 (7)

2.4.2.9 快退模块 (8)

2.4.2.10 进度模块 (8)

2.4.2.11 播放位置模块 (9)

2.4.2.12 显示音量模块 (9)

2.4.2.13 改变音量模块 (9)

2.4.2.14 音量加模块 (9)

2.4.2.15 音量减模块 (10)

2.4.3 解码器 (10)

2.4.3.1 版本 (11)

2.4.3.2 像素幅型比 (11)

2.4.3.3 色场空间 (11)

2.4.3.4 帧类型 (12)

2.4.3.5 全局变量 (12)

2.4.3.6 创建解码器 (13)

2.4.3.7 解码 (14)

2.4.3.8 销毁解码器 (16)

3 总体设计 (18)

3.1 系统结构图19

3.2 总体功能设计19

3.2.1 系统设计目标 (19)

3.2.2 Windows Media Player的总体设计 (19)

3.2.3 系统解码器的连接 (19)

3.2.4 与解码器相关的模块连接 (21)

3.2.5 进度模块和播放位置模块与计时器的连接 (22)

4 Windows Media Player的设计与实现 (24)

4.1 界面设计24

4.2 主界面模块25

4.3 播放模块与暂停模块26

4.4 快进模块、快退模块与上一个、下一个模块26

4.5 停止模块27

4.6 进度模块27

4.7 播放位置模块27

4.8 改变音量模块与音量加减模块28

4.9 显示音量模块28

5 结束语 (29)

参考文献 (31)

致谢 (32)

1 绪论

1.1 研究背景

如今,影音播放已成为人们生活中必不可少的一部分,无论电视、网上、手机、电脑都可以进行影音播放,越来越多的播放器和播放方式出现在人们的生活中。由于各家播放器注重的方面不一样而使各个播放器的功能有所差异,但所有基础的功能都是进行视频音频的播放,并且在一些游戏中也穿插着有关游戏的视频音乐播放。因此为了研究视频音频是如何在电脑与网上实现的播放而进行了此次研究。

此次研究对视频播放器最基本的功能在多种方式下进行了解与研究,包括开始、暂停、停止、音量等操作。并且对Windows自带的Windows Media Player(简称WMP)进行了研究。

1.2 研究环境简介

该视频播放器研究是对C#的COM组件中的axWindowMediaPlayer控件(电脑单机播放视频)进行研究的,并且对解码器进行的了解。COM组件是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下,可以开发出各种各样的组件,然后将它们按照需要组合起来,构成复杂的应用系统。在本次对Windows Media Player研究与设计中,是在Windows 7操作平台上进行的。

1.2.1 COM组件概述

COM,是一种组件对象的模型,是关于怎样建立组件以及怎样通过组件生成可执行程序的一个标准,COM组件由以Windows 系统中动态连接库或可运行文件形式发布的可执行代码所组成。遵照COM标准编写出来的组件将能够满足对组件结构的所需要求。COM组件可以给应用程序、操作系统以及其他组件提供服务;自定义的COM组件可以在运行时与其他组件连接起来构成其可运行程序;COM组件可以动态的插入或跳出其应用。[3]

1.2.2 axWindowsMediaPlayer控件概述

ax WindowsMediaPlayer控件是微软公司基于DirectShow 基础之上开发的媒体播放软件。它提供最广泛、最方便、最具可操作性的多媒体内容。可以播放更多的文件类型,包括:Windows Media (即以前称为NetShow的), ASF, MPEG-1, MPEG-2, WAV, AVI, MIDI, VOD, AU, MP3, 和QuickTime 文件。所有这些都用一个操作简单的应用程序来完成。

1.2.3 Xvid视频解码器概述

视频解码器是能对数字视频进行解码压缩的工具。视频和音频都需要一种可定制的压缩方法。Xvid是一种视频解码器,是一款开放源代码的MPEG-4视频解码器,Xvid主要用于MPEG-4视频压缩,早期的Xvid version0.9x版本实现了MPEG-4 simple profile(SP)的解码,后在Xvid version1.0x中引入了MEPG-4 的advanced simple profile(ASP) Xvid最突出的特点是在很高的压缩率下还能解码出质量很好的图像。Xvid是第二代的MPEG4 视频解码的核心, Xvid的各种算法设计都是有代表性的,如动态关键帧距、运动侦测等等。Xvid提供了多极运动侦测精度, 包括半像素插值(half pixel interpolation) 的技术以16x16 像素的微区块为单元标示上运动向量、8x8 的像素区块为单元的纪录运动向量等等。

由于Xvid的一系列的优点,使Xvid成为了目前世界上最流行的编解码器,而且它的开源特性让它更受一些开发者得青睐。Xvid的MPEG-4视频解码算法结构清晰、定点算法,非常适合硬件平台来实现。Xvid是目前MPEG-4算法算是在开源代码中最优秀的工程实现。并且在一方面Xvid已经针对大部分的CPU做了程序方面的优化,另一方面为其他平台移植提供了技术方向。

2 需求分析

视频播放器是操作系统上常用的软件,通过对现有一些常用的视频播放器进行了解,根据对它们的应用综合总结出它们的具体的共同特点。

作为一个最基本的视频播放器应有可视化图形操作界面,用来进行人机交互,达到播放视频、音频的目的。要做到界面分配合理,操作方便、简单,并且具有可维护性、移植性。

2.2 需求分析

根据系统分析,视频播放器的要求如下:

1. 系统需求分析:

(1)可以播放视频或者音频;

(2)视频要完全在界面中显示出来;

(3)可以对视频音频做出最基本的操作,例如开始、暂停、停止等;

2. 系统性能要求:

(1)系统安全、可靠;

(2)美观性:界面分布合理,方便操作;

(3)可移植性:适应大部分系统;

(4)可用性:操作简单,适用于大部分人群;

(5)流畅性:运行流畅,不会出现卡机;

(6)可维护性:便于维护;

(7)尽量节约资源,并且播放时候尽量不占用CPU。如果软件结束,应从后台退出;

3. 解码器要求:

(1)可以满足大部分视频的解码;

(2)可移植性,适应大部分系统;

(3)尽量节约资源,如果软件结束,应从后台退出;

2.3 系统功能分析图

下图是列出了Windows Media Player系统基本的功能权限。

视频播放器系统普通用户播放已停止视频/音频暂停播放视频/音频停止暂停调节音量大小调节静音与非静音显示播放时间音量调节显示播放速度计时器读入视频、音频进度条播放停止播放视频/音频快进播放视频/音频快退快进快退播放视频/音频解码器解码退出注销解码器释放空间图2-1 系统功能分析图

2.4 系统模块组成

此次研究有一个主界面,主界面以下由八个功能模块组成:播放、暂停、停止、音量调节、计时器、进度条、快进、快退。

2.4.1 系统功能模块

八个功能模块实现了一下基本功能:

播放:继续播放当前文件

暂停:暂停播放当前功能

停止:停止当前播放的文件

音量调节:音量调节,包括大小音量与是否静音

计时器:计算视频时间,包括总时间和播出的时间

进度条:显示当前播放位置

快进:对所操作文件进行快进

快退:对所操作文件进行快退

axWindowsMediaPlayer控件有以下属性:

表2-1 axWindowsMediaPlayer控件属性表[7]

2.4.2 系统功能模块的实现

private void Form1_Load(object sender, EventArgs e)

{

this.tbarVolume.Minimum = 0;

this.tbarVolume.Maximum = 100;

this.tbarVolume.Value = this.axWindowsMediaPlayer1.settings.volume;

}

此段模块是对声音控制来进行设定的,如上面控件属性所述,使音量最大值设置为100,最小值设置为0,保证在范围之内。并且对axWindowsMediaPlayer1的属性设定进行在右键里进行设定:常规→控件布局→选择模式→None。

2.4.2.2 打开模块

private void button5_Click(object sender, EventArgs e)

{

OpenFileDialog openFileDialog = new OpenFileDialog();

openFileDialog.Multiselect = true;

openFileDialog.Filter = "Mp3文件|*.mp3|Wav文件|*.wav|Wma文件|*.wma|Mp4文件|*.mp4|Rmvb文件|*.rmvb|所有格式|*.*";

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

{

axWindowsMediaPlayer1.currentPlaylist =

axWindowsMediaPlayer1.newPlaylist("列表", "");

foreach (string fn in openFileDialog.FileNames)

{

axWindowsMediaPlayer1.currentPlaylist.appendItem(axWindowsMediaPlayer1.newMedia(fn));

}

}

axWindowsMediaPlayer1.Ctlcontrols.play();//play为播放的方法

}

这个模块是实现了视频与播放器的连接,在里面加入了可以识别的文件扩展名。并且是可以同时使用多个视频、音频同时加入创建好了的“列表”里面,列表里的foreach做到了遍历列表,挨个播放所需要播放的文件。并且显示了播放器可以支持的文件类型,并且开始播放。

2.4.2.3 播放模块

private void toolStripButton2_Click(object sender, EventArgs e)

{

axWindowsMediaPlayer1.Ctlcontrols.play();

}

该模块实现了对视频播放的操作

2.4.2.4 暂停模块

private void toolStripButton4_Click(object sender, EventArgs e)

{

axWindowsMediaPlayer1.Ctlcontrols.pause();

}

该模块实现了对视频暂停的操作

2.4.2.5 停止模块

private void toolStripButton5_Click(object sender, EventArgs e)

axWindowsMediaPlayer1.Ctlcontrols.stop();

}

该模块实现了对视频暂停的操作

2.4.2.6 上一个模块

private void toolStripButton1_Click(object sender, EventArgs e)

{

axWindowsMediaPlayer1.Ctlcontrols.previous();

}

播放列表中上一个文件

2.4.2.7 下一个模块

private void toolStripButton3_Click(object sender, EventArgs e)

{

axWindowsMediaPlayer1.Ctlcontrols.next();

}

播放列表中下一个文件

2.4.2.8 快进模块

private void button7_Click(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.Ctlcontrols.fastForward();

}

可用于对视频进行快进操作

2.4.2.9 快退模块

private void button8_Click(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.Ctlcontrols.fastReverse();

}

可用于对视频进行快退操作

2.4.2.10 进度模块

private void timer1_Tick(object sender, EventArgs e)

{

double total=0.0d;

if (this.axWindowsMediaPlayer1.currentMedia != null)

{

total = Math.Ceiling(this.axWindowsMediaPlayer1.currentMedia.duration);

this.tbarPlayLoaction.Maximum = (int)this.axWindowsMediaPlayer1.currentMedia.duration;//设定了播放总长度的最大值

}

double cur = Math.Floor(this.axWindowsMediaPlayer1.Ctlcontrols.currentPosition);

if (total != 0)

{

this.progressBar1.Value = (int)(cur / total *100);

https://www.doczj.com/doc/b66229824.html,bel1.Text = cur.ToString()+"s" + "/" + total.ToString()+"s";

this.tbarPlayLoaction.Value = (int)(cur / total * total);

}

此模块是在Timer控件下进行操作的,用计时器来计算视频的总长度和播放长度,并且设置了总长度的最大值,防止溢出。

2.4.2.11 播放位置模块

private void tbarPlayLoaction_Scroll(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.Ctlcontrols.currentPosition = tbarPlayLoaction.Value;

}

对播放程度进行操作

2.4.2.12 显示音量模块

private void toolStripButton8_Click(object sender, EventArgs e)

{

int volume=this.axWindowsMediaPlayer1.settings.volume;

MessageBox.Show("音量:"+volume.ToString());

}

显示当前音量多大

2.4.2.13 改变音量模块

private void tbarVolume_Scroll(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.settings.volume = this.tbarVolume.Value;

}

设置音量可以改变从而进行以下2个模块的操作

2.4.2.14 音量加模块

private void button9_Click(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.settings.volume += 1;

int volume = this.axWindowsMediaPlayer1.settings.volume;

this.tbarVolume.Value = volume;

}

因为音量是整形切在0-100之间,音量加是递增的所以设置按键每次增加大小为1

2.4.2.15 音量减模块

private void button10_Click(object sender, EventArgs e)

{

this.axWindowsMediaPlayer1.settings.volume -= 1;

int volume = this.axWindowsMediaPlayer1.settings.volume;

this.tbarVolume.Value = volume;

}

同音量加,每次递减大小为1

2.4.3 解码器

图2-2 Xvid解码器的核心模块功能描述

2.4.

3.1 版本

Xvid中存在两个版本,一个是Xvid库本身的版本,即XVID_VERSION;另一个是Xvid的API接口的版本,即XVID_API。XVID_VERSION 定义为一个24 位的无符号整数;

XVID_API 定义为一个16位的无符号整数。

XVID_MAKE_VERSION(a,b,c)宏的作用是生成XVID_VERSION,其中a、b、c是Xvid的版本号中。

XVID_VERSION_MAJOR(a):用于从XVID_VERSION中抽取出$major版本号;

XVID_VERSION_MINOR(b):用于从XVID_VERSION中抽取出$minor版本号;

XVID_VERSION_PATCH(c):用于从XVID_VERSION中抽取出$patch版本号。

2.4.

3.2 像素幅型比

像素幅型比(Pixel Aspect Ration:PAR)表示的是屏幕上一个像素点的宽度和高度的比值。Xvid定义了对如下几种标准的像素幅型比的支持:

#define XVID_PAR_11_VGA 1 /* 1:1 vga正方形,默认情况下,如果提供PAR 则不是一个有效值*/

#define XVID_PAR_43_PAL 2 /* 4:3 pal (12:11 625-line) */

#define XVID_PAR_43_NTSC 3 /* 4:3 ntsc (10:11 525-line) */

#define XVID_PAR_169_PAL 4 /* 16:9 pal (16:11 625-line) */

#define XVID_PAR_169_NTSC 5 /* 16:9 ntsc (40:33 525-line) */

#define XVID_PAR_EXT 15 /* 扩展面值; 使用par_width, par_height */

视频应用中常见的像素幅型比有两种:4:3和16:9,后者目前更常用。PAL和NTSC。PAL规定的场率是50 场/秒(即25帧/秒),扫描线行数是525行;NTSC规定的场率是60 场/秒(即30帧/秒),扫描线行数是625行。

2.4.

3.3 色场空间

Xvid定义的色场空间比较多,常用的有XVID_CSP_I420、XVID_CSP_YV12、XVID_CSP_BGR、XVID_CSP_RGB 555、XVID_CSP_RGB565这样几种。

2.4.

3.4 帧类型

XviD 定义了如下帧类型:

图2-2 Xvid帧类型图

在解码的时候,常见的做法是根据帧类型的不同而进行不同的处理。XVID_TYPE_VOL、XVID_TYPE_IVOP、X VID_TYPE_PVOP、XVID_TYPE_BVOP较常用。

2.4.

3.5 全局变量

全局变量xvid_global()函数函数原型:

int xvid_global(void *handle, int opt, void *param1, void *param2);

功能:

1. 全局初始化;

2. 获取Xvid和全局信息;

3. 色场空间转换。

参数:

1. handle(处理),是一个句柄,代表着一个xvid global操作实例;

2. opt(选择),指定要执行的操作,对应于上面三种功能,opt分别可取XVID_GBL_INFO、XVID_GBL_INIT、XVID_GBL_CON VERT 这样三个值;

3. param1(参数),是对应操作的入口参数或者出口参数:

当opt为XVID_GBL_INIT时,param1是入口参数,应当为一个xv id_gbl_init_t类型的指针;

当opt为XVID_GBL_I NFO时,param1是出口参数,应当为一个xvid_gbl_info_t类型的指针;

4. param2,通常设置为NULL,其返回值:

成功:返回0;

失败:返回相应错误码<0。

2.4.

3.6 解码器函数

Xvid解码的核心函数是xvid_decore()。xvid_decore()的函数原型如下:

int xvid_decore(void *handle, int opt, void *param1, void *param2);

xvid_decore()函数的几个重要参数的分别是:

1. handle(处理),是一个句柄代表一个Xvid 解码操作实例;

2. opt(选择),指定xvid_decore()函数执行的操作。opt 操作如下:和xvid_global()函数不同,在执行解码操作时,必须先创建一个Xvid解码实例XVID_DEC_CREATE,然后进入解码循环XVID_DEC_DECODE,在解码循环完成之后应当销毁Xvid解码实例XVID_DEC_DESTROY;

3. param1(参数),是一个通用指针类型,具体应该指向什么根据opt 参数的取值而定,比如,当opt的值为XV ID_DEC_CREATE时,param1应该指向一个xvid_dec_create_t 类型的结构体;对于opt为XVID_DEC_CREATE和XV ID_DEC_DECODE的情形,param1都是必要参数;对于opt为XVID_DEC_DESTROY的情况,param1参数将被忽略,通常设置为NULL即可。

2.4.

3.6 创建解码器

在使用Xvid进行解码之前,必须先创建Xvid解码实例。创建xvid解码实例的具体做法是:

第一先初始化xvid_dec_create_t 类型的结构体,然后将其地址做为param1参数传递给xvid_decore()函数,将其中的opt参数指定为XVID_DEC_CREATE。第一个参数handle和param2参数都可以指定为NULL。

在xvid中xvid_dec_create_t 定义如下图所示:

图2-3 Xvid_dec_create_t定义图

在xvid_dec_create_t 的几个成员中:

1. 成员参数:version(版本);

2. width(宽度),是用于形容解码后的图像的宽度,但是如果事先知道设置的数据,我们就可以直接设置;如果不清楚设置内容,可直接设置为0。在xvid_dec_create_t 中,wid th是输入参数;

3. height(高度),是用于形容解码后的图像的高度,如果事先知道设置的数据,我们就可以直接设置;如果不清楚设置内容,可直接设置为0,height 是输入参数;

4. handle(处理):是一个句柄。一般在调用xvid_decore()这个函数创建Xvid解码的时候,都将xvid_decore()这个函数的第一个参数handle 设为NULL,在创建xvid 解码完成后再从xvid_dec_create_t 的handle 成员载入所得到的句柄。调用在xvid_decore()函数进行解码的时就可以直接使用数据。Handle成员是个输出参数。

xvid_decore()函数完成Xvid解码的创建动作之后,通过dec_handle = xvid_dec_create.handle;可以将创建的句柄指定给dec_handle。

2.4.

3.7 解码[11]

在创建了解码实例之后,接下来就是开始真正的解码了。解码也是通过xvid_decore()函数来完成的。解码要用到两个结构体类型:xvid_dec_frame_t和xvid_dec_stats_t ,xvid_dec_frame_t 指定给xvid_decore() 函数的param1参数,x vid_dec_s tats_t 指定给xvid_decore()函数的param2 参数。尽管param2是可选参数,但是通常情况下都是应该指定的,因为通过它才能知道解码过程的状态。此外,xvid_decore()函数的第一个参数handle 应该为创建Xvid解码实例时返回的xvid_dec_create_t 类型的结构体中的handle 成员。在进行解码操作时,xvid_decore()函数的opt 参数应当设置为XVID_ DEC_DECODE。

Xvid对xvid_dec_frame_t 类型的定义如下图所示:

图2-4 Xvid_dec_frame_t类型的定义图

xvid_dec_frame_t 中各个成员的作用如下:

general,是一个可选输入参数。这个参数的取值可以是下面这些标志取或的结果这些标志控制着解码器的某些功能:? XVID_LOWDELAY 以低延迟模式解码;

? XVID_DISCONTINUITY 以非连续模式解码;

? XVID_DEBLOCKY 去除亮度块状化;

? XVID_DEBLOCKUV 去除色差块状化;

? XVID_FILMEFFECT 添加影片效果;

? XVID_DERINGUV 去除色差“振铃”,要求开启去除块状化标志;

? XVID_DERINGY 去除亮度“振铃”,要求开启去除块状化标志;

? XVID_DEC_FAST 禁用后处理以减少CPU 使用;

? XVID_DEC_DROP 丢弃B帧以减少CPU 使用;

? XVID_DEC_PREROLL 尽可能快地解码,甚至不显示输出。

通常情况下,如果不需要上面的这些功能,可以将general 设置为0。

1. bitstream,是一个输入参数,指向要解码的输入流;

2. length,是一个输入参数,表明bitstream 所指向的输入码流的长度;

3. output,输入参数,是一个xvid_image_t 类型的变量,用来指定解码后的输出流。

xvid_image_t列举如下图所示:

图2-5 Xvid_image_t列举图

csp,是一个输入参数,指明输出应当采用的色场空间,如果想将输入图像进

行垂直翻转,那么可以将csp 指定为XVID_CSP_VFLIP;

? plane,输入参数,是一个数组,用来指向要输出的颜色平面——最多可以有

4 个输出平面。实际上,一个plane元素就指向一个输出缓冲区,用于存放相应的色彩平面。如果解码后的输出图像只有一个色彩平面,那么只使用plane[0];

? stride,输入参数,也是一个数组,用来指出每一个平面的步长,简单说步长就是一行像素点所占的空间大小,以字节为单位。如果有多个平面,可以为每个平面设置一个步长值。

xvid_decore()函数的另一个可选参数为xvid_dec_stats_t 类型的指针:xvid_dec_stats_t 类型中最重要的部分是dat a,这是一个联合,联合的两个成员分别是两个结构体,结构体vop描述了一个视频对象平面(Video Object Plane);而结构体vol 则描述了一个视频对象层(Video Object Layer)。

xvid_dec_stats_t 类型中,type成员的作用是用来确定解出来的帧的类型,有关帧的类型前面已做说明。当type的值为XVID_TYPE_VOL 时,data 联合中存放的是vol;当type 的值为XVID_TYPE_IVOP、XVID_TYPE_PVOP、XV ID_TYPE_BVOP、XVID_TYPE_SVOP 之一时,data 联合中存放的是vop。

vol 结构体中的各个成员如下:

1. general 中保存的是解码器解码时所采用的标志;

2. width 是解码出来的图像的宽度,以像素为单位;

3. height是解码出来的图像的高度,以像素为单位;

4. par 是解码出来的图像的像素幅型比;

如果解码后的图像不是标准的NTSC 或者PAL 幅型比,则par_width 和par_height就是实际所采用的像素幅型比。如果事先知道解出来的图像的大小,可以在创建Xvid解码实例的时候指定。解码后的图像的大小;如果不知道的话,Xvid 可以在解码的过程中知道解出来的图像的大小,这就是通过xvid_dec_stats_t 中的vol 结构体来实现的。

另外,通常情况下的做法是在一个循环中不断解码,根据解码的状态决定对解码得到的码流如何处理。比如,如果解码正常,那么可能会将得到图像通过显示设备输出或者保存到文件中。而如果解码得到的是vol,那么可能会根据需要调整输出图像缓冲区的大小,等等。

2.4.

3.8 销毁解码器

销毁Xvid解码实例比较简单。方法如下:将xvid_decore()函数的第一个参数handle 设为创建Xvid解码实例后得到的句柄;第二个参数opt 设置为XVID_DEC_DESTROY;参数param1和param2都设为NULL。销毁Xvid解码实例之后,不能再通过其对输入码流进行解码。[11]

示例代码:

xvid_decore(dec_handle, XVID_DEC_DESTROY, NULL, NULL);

上述代码中的第一个参数dec_handle 是创建Xvid解码实例之后得到的。关键语句如下图所示:

图2-6 销毁解码器关键语句图

对应创建编码器工作,释放申请的所有内存,删除解码器句柄。从宏块结构体开始删除,依次释放参考帧的空间,最后删除临时帧与当前帧,最后释放删除整个解码器,解码结束停止播放。

3 总体设计

3.1 系统结构图

视频播放器基本系统结构图设计如下:

视频播放器系统解码器用户区播放模块音量加减模块播放位置模块进度模块改变音量模块下一个模块上一个模块快退模块快进模块停止模块暂停模块显示音量模块视频显示界面用户可操作部分用户不可操作部分图3-1 系统结构图

3.2 总体功能设计

3.2.1 系统设计目标

系统总的设计是达到以下目标:

* 系统的总目标是达到单机电脑对视频、音频进行播放的目的。

剽窃文字表述

1. WindowsMediaPlayer控件是微软公司基于 DirectShow 基础之上开发的媒体播放软件。它提供最广泛、最方便、

最具可操作性的多媒体内容。

2. 之前,必须先创建 Xvid解码实例。创建xvid解码实例的具体做法是:第一先初始化xvid_dec_create_t 类型的

结构体,然后将其地址做为param1参数传递给xvid_decore()函数,将其中的opt参数指定为XVID_DEC_CREATE。

第一个参数handle和param2参数都可以指定为NULL。

3. 创建Xvid解码的时候,都将xvid_decore()这个函数的第一个参数 handle 设为 NULL,在创建 xvid 解码完成后

再从

4. 解码也是通过xvid_decore()函数来完成的。解码要用到两个结构体类型: xvid_dec_frame_t和

5. tats_t 指定给xvid_decore()函数的param2 参数。尽管param2是可选参数,但是通常情况下都是应该指定的,

因为通过它才能知道解码过程的状态。此外,

6. 中的 handle 成员。在进行解码操作时,xvid_decore()函数的 opt 参数应当设置为XVID_DEC_DECODE。 Xvid对

xvid

7. bitstream,是一个输入参数,指向要解码的输入流; 2. length,是一个输入参数,表明 bitstream 所指向的输

入码流的长度; 3. output,输入参数,是一个 xvid_image_t 类型的变量,用来指定解码后的输出流。

8. xvid_dec_stats_t 类型中,type成员的作用是用来确定解出来的帧的类型,有关帧的类型前面已做说明。当 type

的值为 XVID_TYPE_VOL 时,data 联合中存放的是 vol;当 type 的值为 XVID_TYPE_IVOP、XVID_TYPE_PVOP、XVID_TYPE_BVOP、XVID_TYPE_SVOP 之一时,data 联合中存放的是 vop。 vol 结构体中的各个成员如下: 1.

general 中保存的是解码器解码时所采用的标志; 2. width 是解码出来的图像的宽度,以像素为单位; 3. height 是解码出来的图像的高度,以像素为单位; 4. par 是解码出来的图像的像素幅型比;如果解码后的图像不是标准的

9. 如果事先知道解出来的图像的大小,可以在创建 Xvid解码实例的时候指定。解码后的图像的大小;如果不知道的

话,Xvid 可以在解码的过程中知道解出来的图像的大小,这就是通过 xvid_dec_stats_t 中的 vol 结构体来实现的。

10. 设为创建 Xvid解码实例后得到的句柄;第二个参数 opt 设置为 XVID_DEC_DESTROY;参数 param1和param2都设

为NULL。

基于C#的视频播放器设计_第2部分总文字复制比:0%(0)总字数:5764

* 在视频、音频播放的同时可以根据个人需求来进行快进快退音量控制等操作

* 可以看到视频或音频播放到什么程度,播放了多少

* 可植入性高、系统安全可靠

* 可以使用解码器解码

3.2.2 Windows Media Player的总体设计

整个系统有一个主界面,所有用户操作都在这个界面上进行操作。整个界面分为三部分:菜单栏、视频播放界面、视频控制按键区。简易菜单栏是对整个界面进行控制,包括打开视频和关闭整个界面。视频播放界面是对打开的界面进行播放的区域。视频控制按键区是用户对视频进行的操作的按键所在区域。系统有一个子系统:视频播放系统。功能比声音播放要少一些,但是最基础的开始、暂停、停止、快进、快退等都有。

该播放器主要实现的是模块之间的操作,有开始模块、暂停模块、停止模块、声音模块、打开模块、上一个、下一个、快进模块、快退模块、进度模块、播放进度模块、显示位置模块、改变音量模块与音量加音量减模块。这些模块都使用了COM组件中的axWindowsMediaPlayer控件,对视频进行操控,实现了用户→读取数据、进行操作→计算机→播放系统→解码→计算机→用户的过程。

模块之间的联系主要有播放、声音、显示进度三大部分组成。均通过解码器来连接,其中显示进度还使用了Timer 控件对视频进行计时操作,使用户能了解视频播放了多少时间和剩余多少时间。

在系统运行方面,Windows Media Player是基于Windows系统的播放器。可以支持一些常见的格式,如:MP3、WMV、MP4等,可以支持的操作系统是Windows 2000、Windows XP、Windows VISTA、Windows 7系统,对硬件要求没有特别高的要求,基础配置即可,有很强的可植入性,并且就目前来说系统安全性可靠,但是在某些时候不能进行一些DVD或一些格式的播放也算是系统在解码器方面的漏洞。

3.2.3 系统与解码器的连接

解码器与系统之间的连接设计如下:停止播放不可以解码要求加载解码器可以解码视频播放器系统进入打开目录进入解码器判断是否可以解码宏块解码信息是否继续播放播放则继续解码关闭视频播放器系统释放宏块结构体图3-2 视频解码流程图

解码器与系统之间的调用是通过用户对视频的基本操作(开始、停止)来实现解码器对内存的申请与释放。

本次设计的连接系统与解码器最佳基础的是对视频的操作先进行申请空间、并且传入到解码器内进行宏块结构体之间的解码。点击开始模块的时候,申请解码器空间。当解码成功的时候,释放图像空间开始播放,并且进行每一帧的解码与播放;当解码不成功的时候则不播放,并且弹出对话框提示用户添加解码器。点击停止模块的时候,释放宏块结构体,注销解码器,视频停止播放。

3.2.4 与解码器相关的模块连接

开始模块和暂停模块之间关系设计如下:

点击了解码器暂停解码对可视化操作界面按键图案的操作开始模块暂停模块可视化界面判断开始模块是否被点击没点击则无变化解码器继续解码图3-3 开始与暂停模块的工作流程图

开始暂停模块主要完成了对视频的开始和暂停操作。开始播放的时候是个对解码器申请空间创建解码器的过程。当视频是初次播放的时候首先创建解码器并且申请空间,并且按照一定速率进行解码,例如30帧/秒,此速率是根据当时最初创建该视频的时候编码设定值设定好的。当点击暂停暂停解码并且不销毁解码器以达到可以从中断位置继续解码。在用户可视化操作界面中的开始与暂停按键是通过判断按键属性来达到两者的转换的。

停止模块与图3-3模块图之间关系设计如下:

发送停止命令到系统并且销毁解码器空间对可视化操作界面按键图案的操作对可视化操作界面按键图案的操作停止开始和暂停模块变为开始模块,停止模块变为不可操作模块图3-3开始模块变为暂停模块,停止模块可操作图3-4 停止模块与图3-3模块图的工作流程图

停止模块是可以同时作用于开始模块与暂停模块的。开始模块对解码器进行了创建与空间的申请,暂停模块仅仅是对解码进行暂停但是没有进行空间上的操作。停止操作是个对视频进行停止同时对解码器进行操作的过程。它不仅完全的停止了视频的播放,而且注销了开始模块对视频的解码申请的空间。并且停止操作是一种一次性操作,只有当再次进行了解码器空间的创建,才能进行解码器的注销,即用户播放了视频或者暂停视频才能停止播放视频。所以停止按键的属性设计上还加入了Enabled属性的操作。当解码器空间被注销后,停止按键不可用。视频播放完成设置为系统自动调用停止模块。

3.2.5 进度模块和播放位置模块与计时器的连接

进度模块与计时器和视频的操作流程设计图如下:

停止播放视频继续播放视频停止播放视频或视频播放完成暂停播放视频开始播放视频数据传输读取视频长度Timer

控件(此时Timer控件为初始位置与时间)播放模块上的计时器开始计时计时开始播放条模块上的显示已播放的模块开始右移播放模块的计时器暂停,播放条模块暂停播放模块的计时器清零,播放条模块回归初始位置图3-5 进度模块与计时器和视频的操作流程图

视频在播放时会给用户提供计时器来让用户清晰的看出视频播放的时间与播放的位置。通过对视频长度的读取,来控制时间。即计时器的初始值为0,终值为视频的长度。当视频播放完成则计时器清零,播放模块的计时器数值归零,播放条上的模块返回初始位置。两个模块的区别就是,一个是以数字的形式在计时播放的位置,一个设置模块运行轨迹的总时长为视频长度,在位置上让用户清晰的看出了播放器播放的视频大概播放了总长度的多少。

4 Windows Media Player的设计与实现

视频播放器的研究是我一个人进行研究并且查找资料的。以下是模块的设计与实际情况。

4.1 界面设计

主界面如图4.1:

图4-1 主界面

系统打开后默认的界面如上。在界面中央是系统默认的(或已添加的)视频列表。上方是菜单MenuStrip控件,最左边是分类的目录列表,使用的是TreeView树形视图控件;最右边是播放列表,下方是用户操作区域。该界面大部分区域使用了Click属性操作,对列表的操作则为DoubleClick属性操作,主要是用于用户的操作。当用户点击了界面上的模块,则进行了模块之间的调用,从而实现对视频、音频的操控。

该主界面带一个子界面,即视频播放界面。因为音频的播放不需要显示可视画面,即通过系统向计算机解码声音播出即可。

子界面如下图:

图4-2 子界面

该界面主要是用于用户对视频进行观赏与简单的操作。所以在布局上,视频播放区采用了ImageList图像列表组件,并在最下方设置了Button按键实现对视频的操作。如果点击主界面中的文件,则默认为开始播放视频。

4.2 打开模块

打开模块如图:

图4-3 打开模板

打开模板是用户进行视频、音频打开操作的模板。用的是openFileDialog来调取电脑内文件夹的视频或音频。右下方显示了播放器的支持类型。在打开后将所选的视频、音频文件进行foreach操作,遍历列表中所有的文件。如果列表里只有一个文件则进行单视频(音频)播放。

4.3 播放模块、暂停模块

播放模块如下图所示:

图4-4 播放模块

暂停模块如下图所示:

图4-5 暂停模块

以上两种模块是在一起的。采用了CLICK事件。点击开始则视频开始播放,反之则结束。上面的图形转换也采用了CLICK事件。对Button进行CLICK操作,则对button的ImageIndex的数值进行操作。如果ImageIndex的数值为1,则显示为播放模块的三角形;如果ImageIndex的数值为0,则显示为暂停模块的双竖线形。

当进行点击了,则进行了axWindowsMediaPlayer控件中的PLAY方法和PAUSE方法。

4.4 快进模块、快退模块与上一个、下一个模块

这四种模块是对开始模块进行呼应的。ImageIndex为1的时候,图标是亮的。如果点击了开始模块,则Button的I mageIndex属性变为0,点击暂停模块的时候ImageIndex的属性变为1。

当ImageIndex为1的时候,即视频为暂停或停止的时候,遍历列表确定视频当前所在位置。如果位置为列表第一个的时候,上一个的Button的Enabled属性变为False,在列表最后一位的时候下一个的Button的Enabled属性变为Fals e。其他时候属性均为True。

当系统运行的时候,对其进行CLICK操作则进入axWindowsMediaPlayer控件的操作。进行上一个下一个操作的时

候播放进度模块中的Timer计时器清零,显示位置模块回到初始位置,播放进度模块中的Timer计时器将重新对新的视频进行计算总时长。

4.5 停止模块

停止模块与播放模块、暂停模块、快进模块、快退模块上一个模块、下一个模块、播放进度模块、显示位置模块有相关联系。采用了CLICK事件。点击则停止视频的播放,并且使以上模块发生变化。

对与开始、暂停模块的操作是:Button进行CLICK操作,则对button的ImageIndex的数值进行操作。判断此时的开始和暂停的模块的ImageIndex数值。如果ImageIndex的数值为1,则显示为播放模块的三角形;如果ImageIndex的数值为0,则显示为暂停模块的双竖线形,则使模块的ImageIndex值变为1变成三角形的播放模块。对于快进与快退模块,如果点击了停止模块,则快进模块、快退模块的ImageIndex数值变为1。

对于上一个模块、下一个模块则是对其的Enabled属性进行操作。上一个模块与下一个模块的进行遍历列表的操作来确定Button的Enabled的属性。

并且播放进度模块中的Timer计时器清零,显示位置模块回到初始位置,播放进度模块中的Timer计时器将重新对新的视频进行计算总时长。

当进行点击了,则进行了axWindowsMediaPlayer控件中的STOP方法的操作。

4.6 进度模块

进度模块如下图所示:

图4-7 进度模块

该模块就是一个Timer计时器控件。初始值为00:00,使用了currentPositionString属性来确定当前时间为多少。该模块与上一个模块、下一个模块、停止模块相呼应。当点击了以上模块,则进度模块的Timer清空为初始值并重新开始计算。

4.7 播放位置模块

模块使用了axWindowsMediaPlayer控件里的currentPosition属性。通过Timer Tick时间实现。通过Ctlcontrols.curr entPosition来获取当前进度并返回给系统。将里面的Minimum最小值设为0。并且Timer实现了上面蓝色部分图片的移动,使之随着视频的进度进行从左往右的移动。在此之前通过对视频长度的计算,设置了Timer开始的时间并把数值返回。当点击播放时,设置Timer的Enabled属性为true。此模板同进度模板一样,当与上一个模块、下一个模块、停止模块相呼应。当点击了以上模块,则进度模块的Timer清空为初始值并重新开始计算。如果使用了暂停模板,则进度条固定在当前位置。

4.8 改变音量模块与音量加减模块

改变音量模块做到了2种功能即对声音的静音与非静音进行控制。是将axWindowsMediaPlayer控件中的mute属性进行编辑。系统默认的是mute属性为False,此时的音量模块,ImageIndex的数值为1;当属性为true的时候,音量模块中的ImageIndex为0,图像变为图4-12并且不论音量加减模块如何加减声音,视频与音频均处于静音状态。

音量加减模块调用了控件中的volume属性。默认设置范围为0~100。当数值为0的时候,改变音量模块的mute属性变为true,音量模块中的ImageIndex为0;当数值为1~99的时候,改变音量模块的mute属性变为False,音量模块中的ImageIndex设置为1。随着显示音量模块的CLICK事件,如果左移则音量减,右移则音量加。

4.9 显示音量模块

显示模块如下图所示:

图4-9 显示音量模块

显示音量模块由2个方面组成。第一个为显示当前音量的Label控件,里面显示了当前播放音量的大小。另一个是ProgressBar属性。

最初设置属性为最小:ProgressBar1.value=ProgressBar1.min中间设值:如ProgressBar1.value=x。因为音量是控制在0~100之间的,所以max值设置为100。x的值随着音量加减模块进行计算。音量加减模块当前数值返回到进度条里,并且显示在Label控件上。

5 结束语

在这次设计过程中,让我对Windows Media Player如何实现播放视频音频文件有了实际的了解并且初步的掌握了

axWindowsMideaPlayer控件软件是如何实现。播放器可以进行基础的操作,包括播放、暂停、停止、音量调节、进度条等常用功能。

系统是基于C#进行研究的,首次接触了C#中的COM组件。从图书馆还有网上也获得了大量的资源与帮助,使得我这次可以自行研究自己感兴趣的课题。基于对视频的兴趣使我此次有了这次研究,了解了视频是如何被播放出来的,并且通过这次的研究学习,大大加强了我搜集资料的方式与途径,也加入了一些计算机方面的论坛进行学习,并且加强了我的自学能力,让我对学习计算机方面有了更大更多的兴趣,感觉收获颇多。

参考文献

[1] 《C#程序设计及应用教程》马俊人民邮电出版社

[2] https://www.doczj.com/doc/b66229824.html, 编程论坛

[3] 百度百科

[4] 《C#程序设计教程》蒙祖强清华大学出版社

[5] 北大青鸟:C#体系框架设计主讲:Axiao

[6] 《由浅入深学C#》吕辉电子工业出版社

[7] 《C#全能速查宝典》王小科梁冰吕双人民邮电出版社

[8] MSDN:WIN32和COM开发--Graphics and Multimedia--Audio and Video

[9] 《.NET 框架程序设计》[美]里克特著,李建忠译清华大学出版社

[10] 《C#设计模式》[美]麦斯科著,颜炯译中国电力出版社

[11] 《2010年6月18日随笔档案- 朱颂东- 博客园》

致谢

在这次研究设计首先要感谢我的导师,在百忙之中给我毕业论文设计进行了的帮助和指导。单缅老师在我毕业设计过程中,从选题、开题报告、研究等方面给了我很多很好好意见和指导,对于我的设计工作有很大的帮助。并且感谢计算机论坛的一些朋友给我的意见与帮助,还感谢图书馆给我提供了大量的图书资源可以参考,使我这次的研究可以顺利的完成。

( 注释:红色文字表示文字复制部分; 黄色文字表示引用部分)

打印保存https://www.doczj.com/doc/b66229824.html,

返回顶部

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