最近完成了一个支持各个浏览器的视频播放功能,现做一些总结



第一步


起初设想使用H5,但是事与愿违,各浏览器对视频格式兼容不一致,又不可能转换出所有格式的视频,并且H5无法支持IE9以下版本,所以无法单独使用H5完成视频播放功能;


下面是对H5的一些总结:


1、H5 video元素不支持AVI格式视频;
2、实例:

<video width="320" height="240" controls="controls"> 
 
 <source src="movie.ogg" type="video/ogg"> 
 
 <source src="movie.mp4" type="video/mp4"> 
 
 Your browser does not support the video tag. 
 
 </video> 
 
 说明:Your browser does not support the video tag. 为当不支持H5video标签后显示的内容;controls="controls" 属性显示提供的播放、暂停和音量控件 
 

 3、当前,video 元素支持三种视频格式: 
 
 格式 IE Firefox Opera Chrome Safari 
 
 Ogg No 3.5+ 10.5+ 5.0+ No 
 
 MPEG 4 9.0+ No No 5.0+ 3.0+ 
 
 WebM No 4.0+ 10.6+ 6.0+ No 
 
 Ogg = 带有 Theora 视频编码和 Vorbis 音频编码的 Ogg 文件 
 
 MPEG4 = 带有 H.264 视频编码和 AAC 音频编码的 MPEG 4 文件 
 
 WebM = 带有 VP8 视频编码和 Vorbis 音频编码的 WebM 文件





第二步


之后想到是否可以使用widow media play在页面上播放,但是结果不太令人满意,虽然可以在win7上的IE9测试通过,但是在winxp下却无法播放,查找到原因是widow media play若要播放AVI视频,必须是12版本以上,并且XP系统只能支持到版本11,若想在XP一下版本播放,必须另外安装解码器,所以很不适合WEB播放要求,又无法实现;


一些参考资料:


一、调用widow media play播放
1、使用wmp只能在win7下的wmp12版本才能播放AVI格式视频;
2、wmp在xp系统只能安装wmp11版本,无法解码AVI格式,需要单独安装AVI解码器,不符合当初需求;
3、wmp对各个格式的视频解码存在以下缺陷,所以大部分视频播放不再用此方法来实现WEB播放视频;mp4格式同上;
3、html的代码如下:

<object id="MediaPlayer" classid="clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95" width="600" height="600" standby="Loading Windows Media Player components…" 
 type="application/x-oleobject" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112">
 <param name="FileName" value="mov_bbb.avi">  //视频源
 <param name="AutoStart" value="true">                  //自动开始播放
 <param name="ShowControls" value="true">          //显示控制条
 <param name="BufferingTime" value="2">
 <param name="ShowStatusBar" value="false">     //下方显示播放列表;
 <param name="AutoSize" value="true">
 <param name="InvokeURLs" value="false">
 <param name="AnimationatStart" value="false">
 <param name="TransparentatStart" value="false">  //设置播发器下方的一个小条
 <param name="Loop" value="1">
 </object>



参数为一些属性的设置,如AutoStart:自动播放;ShowStatusBar:下方显示播放列表;










第三步


这里就只能看看优酷等视频网站怎么实现各个浏览器的兼容性了;


查看优酷视频web代码,如下:


<div class="player" id="player" err="" style="">
 <object type="application/x-shockwave-flash" data="http://static.youku.com/v1.0.0607/v/swf/loader.swf" width="100%" height="100%" id="movie_player">
 <param name="allowFullScreen" value="true">
 <param name="allowscriptaccess" value="always">
 <param name="allowFullScreenInteractive" value="true">
 <param name="flashvars" value="VideoIDS=XODc5NDQ5ODQ0&ShowId=295450&category=85&Cp=authorized&Light=on&THX=off&unCookie=0&frame=0&pvid=1457932612486jaz1sp&uepflag=0&Tid=0&isAutoPlay=true&Version=/v1.0.120&show_ce=0&winType=interior&openScanCode=1&scanCodeText="限时" 扫码免广告&embedid=AjIxOTg2MjQ2MQJpLnlvdWt1LmNvbQIvdS9VTVRJNE5qa3dNamMwTUE9PQ==&vext=bc%3D%26pid%3D1457932612486jaz1sp%26unCookie%3D0%26frame%3D0%26type%3D0%26svt%3D1%26stg%3D20150125%26emb%3DAjIxOTg2MjQ2MQJpLnlvdWt1LmNvbQIvdS9VTVRJNE5qa3dNamMwTUE9PQ%3D%3D%26dn%3D%E7%BD%91%E9%A1%B5%26hwc%3D1%26mtype%3Doth&pageStartTime=1457932612486">
 <param name="movie" value="http://static.youku.com/v1.0.0607/v/swf/loader.swf">
 <div class="player_html5">
 <div class="picture" style="height:100%">
 <div style="line-height:460px;">
 <span style="font-size:18px">您还没有安装flash播放器,请点击<a href="http://www.adobe.com/go/getflash" target="_blank">这里</a>安装</span>
 </div>
 </div>
 </div>
 </object>
 </div>


大概研究了一下,type="application/x-shockwave-flash" 标识使用shockwave-flash插件播放,data="http://static.youku.com/v1.0.0607/v/swf/loader.swf"这个是什么?后来查找过程中渐渐认识到此为播放器的“壳“,也就是下方暂停,时间进度、音量、全屏等的这些控制的绘制SWF文件, name="flashvars" 属性其实就是最主要的参数部分,他可以向loader.swf传递必要参数,从而实现视频的播放。为什么需要这个loader.swf来播放视频呢?原来是由于我们能看到的优酷的视频源都是SWF格式的,swf直接用FLASH播放是无法显示控制条的,也就是暂停、播放、音量等;






第四步


在基本了解到这些信息后,开始搜索可以使用的类似优酷loader.swf的播放载体,网上找了几个,但在使用到我的项目中出现了不少问题;



1、首先使用如下网友提供的控件;




静态网页看了一下,时间显示有个bug,但是可以取消,还可以忍受;视频宽高设置有存在问题,视频会和进度条重叠,设置了半天才搞出一个可以用的宽高;并且进度条有点小了。。。。当使用到ASP.NET的动态网页中,需要根据参数播放不同的视频源,问题出现了:视频源配置在XML格式中,只能更新XML文件中的视频源参数后再来播放。实现后,发现播放视频只能是第一次播放的视频,之后修改视频源后都无法播放,只能播放第一次的!!!!!缓存造成的?找到各种方法去让播放页面都从服务器中加载,正在思考的时候,发现此法不通,按照此法怎么实现并发访问???如此,此方案不行!(不知道有啥办法,以后有时间在研究一下)。




2、走了不少弯路后,找到此网友分享的SWF,完成了最终我想要的效果;(连接:


一个小栗子:


前端代码如下:

<object type="application/x-shockwave-flash" width="640" height="480" 
 wmode="transparent data="flvplayer.swf?file=你要播放的视频源名称.swf">
 <param name="movie" value="flvplayer.swf?file=<%#URLstring %>" />
 <param name="wmode" value="transparent" />
 <param name='allowfullscreen' value='true' />
 <div class="picture" style="height:100%">
 <div style="line-height:460px;">
 <span style="font-size:18px">您还没有安装flash播放器,请点击<a href="http://www.adobe.com/go/getflash" target="_blank">这里</a>安装</span>
 </div>
 </div>
 </object> 
后端:
 
protected void Page_Load(object sender, EventArgs e)
 {
 this.DataBind();
 }
 protected string URLstring
 {
 get
 {
 string s = ".\\public\\" + Session["URL"].ToString();
 return s;
 }
 }

使用了一个SESSION简单验证了一下,一个页面修改SESSION,然后点击播放后跳转到此页面进行播放,每次可以播放传来的视频源;


至此,基本完成。


使用SWF格式,通过flash插件播放,基本上可以支持所有window系统的浏览器播放,需要注意的是需要在flash7以上版本,目前使用FLASH7播放时会无法播放,所以需要JS判断flash版本进行提示;




最后再说一下,为什么使用SWF,因为SWF格式才能在IE6/7/8上播放(目前我知道是这样),这也是优酷、土豆等为什么使用SWF完成WEB播放。