编程实现avi文件的流播放

来源:互联网 发布:淘宝客服工作计划表 编辑:程序博客网 时间:2024/04/30 01:10

有时候会碰到一些比较BT的需求,比如说想要实现avi的在线播放。有时候会发现一些工具能实现,但是发现总是不够稳定。原因在于协议,如果播放器写得好,可以一边下载,一边分析下载的流,来实现播放。但是想要实现快进,或是拖动这些的就不容易了。

要解决这些问题,只有一点,那就是自己来实现这套流协议,然后作播放器来播放。为了实现这些东西,偶作一下分析,可以简单地把技术点分为三个:

1.流服务器的实现

2.流播放器的实现

3.注册客户端,来实现播放器的关联(这样点击网页上的链接时,可以自动弹出我们的播放器来播放)

接下来让我们详细地看看具体的实现分析吧。

一、流服务器的实现

我们可以通过分析AVI的文件格格式,以及播放时的需要,可以弄出来一个很简单的流协议。并且为了方便使用,我还是基于标准的HTTP协议上来扩展实现。在这里,我把这个协议分成了两大块:媒体摘要和媒体块。

媒体的摘要:根据我们在播放AVI的时候的要求,我们的摘要里面要含有这些信息:宽,高,帧率,解码器类型,流的数量(音频和视频),推荐的缓冲大小,总帧数,如果有音频流,那还得指定音频的采样频率,位数等信息,以及每一帧的索引。

媒体块:在这里面,我们就是真正的下载数据了,每次请求的帧数,这个可以根据我们的应用环境综合考虑了,主要要考虑以下几点:下载尽量快,请求数尽量少。

有了服务器的这些支持,我们就可以实现我们的客户端了。

二、流播放器的实现

具体的播放实现我在这里就不多写了,对于媒体播放器来说,无非就是拿到一帧数据,然后调用对应的解码器解成位图数据,然后把它画在界面上。

在这里主要讲流播放器数据的请求和快进的实现:

我把程序划成两个线程:一个线程负责下载数据,另一个线程负责把内容绘在界面上。

第一步获得媒体的摘要。得到这个摘要后,我们就可以得到媒体的大概信息了。然后再顺序地把索引表发送到服务器上去请求数据。为了更好的播放性能,我们可以把下载下面的媒体块保存在临时文件里面,然后再加一个索引位置来标明每一帧的起始位,以及长度。当播放时,如果发现该帧还未下载。就给那个下载线程发个请求,让它下次下载的时候,就从这个位置开始。所以快进这些的实现就变得很简单了,如果没有下载,只要很短时间的buffer就可以继续播放了。

三、注册客户端

为了更好的体验,偶们可以注册新的协议,这样用户在点击浏览器上的链接的时候,就可以自动打开我们的播放器来播放,偶暂把这个协议定为:ivp(Ironsoft Video Protrol).注册协议很简单,只要把以下的注册导入就可以了,当然我们也可以编程实现生成这些注册表:

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT/IVP]
@="IVPProtocol"
"URL Protocol"="/"C://Program Files//IronSoftPlayer//player.exe/""

[HKEY_CLASSES_ROOT/IVP/DefaultIcon]
@="/"C://Program Files//IronSoftPlayer//player.exe/",1"

[HKEY_CLASSES_ROOT/IVP/shell]

[HKEY_CLASSES_ROOT/IVP/shell/open]

[HKEY_CLASSES_ROOT/IVP/shell/open/command]
@="/"C://Program Files//IronSoftPlayer//player.exe/" /"%1/""

?

好了,avi的在线流播放就可以很轻松地实现了。嘿嘿,偶一共是用三个工作日左右就全部实现了。

原创粉丝点击