为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

【精品】AVI播放器的设计思想及开发流程

2017-09-01 4页 doc 15KB 13阅读

用户头像

is_005190

暂无简介

举报
【精品】AVI播放器的设计思想及开发流程【精品】AVI播放器的设计思想及开发流程 AVI播放器的设计思想及开发流程 设计思想: 对多媒体影音文件的解码大体上包括三个部分:(一)视频数据的解码;(二)音频数据的解码;(三)视频播放与音频播放的同步; 由于这三个部分需要在同一时间同时运行,所以也就决定了至少需要启动三个进程(或线程)才能保证播放的正常进行。 开发流程: 关于第一部分,我们只针对以MPEG4为编码标准的影音文件(不含B-VOP)。 首先尝试不将视频部分从文件中剥离出来,用视频解码器直接解码AVI文件,发现能够跳过其中夹杂的音频数据,对视频部分...
【精品】AVI播放器的设计思想及开发流程
【精品】AVI播放器的思想及开发流程 AVI播放器的设计思想及开发流程 设计思想: 对多媒体影音文件的解码大体上包括三个部分:(一)视频数据的解码;(二)音频数据的解码;(三)视频播放与音频播放的同步; 由于这三个部分需要在同一时间同时运行,所以也就决定了至少需要启动三个进程(或线程)才能保证播放的正常进行。 开发流程: 关于第一部分,我们只针对以MPEG4为编码标准的影音文件(不含B-VOP)。 首先尝试不将视频部分从文件中剥离出来,用视频解码器直接解码AVI文件,发现能够跳过其中夹杂的音频数据,对视频部分正常解码,所以可以直接对AVI文件应用MPEG4视频解码器; 关于第二部分,我们只针对以MPEG1-Layer3为压缩标准的影音文件。 首先尝试不将音频部分从文件中剥离出来,用音频解码器直接解码AVI文件,发现不能够正常解码,原因是不能自动跳过视频部分的数据。 接下来就有两种选择:第一,改变解码器的解码流程,加入判断视频数据并跳过的机制。(此方法比较复杂,而且很容易出现问题) 第二,改变装载数据的数据源,使解码器感觉好象AVI文件中的数据都是MP3数据。(此方法只不过是对AVI文件进行了二次处理,可行且比较容易实现) 最后我们采用了第二种方案,实现了对AVI文件音频部分的解码; 关于第三部分,也是比较难的一部分。我尝试了很多方法: 首先是采用“同步信号”来“指挥“视频和音频的每一帧的播放,结果发现信号的传递速度太慢,声音和视频都很”卡“; 接下来采用了每半分钟同步一次,如果两者(视频解码和音频解码)中的某一个先到达半分钟,则发送“到达”信号给“同步控制程序”,然后等待“同步控制程序”返回“继续解码”信号,“同步控制程序”必须两个“到达”信号都收到了以后,向两个解码器同时发送“继续解码”信号,结果发现在每个半分钟的开始几秒还可以同步,但再向后就越来差距越大。而且在“同步点”还有停顿,能够基本实现同步,但理想。尤其是系统资源紧缺的环境下,往往是音频解码器快出许多,以至于等待时间过长。 由于解码器对系统资源的比较多,一旦资源不足就会产生停顿,所以我开始考虑跳帧,即来不及解码了,就跳过去,直接解下一帧。虽然这样会丢帧,但能够保证在规定的时间内解码到相应的帧。依照这个思想,我选择了系统时钟作为参考时钟,记录解码的开始时间,解码每一帧以前都需要将当前时间与“当前应该的时间”进行比对,以决定是等待、解码、还是跳帧。这样,只要两个解码器的启动时间是一致的,并且各自都能够和这个公共的 系统时间同步,则两个解码器也就同步了。为了保证两个解码器的启动时间一致,在各自的解码器完成初始化以后,向“同步控制程序”发送“准备好”信号,“同步控制程序”接收到两个“准备好”信号以后,同时向两个解码器发送“启动”信号,这样就保证了两个解码器的启动时间基本一致(完全一致很难作到,因为Linux本身不是实时操作系统)。结果解码的音频基本没有问题,视频有些帧虽然模糊(因为I-VOP被跳过了),但基本可以接受。至此AVI播放器设计告一段落。再加上QTE提供的图形用户界面,可以控制播放器的运行状态。 播放控制: 无论是音频还是视频,都是以帧为单位进行解码的,所以,可以在解码每一帧的时候,加入判断播放状态的机制,而这个播放状态的改变,则借助了Linux操作系统中的信号来控制; Linux中的信号及其响应机制简介: 信号是由相同或不同的进程向一个进程传递的事件,通常通知异常事件;它是硬件中断的软件模拟,进程正在执行时,几乎在任何时候都会发生事件,所以,信号是异步的。当信号发出时接收信号的进程也可以没有控制权。当进程收到一个信号后,它可以对信号采取如下三种措施之一: , 忽略这个信号; , 捕获(trap/catch)这个信号,这将导致执行一段称为信号处理的特殊代。这叫做处 理信号; , 允许执行信号的默认操作; 发送信号: 有二种方式: 1. 使用kill命令; 2. 使用kill函数; 发送信号之前,一定要取得接收进程对应在操作系统中的ID号,可以用getpid()函数来实现。 捕获并处理信号: 捕获并处理信号是和发送信号相对的另一方面。每个进程都能够决定怎样响应除了SIGSTOP和SIGKILL之外的其他所有信号,可以将一个信号和一个函数相绑定,这样,当这个进程接收到这个信号以后,就可以将当前运行的程序中断,执行绑定的函数,执行完绑定的函数以后,再返回继续运行主程序。 程序流程: 主程序开始 MP3解码器启动并初始化同步控制程序等待接收”准备好”MPEG4解码器启动并初始化 接收到两个解码器信号发送的初始化完毕,向同步控制程序发初始化完毕,向同步控制程序发”准备好”信号后,发送”启动送”准备好”信号送”准备好”信号“命令 接收到”启动”信号后,开始对接收到”启动”信号后,开始对文件的文件的音频部分进行解码视频部分进行解码循环,每次解码一帧,并检测状循环,每次解码一帧,并检测状态标志位,对应不同的状态,进态标志位,对应不同的状态,进行相应的跳转行相应的跳转 主程序结束 附录: , 关于MPEG4视频解码器,请参阅,,, , 关于MP3音频解码器,请参阅,,, , 关于Linux中信号,请参阅《GUN/LINUX编程指南》 ,
/
本文档为【【精品】AVI播放器的设计思想及开发流程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索