Flv文件和Flash视频播放随着Youtube的流行,若干年前成为了网页视频播放的主流方案。当然,随着HTML和H264的普及,这个解决方案淡出也是迟早的事情了。但是作为这两天得折腾成功,还是把其中的一个典型问题记录在这里吧。
1. 问题的产生
Flash视频播放方案原理其实比较简单:网页端放置一个Flash编写的播放器,播放器通过http协议访问一个flv文件,通过Flash本身的视频解码功能进行视频播放。在播放过程中,为了视频的流畅播放器会对接下来要播放部分的数据做一些预读取。
具体来说,我们只需要把flv文件放在网站目录下,让播放器指向这个地址就可以播放了。
但是,这样制作好的播放器方案,在实际使用中会遇到一个问题:当用户拖动进度到还未缓冲的部分时,播放器会停止播放或者是回到视频的开始。这就是标题中的“对未缓冲进度条实现拖动”。
2. 原理与解决
设想一下,对于本地视频文件的拖动,播放器需要调用哪些接口才能实现呢?
- 通过某个API得知视频中某时刻对应的数据相对于文件头的偏移量;
- 通过某个API得到视频数据中指定偏移量以后的数据;
- 播放器本身要支持偏移访问和播放
对于网络是视频,同样需要这两个关键的接口。很遗憾的,默认状态下(上面说的把flv文件直接放在IIS host的目录下)这两个条件都不具备。
- Flv文件一般不包含keyframe和meta信息。keyframe就是关键帧,而meta是元数据,通过它们,我们才能知道视频时间所对应的文件偏移量。
- IIS不提供文件位置偏移访问接口。
如何是好呢?有条件要上,没有条件创造条件也要上!对于Flv文件,那当然是加上keyframe和meta就好,如何加法待会儿一一道来。对于文件偏移访问接口,有两个思路:
- 替换掉IIS,使用支持偏移访问的Flv嘛;
- 给IIS创造文件偏移访问的接口,iis extension、custom http handler和server side script都可以。
3. 实现
3.1 flv文件的meta生成
上面提到,flv需要有meta信息才能正确地被分析并根据时间获取偏移量。有两个工具可以补全meta信息:
两者都是命令行工具,也都有windows版本,下载了直接用就好。这里简单介绍一下用法:
flvtool2:
flvtool2 –U <input file> <output file>
jamdi:
jamdi –i <input file> –o <output file>
如此,meta信息就补全了。
3.2 使用IIS作为Web服务器的方法
IIS是Windows默认Web服务器,在Windows下不用它很难(虽然不少装Apache的),而且尤其是当你的网站是ASP.net写成的话。上面说过,IIS默认是不支持文件偏移访问的,我们要创造条件让它能够支持。这里提供两种方法:
3.2.1 Custom Http Handler
给IIS置入一个Custom Http Handler,让它来处理所有对flv的请求,这就行了。简略的步骤是:
1、使用任何一种CLR语言编写一个Custom Http Handler,这个Handler接受两个参数,第一个是flv文件名,第二个是start为参数名的偏移量,返回这个偏移量到文件尾的所有数据。
2、将上面的Http Handler部署到IIS中。
3、在IIS中将所有对.flv文件的访问定向到这个Custom Http Handler上。
具体的步骤还是挺多,有人总结的很好,这里不再重复了。步骤和源代码在这里。
3.2.1 PHP代理
当IIS已经配置好了PHP的时候,使用PHP代理也不失为一种简洁有效的方法了。这种方法的步骤非常简单:
1、编写一个php页面,这个页面接受两个参数,第一个是文件名,第二个是start为参数名得偏移量,php读取flv文件并返回从偏移量到文件尾的数据。
步骤相当简单,而且这个解决方案几乎是可以横跨所有Web Server和所有操作系统了,只要是能执行php的地方都可以应用。但是这种方法有两个缺点:
- PHP的效率可能会有问题;
- 对flv文件的位置有限制(这一点当你看了下面连接中的php代码以后就能了解)
具体的PHP代码见这里。
3.3 使用其它Web服务器
其实下面这些服务器都可以通过插件实现这功能:
- Apache:见这里;
- Nginx:见这里;
- Lighttpd:见这里;
基本主流的Web Server都有支持了,不过基本也都要求在编译时通过开关把这部分包含进去。
经过我的试验,最新的Nginx 1.0 for windows这个版本默认已经开启了这个开关,我们直接下载使用就好。既然标题上说的是“Windows服务环境下”,这里就大概说一下如何配置:
- 从nginx服务器下载最新的nginx 1.0 for windows,解压以后放置在某个目录下。
- nginx目前还没有写成windows服务,而只是应用程序。但是我们可以用这篇文章的办法,将它转变为一个服务。
- 在配置文件conf/nginx.conf中,添加如下语句:
location ~ \.flv$
{
flv;
}
这里要注意,上面关于Nginx的参考文献中,这个配置写错了,将“flv;”写成了“.flv;”。
3.4 播放器支持
上面描述了服务端和视频所要实现的部分,最后一步是要一个支持拖动的flv播放器。这里推荐两个很成熟的播放器吧,他们对于非商业应用都是免费开源,而商业应用的价格也不贵:
- FlowPlayer:http://flowplayer.org/index.html
- JW Player:http://www.longtailvideo.com/support/jw-player/jw-player-for-flash-v5
这两个播放器都有很详细的文档介绍如何支持所谓的流媒体(Flv streaming),也就是本文说的拖动。
4. 其它
本文介绍的解决方案,其实有很多种名字:
- Flv(flash) Streaming
- Pseudostreaming
- Flv未缓冲视频拖动
从第二个名字看来,它是一种“假”的流媒体。但是这种方案比起假设真的流媒体服务器并不逊色,不用架设专业甚至昂贵的流媒体服务器。也算是一种DIY的收获吧。
其实FlowPlayer的网站上也有一篇非常详细的综述性质的文章,可以和本文互为参考。
另外,对于高清视频,H264有一个比较统一的解决方案(IIS、Nginx、Apache、Lighttpd全机种制霸了),不用像flv这么折腾,具体参考这里。
5. 参考文献
from:http://www.cnblogs.com/Ricepig/archive/2011/04/16/2017703.html
分享到:
相关推荐
该资源文件用于 Windows服务器环境下flv视频播放——对未缓冲进度条实现拖动 该nginx服务器已经做好了相关的配置,支持视频的播放。相关文章说明请参考http://hi.baidu.com/mtb573/item/6a7115558f9b649f8c12ed9e
目前,由于Flash的流行,网络上绝大多数的微视频网站都采用了Flv格式来播放视频。在互联网上播放视频,有两种方式,一种是文件方式,即通过HTTP协议访问视频文件,这种方式的缺点是不能从特定的帧开始播放;另外一种...
flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放flv视频播放...
nginx搭建流媒体服务器(flv,mp4视频播放网站).zip
让您的服务器支持FLV格式的视频播放 此方法介绍如何让您的服务器支持FLV格式的视频播放
基于javaweb+jsp的flv视频播放程序
一些开发收集的C#FLV视频播放程序,就是web播放视频用的一个例子
项目中用的flv视频播放小demo,仅供跟我一样的小白学习参考
在jsp中给flv格式的文件增加控制进度条
1、在Windows系统下,搭建ffmpeg推流+nginx-http-flv-module直播拉流+FLV.js播放环境,所需依赖相关资源文件。 2、适合初学、研究、验证视频直播部署方案的相关技术人员。
flv直播拉流,实时视频播放demo
纯java代码实现各种视频转flv格式,支持在线播放。不依赖第三方jar包,转码效率高,速度快。
支持video视频插件播放flv格式的视频文件 可以让6.0以上版本的video视频插件支持播放flv格式的 视频文件 播放效果很不错
html 中 播放flv视频,只支持flv视频,可以下载转换器将其他格式的视频转换成flv.据测试ie 火狐 谷歌 均可以实现
NULL 博文链接:https://lbovinl.iteye.com/blog/2393592
将本工程放在tomcat的webapps目录下,启动tomcat,作为web服务,在浏览器下播放http-flv协议的视频流
FLV视频格式具有本身占有率低、视频质量良好、体积小等特点,非常适合在网络上传播。国内的视频站几乎都是采用FLV格式作为解决方案...于是我自己动手开发CKEditor的FLV视频播放插件现在上传。PS:这个版本是.net版的。
A5下载站向大家推荐一款专业的FLV视频加密软件——点量FLV视频加密系统。...由于播放部分完全可控代码编写,因此,通过限制播放端对解密文件的解密,就可以实现对非授权用户的限制播放。 点量FLV视频加密系统截图
使用jw_flv_player在服务器flv视频不能播放问题解决,网页中插入FLV格式的视频在本地预览中能播放,上传到服务器就不能播放的原因
winodws2003服务器不能播放 flv视频解决方法