毕业设计论文:基于DirectShow的多媒体播放器设计与实现.doc_第1页
毕业设计论文:基于DirectShow的多媒体播放器设计与实现.doc_第2页
毕业设计论文:基于DirectShow的多媒体播放器设计与实现.doc_第3页
毕业设计论文:基于DirectShow的多媒体播放器设计与实现.doc_第4页
毕业设计论文:基于DirectShow的多媒体播放器设计与实现.doc_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

毕业论文 编号 毕 业 设 计(论文)基于directshow的多媒体播放器设计与实现 目 录摘 要iabstractii1 绪论11.1 课题研究的背景与意义11.2 课题国内外研究现状11.3 可行性分析21.3.1 技术可行性分析21.3.2 经济可行性分析21.3.3 管理可行性分析21.4 论文的主要内容及章节安排32 相关平台及开发技术简介32.1 microsoft visual c+ 2010概述32.1.1 micosoftvisual c+ 2010特点32.1.2 mfc概述42.2 ado访问数据库技术概述42.2.1 ole db和ado简介42.2.2 ado主要对象介绍52.2.3 vc+中使用ado进行数据库开发的基本流程52.3 directshow核心技术52.3.1 directshow整体架构52.3.2 com组件62.3.3 filter概述及连接62.3.4 滤波器链表管理器72.3.5 滤波器链表中数据传输72.3.6 事件通知机制82.4 skin+皮肤库概述92.4.1 skin+简介92.4.2 skin+特性93 系统需求分析93.1 系统业务需求93.2 系统数据需求103.3 功能需求103.4 非功能需求103.4.1 适应性103.4.2 安全性103.4.3 可靠性113.4.4 可扩充性113.4.5 可维护性113.4.6 可移植性114 多媒体播放器的设计114.1 系统功能设计114.1.1 媒体文件添加(数据输入)114.1.2 媒体文件存储和显示(数据存储及显示)124.1.3 媒体文件播放及控制(数据流传输、控制及输出)124.2 系统结构设计124.3 系统数据库设计134.4 播放器滤波器链表结构设计134.5 directshow智能连接134.5.1 智能连接概述134.5.2 智能连接的实现145 多媒体播放器的实现145.1 基于directshow播放器的实现145.1.1 初始化com145.1.2 创建滤波器链表管理器155.1.3 智能连接建立滤波器链表155.2 directshow接口实现155.3 媒体文件信息存储实现155.3.1 数据库存储165.3.2 链表存储165.3.3 list列表显示175.4 播放控制功能的实现185.4.1 定位185.4.2 播放195.4.3 暂停、停止195.4.4 全屏195.4.5 截图205.4.6 静音控制205.4.7 速率控制215.4.8 上一个和下一个215.4.9 查找225.4.10 删除225.4.11 排行榜235.4.12 播放模式设置245.4.13 帮助245.4.14捕获本地摄像头255.5 歌词关联实现265.5.1 歌词构造原理概述265.5.2 获取歌词方法及过程275.5.3 遇到难点和问题275.6 用户管理功能实现285.6.1 用户注册285.6.2 用户登录295.6.3 用户使用系统整体流程295.7 播放jpg格式图片实现305.7.1 jpg格式图片缩放实现305.7.2 jpg格式图片的显示306 测试多媒体播放器实例及结论316.1 测试环境设计316.1.1 软件环境316.1.2 硬件环境326.2 测试用例设计326.3 测试结果分析336.3.1 多媒体播放器的主题界面336.3.2 多媒体播放器测试结果记录346.4 测试结论35结束语35致 谢35参考文献36 摘 要随着数字音视频处理、数字信息存储技术的不断发展,基于数字编解码的多媒体应用已经越来越深入到人们的日常生活中,如何高效处理声音、视频数据以及支持媒体文件格式则成为主要的问题。directshow sdk是微软公司提供的一套在windows平台上进行媒体处理的开发包,它支持高品质的数字视频、高保真的音频及其它特殊效果,广泛应用于流媒体播放器的开发、多媒体流的高质量捕捉和回放、视频点播技术等。 本论文概括性的阐述了基于directshow开发多媒体播放器的具体过程。重点实现了播放、暂停、停止、前后切换 、声音控制、进度控制、抓取视频帧、排行榜、删除、查找、播放模式控制、全屏等功能。其中使用的技术包括visual c+以及mfc程序设计方法、利用directshow实现播放器核心技术、ado数据库访问技术、skin+皮肤库技术。通过对系统的需求分析、设计、实现,完成了媒体播放器系统,各项功能正常使用、并给出了实现关键代码。论文中第二章是对相关技术的介绍,第三、四章是对系统需求分析和设计,第五章是本论文的重点,详细介绍播放器实现细节,第六章是对系统的测试和总结。directshow是基于com组件,它是二进制级别的(不受限于编程语言和操作系统),具有很好的兼容性和移植性。由于本人是directshow的初学者,播放器存在一些瑕疵,directshow发展前景广阔,以后有机会深入研究它,在现有的基础上把播放器做得更加完美。关键字:visual c+ mfc directshow 播放器iabstractwith digital audio and video processing, digital information storage technology continues to evolve, based on the digital encoding and decoding of multimedia applications has become increasingly penetrated into peoples daily lives, how to efficiently handle voice, video, data, and support for media file format has become a major problem.directshow sdk is a set of microsoft corporation on the windows platform for media processing development kit, which supports high-quality digital video, high-fidelity audio, and other special effects, widely used in the development of streaming media player, multimedia streaming high-quality capture and playback, video-on-demand technology.this thesis describes the broad development of multimedia player based on directshow specific process. focus to achieve the play, pause, stop, forward or backward, sound control, schedule control, grab video frames, leaderboards, delete, search, playback mode control, full screen and other functions.which use technologies include visual c+ and mfc program design methods, the use of directshow player core technology, ado database access technology, skin+ library technology skin.through the system requirements analysis, design, implementation, completed a media player system, various functions normal use, and gives the realization key code.the second chapter is a paper related to technology introduction, two chapters is the system requirements analysis and design, the fifth chapter is the focus of this paper, detailing the implementation details of the player, the sixth chapter is the system testing and summary.directshow is based on the com component, it is a binary level (not limited to programming languages and operating systems), has good compatibility and portability. since i was a beginner directshow, the player has some flaws, directshow development prospects, have the opportunity to study it in depth, on the basis of the existing players more perfect.key words:visual c+ mfc directshow playerii1 绪论1.1 课题研究的背景与意义当今信息技术越来越发达,社会越来越信息化、智能化,多媒体在未来社会应用越来越广泛。microsoft的windows操作系统作为全球最主流、最常用的操作系统,掌握在它上面的多媒体开发技术显得越来越需要,相对于其他多媒体开发技术,掌握它本身提供的directx多媒体开发包显得更为适合。directshow是微软提供的多媒体开发包directx中的一部分,它是建立在directdraw和directsound基础之上。 microsoft给directshow程序员提供了一套开发多媒体标准的、统一的、高效的api接口,这些接口使得多媒体数据的回放变得简单,剥离了应用程序和硬件底层的差异性。而directshow是基于com组件的开发包,com是基于二进制代码级的协议(与编程语言无关的协议),对使用directshow开发的软件以后的移植和兼容问题提供了良好的解决方案。 directshow使用智能连接开发多媒体应用程序,大大简化了开发人员工作量,同时开发人员亦可开发自定义的滤波器。使得基于directshow的应用程序可以充分满足不同用户的需求。在未来几年中,directshow技术的发展前景将是非常广阔的。 1.2 课题国内外研究现状directshow流媒体视频技术现在广泛的应用在国内外,涉及视频处理、视频捕捉、网络视频监控、网络视频传输和电子商务等各个方面。 国内的视频播放器多种多样,有暴风影音、qq影音、迅雷看看等多种播放器,它们各自有各自的特点,目前暴风影音占据着市场的最大份额,它们各自采用的实现技术有所异同。随着internet的商业化,一些商家纷纷行动规划开发适用于本企业的播放器。根据iresearch艾瑞资讯最新退出的网民连续用户行为研究系统iusertracker的最新数据显示,目前,比较流行的多媒体播放器有:microsoft windows media player、realone、豪杰超级解霸以及暴风影音等,暴风影音和windows media player是使用最广泛的影视播放软件,而这量大播放器的核心编码已成控件,因此全球网络化的公司都在利用这两大核心控件开发适合自己使用的播放器;网络上也有不少的研究者热衷于播放器的研究利用控件或mct接口开发自己的播放器,并取得了很大的进步,推动了播放器的发展。笔者所开发的多媒体播放器是使用的directshow技术,使用k-lite_codec_pack进行解码,能播放任意格式的媒体文件,和其他播放器不同的是,我加入了排行榜、播放模式控制、捕获设备视频等功能,界面清晰,使用简单。 1.3 可行性分析1.3.1 技术可行性分析本人熟悉计算机相关基本知识、熟悉程序设计方法、熟练掌握vc+编程、mfc开发方法和技巧,具备一定的编程经验和独立编程能力。基于directshow视频播放器实现原理可以通过查阅相关资料、请教老师和他人进行学习掌握,所以在技术上具有可行性。1.3.2 经济可行性分析该软件的开发、测试、运行使用等步骤皆在自己pc上完成,无需提供其他设备。 开发过程中涉及到的知识、软件开发成本、交付后的运营维护皆由本人控制、完成,所用的软件和硬件配置环境均为现成,所以经济上具有可行性。1.3.3 管理可行性分析本软件运用到实际生活、工作中,将会使音频/视频的播放和处理变得便利、经济及娱乐,而且还可以根据朋友、他人的用户体验不断完善此软件,可以感受到成就感,所以管理上具有可行性。综上所述,本课题的可行性是有保障的。1.4 论文的主要内容及章节安排论文的主要内容:详细的阐述利用directshow实现多媒体播放器的原理、实现过程以及实现之后的演示效果,当中包含大量的visual c+程序设计方法和数据库操作。论文内容整体安排如下:第一章:介绍此课题的意义、相关背景和现状。第二章:介绍完成此软件所用到的平台和技术。第三章:阐述此软件的需求分析,包括业务分析、数据分析、功能需求和非功能需求。第四章:阐述此软件的整体结构和各个模块设计。第五章:详细阐述此软件的具体实现过程,包括各功能的核心代码。 最后是总结、致谢。 2 相关平台及开发技术简介2.1 microsoft visual c+ 2010概述microsoft visual c+,(简称visual c+、msvc、vc+或vc)微软公司的c+开发工具,具有集成开发环境,可提供编辑c语言,c+以及c+/cli等编程语言。vc+整合了便利的除错工具,特别是整合了微软视窗程式设计(windows api)、三维动画directx api,microsoft .net框架。2.1.1 micosoftvisual c+ 2010特点microsoft visual c+是微软公司推出的开发win32环境程序、面向对象的可视化集成编程系统。它的主要优点如下:(1)程序框架自动生成(2)灵活方便的类管理(3)代码编写和界面设计集成交互操作(4)可开发多种程序(5)支持数据库接口、ole2、winsock网络和3d控制界面2.1.2 mfc概述mfc(microsoft foundation classes)是一个微软公司提供的类库(class libraries),以c+类的形式封装了windows的api,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。mfc中的关键技术:(1) mfc程序的初始化过程建立一个mfc窗口:从cwinapp派生一个应用程序类,然后建立应用程序对象(theapp)。(2) 动态创建运行时创建指定类的对象。如框架窗口对象、视对象等,比如文档对象需要由文档模版类对象来动态的创建。 (3) 串行化程序中尽管有着各种各样的数据,串行化机制会像流水一样按顺序存储到单一的文件中,而又能按顺序的取出,变成各种不同的对象数据。 (4) 消息映射和传递mfc把sdk编程中对消息的产生、传递、到过程函数中响应的过程封装起来,形成消息映射宏、消息映射表和消息响应函数体系,更加直观和便于操作。 2.2 ado访问数据库技术概述2.2.1 ole db和ado简介ole db(object link and embedding database)是visual c+开发数据库应用程序时提供的新技术,它对所有的文件系统包括关系型数据库和非关系型数据库都提供了统一的接口。ado(activex data object)技术基于ole db,它继承了ole db技术的优点,对其接口作了封装,使程序开发得到简化。 2.2.2 ado主要对象介绍(1) 连接对象(connection object)代表一个和数据源的连接,以后的数据库操作都是建立在这个连接上的。 (2) 命令对象(command object)用来处理数据库的一些操作,在某些方面具有和连接对象相同的功能(3) 记录集对象(recordset object)代表了一个记录集,用来访问记录集。在使用这3个对象的时候,需要定义与之对应的3个智能指针,分别为:_connectionptr、_commandptr和_recordsetptr。2.2.3 vc+中使用ado进行数据库开发的基本流程(1)引入ado动态链接库。(2)初始化ole/com库环境。(3)用connection对象连接数据库。(4)利用建立好的连接,打开记录,通过connection、command对象执行sql语句或利用recordset对象取得结果记录集进行查询、处理操作。 (5)使用完毕后关闭连接、释放对象。2.3 directshow核心技术2.3.1 directshow整体架构directshow sdk为流媒体的开发带来了极大的便利。提供了从底层的视频采集到顶层的流媒体交互应用的解决方案,并且把应用程序从数据传输、硬件差别和同步机制等复杂问题中分离出来。其整体架构如下图所示: 图2.1 driectshow系统架构2.3.2 com组件directshow是基于com的流媒体处理的开发包。com是一种跨应用和语言共享的二进制代码的方法,它是个开放的组件标准,具有很强的扩充和扩展能力。其优点如下:(1) 可以将系统中的组件用新的替换掉,以便随时进行系统的升级和定制。(2) 可以方便的将应用系统扩展到网络环境中。 (3) 可以在多个应用系统中重复利用同一个组件。 (4) com组件与语言和平台无关。 2.3.3 filter概述及连接滤波器filter是一个com组件,是directshow中最基本的元件,directshow提供了标准滤波器,亦可自定义。滤波器主要分为以下几种类型:(1)源滤波器(2)变换滤波器(3)提交滤波器。滤波器之间通过输出引脚(outpin)和输入(inputpin)引脚之间连接来进行数据传输,所有的滤波器连接起来形成滤波器链表即filter graph manager。 数据流的传输过程如下图所示:图2.2 数据传输流动过程2.3.4 滤波器链表管理器在directshow中,使用滤波器链表管理器来控制滤波器链表中的所有滤波器,它也是com形式的。它通过使用迭代的方法将各个滤波器连接起来建立滤波器链表。 最重要的是它提供了一系列的接口给应用程序,比如imediacontrol(控制数据流)、imediaeventex(处理滤波器链表事件)、ibasicaudio(控制音频流的音量和平衡)等,使得应用程序方便、实时的控制、改变滤波器链表中的状态,以达到用户想要的要求和效果。 2.3.5 滤波器链表中数据传输滤波器之间传递的数据内容不是直接指向内存块的指针,而是一个管理内存的com对象,称之为媒介样品(mediasample),它由一个叫做(分配器)allocator的com对象来创建和管理。 滤波器、媒介样品和分配器三者之间的关系如下图所示: 图2.3 分配器、媒介样品和滤波器之间的关系directshow为数据在滤波器链表中传输定义了两种机制:(1)推模式(push model):上一级滤波器将生成的数据提交给下一级滤波器,下一级被动的接收数据,依次进行传递。 (2)拉模式(pull model):下一级滤波器向上一级滤波器请求数据,上一级滤波器才传送数据给它,依次进行传递。 2.3.6 事件通知机制directshow中的事件通知机制和windows中的消息机制非常类似,各种滤波器,滤波器链表管理器都是通过事件通知的方式和应用程序进行交互、通信的。 比如多媒体文件的播放、暂停、停止等状态变化都是通过此方式通知应用程序,应用程序自定义响应函数来处理各种事件。在本软件中,响应最多的是多媒体文件播放结束事件通知。 具体实现过程:(1) 自定义滤波器链表通知给指定窗口消息 #define wm_graphnotify (wm_user + 20)(2)设置消息通知到指定窗口 m_pfiltergraph-setnotifywindow(this-getsafehwnd(); (3)自定义响应函数中解析事件(回调函数) pevent-getevent(&eventcode,&eventparam1,&eventparam2,infinite)(4)响应操作2.4 skin+皮肤库概述2.4.1 skin+简介skin+,采用独特的软件界面开发技术,让原本复杂繁琐的界面编程变得轻松自如,只需要在您的程序中添加一句代码,skin+就能让您的界面焕然一新,并拥有多种主题风格和色调的动态切换功能。2.4.2 skin+特性(1)支持windows系统对话框与控件。(2)支持广泛的开发工具。(3)皮肤资源海量。2.4.3 skin+换肤流程(1) 应用程序启动,加载skin+库。(2) 执行skin+加载皮肤文件api函数。(3) 应用程序退出,卸载skin+库。3 系统需求分析3.1 系统业务需求此软件是基于directshow的多媒体播放器,主要的业务需求是正确播放不同格式的音频和视频文件。3.2 系统数据需求此软件的数据需需求主要为播放器接收到的数据源,此处包括mp3、wma、flac等格式的音频文件,mp4、mkv、rmvb、avi格式的视频文件。它们以不同编码方式传入播放器,在播放器为它们构建的滤波器链表中分离、转换、传输、解码,最后在音频/视频设备上播放出来即为数据输出。3.3 功能需求系统的功能需求如下:(1) 控制用户权限(有帐号的用户顺利登录,没有帐号的用户无权限进入系统)。(2) 顺利打开各种格式媒体文件。(3) 在安装解码器的情况下,能顺利播放各种格式媒体文件。(4) 播放画面流畅、稳定,音质清晰。(5) 用户顺利使用各种控制功能,如暂停、停止、前后切换、音量控制、截图、排行榜等。(6) 播放器控制界面友好、交互性良好、易于操作。(7) 用户使用完播放器顺利退出。 3.4 非功能需求3.4.1 适应性此软件适合在任何安装了windows操作系统的主机上使用。此软件设计界面、操作较为简单,适应人群广泛,大人小孩皆能使用,适应性较好。 3.4.2 安全性用户只有注册符合要求的帐号后才能进入系统,安全性得到保障。3.4.3 可靠性此软件整体结构不复杂,实现逻辑清晰,性能稳定,可靠性较好。 3.4.4 可扩充性此软件为单机软件,能添加和扩充的功能很多(比如网络、界面美化交互等),系统并未像苹果一样封闭,可扩充性较好。3.4.5 可维护性此软件的原理、流程、细节皆有本人掌握、完成和修改,如出现问题、异常本人即可完成,可维护性较好。3.4.6 可移植性此软件使用visual c+中mfc编写,在安装了windows系统的主机间移植只要包含可执行文件和相关库即可,在不同操作系统间移植性较差。 4 多媒体播放器的设计4.1 系统功能设计此软件的系统功能设计分为三部分,具体如下所示。 4.1.1 媒体文件添加(数据输入) 系统的输入数据来源于用户打开读取媒体文件,包含打开单个媒体文件和文件夹两个选择。 4.1.2 媒体文件存储和显示(数据存储及显示)系统得到输入数据后,对它们进行存储和显示,为后续播放、控制操作奠定基础。 4.1.3 媒体文件播放及控制(数据流传输、控制及输出)在已知媒体文件存储信息的基础上,执行源滤波器-分解滤波器-音/视频解码滤波器-音/视频播放滤波器-数据输出(音视频设备)流程以及对整个过程的控制。 4.2 系统结构设计此软件的整体结构设计如下图所示: 图4.1 系统整体结构4.3 系统数据库设计此软件中在存储媒体文件信息和用户帐号信息用到数据库,此处使用名为mediaplayerdatabase的数据库,其中包含两张存储信息使用的表,分别名为:fileinformation和userinformation,具体情况如下:图4.2 系统数据库设计4.4 播放器滤波器链表结构设计图4.3 播放器的滤波器链表结构4.5 directshow智能连接4.5.1 智能连接概述智能连接是滤波器链表管理器用以构建滤波器链表的机制,它包含了一系列选择滤波器和将其添加到链表中去的算法。本软件即采用此方法构建供数据流传输的滤波器链表。 4.5.2 智能连接的实现智能连接的基本方法为试连接,它首先用内存中的filter试连接,若不成功,则对当前的filter graph中还没有完全连接的filter进行试连接。如果不行,再从系统filter里选取匹配的、最合适的filter进行试连,直到连接成功。若找不到合适的filter,则失败返回。所以只要filter graph中有不同类型的、可接受同一媒体类型的filter,则采用智能连接,每个filter都可连在正确的位置。为什么在智能连接中不同类型的filter会连在各自的位置上呢?因为这些filter能接受的媒体类型不同。从源filter出来的数据流只带有编码格式信息,其他信息都是未知的,所以音视频解码filter和处理filter都不能用,只能使用分离filter匹配这种媒体类型,所以只会试连接分离filter。而从分离filter出来的数据分为音、视频两路,每路的数据流都加上了音频或者视频的信息,但没有标明这是何种音频或视频的信息,所以可以被音视频解码器filter接受,但不能被音视频处理filter接受。而从音视频解码filter出来的数据流带上了具体格式的音视频媒体类型的信息,所以能被音视频处理filter接受,最后发送到提交过滤器。5 多媒体播放器的实现5.1 基于directshow播放器的实现5.1.1 初始化comdirectshow是基于com组件的开发包,所以此在应用程序的最开始应该初始化com库环境。 实现为:在应用程序对象mediaplayerapp的initinstance函数中调用afxoleinit()或者coinitialize(null)函数。 5.1.2 创建滤波器链表管理器滤波器链表是整个多媒体播放器的入口点,每次播放一个新的媒体文件前应该先释放前一个滤波器链表,再针对当前媒体文件建立滤波器链表管理器,其实现为:cocreateinstance(clsid_filtergraph,null,clsctx_inproc_server,iid_igraphbuilder,(void *)&m_pgraph)5.1.3 智能连接建立滤波器链表创建了和指定媒体文件对应的滤波器链表管理器之后,就应该利用智能链接方法为该媒体文件创建完整的滤波器链表,其具体创建过程参照智能连接设计一节。其实现为:m_pgraph-renderfile(szfilepath,null);其中szfilepath为媒体文件的绝对路径,且为宽型字符。为了使本播放器能成功为各种格式的音视频建立完整的滤波器链表,应该为电脑安装音/视频解码器。 本软件运行环境安装的是k-lite codec pack解码器。5.2 directshow接口实现在为指定媒体文件创建好滤波器链表管理器,应该在其中查询、初始化所有必须的directshow接口,以便之后的控制和运用。 各接口的初始化方式类似,例如初始化媒体控制接口实现:m_pgraph-queryinterface(iid_imediacontrol,(void *)&m_pmediacontrol);需要注意的是,必须是所有的接口都查询、初始化成功才能返回初始化成功、继续进行后面的操作。具体实现方法为把所有接口查询结果进行或运算。 5.3 媒体文件信息存储实现运用基于directshow实现的多媒体播放器最重要的是提供媒体文件的绝对路径,在此软件中,一共采用三种方式存储媒体文件的绝对路径,具体情况如下。:5.3.1 数据库存储在本软件中,建立了一个名为mediaplayerdatabase的数据库,该数据库中包含两张表,分别为fileinformation和userinformation,各自用来存储媒体文件信息(路径)和用户注册信息。 当用户点击打开文件打开一个媒体文件或者点击打开文件夹打开多个媒体文件时,应用程序会自动的把媒体文件的绝对路径和文件名添加到表fileinformation中,其实现为:strsql = _t(insert into fileinformation(filepath,filename,playcount) + values; m_pconnection-execute(_bstr_t(strsql),&recordsaffected,adcmdtext);当用户退出系统时,此软件会自动删除表fileinformation中所有数据(这个依具体情况和需求而定)。实现后示例效果如下: 图5.1 媒体文件信息数据库存储5.3.2 链表存储跟上一小节中数据库存储的由来一样,此处是定义的一个结构体来存储媒体文件信息,结构体为:typedef struct _filenode cstring m_sourcefilepath;cstring m_sourcefilename;_filenode *m_nextnode;filenode;每添加一个新媒体文件即新建一个filenode节点,采用尾插法实现,其实现关键代码:m_filelistq = new filenode; m_filelistq-m_nextnode = null;m_filelistp-m_nextnode = m_filelistq;m_filelistp = m_filelistp-m_nextnode;其示意图如下:图5.2 链表尾插法实现另外,因为在完成此软件过程中,先使用链表存储后使用数据库操作。在此有点重复和冗余,但链表作为程序设计中一种非常重要的数据结构和思想,它的应用显得必要,可根据特定需要进行修改。 5.3.3 list列表显示前面的数据库和链表对媒体文件信息存储都是后台的,看不见的,在播放器界面中有一个能看见媒体文件的列表,且可供用户选择、操作。 此软件采用mfc对话框控件clistbox来显示媒体文件列表。 响应用户的双击播放、前后移动、增添,删除和查找等操作。 其实现如下:m_listbox.insertstring(m_listindex+,m_mediafilename.getbuffer();添加后的媒体文件列表显示如下图所示: 图5.3 媒体文件显示列表及双击播放操作5.4 播放控制功能的实现将媒体文件添加到列表中以后,就可以对其执行播放操作,此软件设定为双击文件列表选项。双击的同时,控制面板中与之对应的图标会发生变化,给用户的体验更加直观,播放进度条和声音控制条也会动起来,给用户带来强烈的视觉感观。然后用户可以根据需要在控制面板或者菜单选项中选择自己想要的功能和效果,具体实现操作如下所示。 5.4.1 定位有时用户在播放音视频时,想大概浏览一下整体内容或者跳开一些自己不太感兴趣的片段。定位操作就满足了用户的这一需求,用户可以直接拖动控制面板中的进度条,因为该进度条是跟媒体文件的时间长度相绑定的,故可以满足用户的需求。其实现如下:m_pfiltergraph-getduration(&duration);double pos = duration * m_sliderplayer.getpos() / 100.0;m_pfiltergraph-setcurrentposition(pos);先获取媒体文件时间长度和进度条的位置,然后按照当前进度条占整体进度条的比例来确定播放媒体文件中的时间点。 5.4.2 播放当为指定媒体文件创建滤波器链表管理器、将其渲染和绑定显示窗口完成后,此时会使媒体文件显示第一帧图像(视频)或者暂停(音频)。接下来会执行播放操作,调用已经初始化的媒体控制接口中的运行函数,其实现如下:m_pmediacontrol-run();与此同时,相关图标和进度条状态与之对应发生变化。此处设置一个定时器,每隔100毫秒,进度条移动一次,并显示当前时间,这样用户视觉上进度条是平滑的移动,效果更好。 其实现如下:m_playertimer = settimer(slider_timer,100,null);void cmediaplayerdlg:ontimer(uint_ptr nidevent);5.4.3 暂停、停止当用户在播放媒体文件过程中,想暂停或者停止播放,则可以点击相应菜单选项、图标或者按钮即可。原理跟播放操作类似,即调用滤波器链表管理器控制接口中的暂停/停止函数,其实现如下:m_pmediacontrol-pause();m_pmediacontrol-stop();其中,点击暂停后,点击一下播放按钮即可恢复播放状态,点击停止后则需点击播放按钮两下。5.4.4 全屏用户在播放视频文件时,经常需要将播放画面放大以至全屏,视觉效果和体验更好。在此软件中也做了该操作,原理为调用滤波器链表管理器的视频窗口接口的全屏函数,其实现如下:m_pvideowindow-put_fullscreenmode(inenabled?oatrue:oafalse)其中参数inenabled为确定全屏或者退出全屏模式,针对此操作,捕获了esc按钮消息亦可响应。此软件在实际操作中,能够正常使视频画面全屏显示,但不能恢复,退出全屏模式时出现异常,此bug有待研究和解决。 5.4.5 截图用户在播放视频文件中,有时根据实际需要想要把某帧画面截取下来存放到指定目录以供使用。此软件亦实现了此功能,在此默认的是把截取的图片放到跟应用程序的可执行文件的同一目录下且保存为bmp格式的图片。原理是调用滤波器链表管理器的基本视频接口中的抓取当前帧函数,其实现如下:m_pbasicvideo-getcurrntimage(&bitemapsize,(long*)buffer);参数bitemapsize为整个位图的尺寸,buffer为用户存放该位图的缓冲区。 先获取buffer缓冲区的文件头,然后在输出路径建立可读写的二进制文件,然后把已知文件头写入到该二进制文件,最后把缓冲区的内容写入该文件,抓图、存盘工作完成。 其实现如下:lpbitmapinfoheader lpbi; lpbi = (lpbitmapinfoheader)buffer;cfile bitmapfile(lpctstr(outfile),cfile:modereadwrite | cfile:modecreate | cfile:typebinary);bitmapfile.write(&hdr,sizeof(bitmapfileheader);bitmapfile.write(buffer,bitemapsize);其效果如下图所示:图5.4 抓图5.4.6 静音控制有时用户在播放音频/视频中需要关掉声音,除了可以调节音量大小外,还可以使用静音操作更为快捷。 原理为调用滤波器链表管理器的基本声音接口的设置声音函数,其实现如下:m_pbasicaudio-put_volume(-10000);恢复声音:long lvolume = (m_nvolume - 100) * 100; m_pbasicaudio-put_volume(lvolume); 在directshow中,声音的最大值表示为0,最小值表示为-10000。5.4.7 速率控制用户在播放音视频过程中,有时需要快进或者慢放,这里跟拖动进度条实现快进不同,这里是使整个播放过程速度均匀保持快进或者慢放。 此软件中设置了三种播放速率,1/2正常速率、正常速率和2倍正常速率。原理为调用滤波器链表管理器媒体定位接口的设置速率函数,其实现如下:m_pmediaseeking-setrate(inrate);参数inrate为相对于正常速率的比例,此处可以为1/2、1和2。同时在播放器的顶端标题处会显示当前媒体文件的播放速率,显得直观、易见。 5.4.8 上一个和下一个用户在使用播放器时,很多时候会在多个媒体文件间进行切换,最常用的是前后切换。此软件亦实现了此功能,此软件默认是上下前后切换时打开媒体文件进行播放,默认最后一个文件下一个是列表中第一个媒体文件,默认第一个文件前一个是列表的最后一个文件。 此处是对前面提到的媒体文件信息存储中链表存储进行操作,原理是链表中节点之间的前后移动。其实现为:m_listbox.setcursel(m_listbox.getcursel() + 1);m_filelisttemp = m_filelisthead-m_nextnode;for (int i = 0; i m_nextnode;m_sourcefile = m_filelisttemp-m_sourcefilepath;m_mediafilename = m_filelisttemp-m_sourcefilename;如果上一个或下一个是列表中第一个或者最后一个媒体文件,则不需要进行节点移动,直接选中播放。 5.4.9 查找有时用户在使用播放器时想快速的查找某媒体文件,则可以使用此功能。用户只需要输入想找文件的名字即可,如果列表中有该文件则会把它选中,如果没有则会作出提示。原理是遍历存储媒体文件信息的链表,其实现为:if (checkdlg.m_checkfilename = temp)m_listbox.setcursel(i);return;m_filelisttemp = m_filelisttemp-m_nextnode;5.4.10 删除用户在使用播放器时,有时想要删除某个媒体文件,此软件的操作是先选中该文件,然后点击控制面板中的删除按钮即可。用户删除该文件时,列表框、链表中和数据库表fileinformation中全部删除该文件信息。 原理跟前面一样是执行对链表的遍历操作,这里多一个对数据库的删除操作,原理是第二章提到的ado数据库访问技术。其实现如下:m_filelisttemp2 = m_filelisttemp-m_nextnode;m_filelisttemp-m_nextnode = m_filelisttemp2-m_nextnode;delete m_filelisttemp;图5.5 删除链表中节点strsql.format(_t(delete from fileinformation where filename = %s),values);m_pconnection-execute(_bstr_t(strsql),&recordsaffected,adcmdtext);5.4.11 排行榜用户有时想知道列表中所有媒体文件的受欢迎程度(被点击播

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论