基于web网页视频播放常见问题

1. 什么情况下可以使用HTML5播放?
要支持HTML5播放,浏览器必须同时满足两个条件:
1. 浏览器能解析HTML5标准的Video标签。
2. 浏览器能对H.264编码的视频做解码。

我们再来细细的说一说这个问题,我们先来解释下什么是HTML5。HTML5是用于取代1999年所制定的 HTML 4.01 和 XHTML 1.0 标准的 HTML(标准通用标记语言下的一个应用)标准版本;现在仍处于发展阶段,但大部分浏览器已经支持某些 HTML5 技术。HTML5播放视频,使用的是HTML5标准里的 video 标签,基本用法查看这里,更高级的接口定义请参阅W3C规范文档。 由于Video是HTML5规范里新增的标签,那么一定要浏览器能解析Video标签,否则肯定无法使用HTML5。

那么单单能解析HTML5的Video标签是否就能这个正常播放呢?视频是经过编码的,编码格式是H.264视频格式。所谓编码,其实就是一种压缩算法,要压缩,那么一定要解压缩,视频格式的解压缩就是解码,如果浏览器本身无法对视频文件进行解码,那么同样播放不出来。

所以综上,视频播放必须要满足上述两个条件,缺一不可。

基本用法查看这里,更高级的接口定义请参阅W3C规范文档

2. 为什么有些安卓手机无法播放视频?
首先,要解答这个问题,请先看问题1。

看过问题1,我们知道安卓播放跟厂商支持情况有关,其实前端JS这边对VIDEO标签的解析和H264的解码做不了什么实质的事情,我们只能尽量使用html5的API接口找到hack各种设备的方案,但关键还是看厂商支持情况,所以要在前端实现适配难度很大。

安卓由于严重的系统碎片化问题,导致不同的厂商、不同的浏览器对上述两种条件的支持各不相同,所以安卓没法简单的说到底是否支持HTML5播放,甚至同一个厂商的不同机型,其特点都不一样,我们遇到过单独支持flash的,单独支持html5的,或者二者都支持的,甚至还有都不支持的,另外还有明明实际上能使用HTML5播放但API又返回说不支持播放的。对此我们针对不同的Android设备和浏览器做了些矫正和强制判断,许多问题需要Case by Case去解决。
3. 对于HTML5和flash都不支持的安卓,我们怎么办?
问题1里我们说过,安卓设备上我们遇到过单独支持flash的,单独支持html5的,或者二者都支持的。但基于web的视频播放无非就这两种功能方案,如果都不支持怎么办?

其实还有个方案,就是MP4链接的形式,我们称之为MP4Link?,如下图:
这个看起来像个播放器,其实我们只是在播放区域放了一张长得像播放器的静态图片,在图片上我们设置了链接,指向到视频MP4文件,用户点击”播放按钮“(实际点击的是图片链接),触发浏览器本身的特性,会自动打开MP4文件,这个时候有些浏览器会自动调用设备默认的视频播放器,或者会问用户,当前是要下载还是要播放。
这个图片的真实DOM结构是:
<div style="background-image: url(http://i.gtimg.cn/qqlive/images/20121119/i1353305744_1.jpg);  width: 480px; height: 320px; background-position: 50% 50%; background-repeat: no-repeat no-repeat;">
<a style="width:100%;height:100%;display:block" class="tvp_mp4_link" href="http://121.14.123.15/vlive.qqvideo.tc.qq.com/i001216370f.mp4?vkey=A3ACE7BB0CEE0BBFF97146833176996528C34F0146E430ACBE5628C93D4885463181382FFA4E5E0F&br=66&platform=2&fmt=mp4&level=3&sdtfrom=v1010" target="_blank"></a>
</div>
4. 我们已知的一些播放问题

| 设备和浏览器 | 现象 | 解决方案|
|-|
| 小米1 & 小米2(MIUI V5系统 | 系统自带的浏览器API返回不支持H.264,但实际上点击可以进入全屏,MIUI自己拉起系统播放器播放视频 |矫正为使用HTML5|
|三星系列,主要是Note2,S3等|系统自带的浏览器API返回不支持H.264,但实际上可以播放|矫正为使用HTML5|
| QQ手机浏览器|点击播放以后强制使用浏览器自带的皮肤,无法使用腾讯视频用CSS3制作的皮肤 | QQ浏览器的皮肤外观和体验都还不错,可以接受该体验|
|微信4.版本运行在安卓4.0+的系统|播放无法全屏,点击全屏没反应|建议升级到微信5.0+,微信自身未针对安卓4.0做播放适配,未实现安卓4.0要求的全屏API|
|微信5.0+版本运行在MIUI系统| 概率性出现点击无法播放,点击全屏按钮以后即可播放|前端逻辑做了hack处理,针对微信for安卓,点击视频以后自动全屏播放(体验有点仿iPhone)|
|微信4.
版本在安卓4.0+系统|播放视频点全屏按钮无效|安卓4.0开始全屏功能需要APP响应安卓的系统接口才有效,而微信4.*版本并未实现该接口,微信在5.0才开始支持,可以使用伪全屏解决,详见问题9|
|微信5.0版本在搭载MIUIV5的小米1手机上|全屏以后会花屏|微信内部逻辑处理问题,可以使用伪全屏解决,详见问题9|

5. 统一播放器是如何选择当前设备应该用什么内核的播放器呢?
统一播放器在移动设备的判断流程如下:
ios设备除Mac系统以外都在html5
PC设备,含Mac系统都走flash
Android设备低于4.0都走flash
Android4.0以上系统会做些矫正,QQ手机浏览器3.×版本和Firefox浏览器使用MP4链接。微信4.2以上版本、MIUI原生浏览器实际是支持HTML5但JS API返回不支持,这里做了矫正强制使用HTML5。其他浏览器根据canPlayType接口判断是否支持H.264解码,支持则使用HTML5,否则使用Flash.
5. 移动设备能在网页里播放直播吗?
ios的HTML5直播是使用HLS技术,该技术只有ios系统才支持,所以用chrome、safari修改userAgent模拟是看不到效果的,可能会黑屏。
安卓手机基本不支持HLS,则只能使用flash播放直播,如果您使用的安卓设备不支持flash(能安装flash跟支持flash是两回事),则无法播放直播节目。

那么对于安卓这个问题该怎么解决?好消息是,安卓的手机QQ浏览器4.2版本开始原生支持HLS,使用手机QQ浏览器就能播放直播,遇到这个问题,我们建议是引导用户使用手机QQ浏览器。那么如果你是自己App里内嵌WebView?,希望支持直播,那么要么搞定flash,要么搞定HLS,或者直接找wwjs要腾讯视频适合安卓的SDK开发包。
6. 移动设备播放能做到自动播放吗?
由于移动设备系统的限制,在打开一个网页以后,必须要用户手动物理点击一次才能自动播放,而且在点击一次以后,再播放其他视频,就可以做到自动播放不需要再点击了。

那有没有办法突破呢?经过我们测试,部分iPhone设备,可以先调用video.pause(),然后再调用video.play()接口可以实现自动播放,但仅仅是部分设备有效,而且是同样的机型、同样的系统版本、同样的设置,有些机器可以有些无效,初步估计可能跟越狱有关,但还不完全确认。

安卓设备上目前还没发现可以自动播放的情况。

如果你不是在普通浏览器上使用统一播放器,而是自己的webview,那么其实可以在调用webview的时候设置几个属性,就可以打开视频的自动播放功能:

 
uiWebView.allowsInlineMediaPlayback = YES;
uiWebView.mediaPlaybackRequiresUserAction = NO;
 

微信是已经实现了自动播放接口,但需要根据域名申请权限,默认是禁止的,申请权限请联系微信的同学。
7. 移动设备能通过接口调整音量吗?
这个系统限制了,不能通过接口去修改音量,移动设备其实用户很方便的使用手机侧面调整音量大小。
为此,apple对限制接口做过解释:https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html#//apple_ref/doc/uid/TP40009523-CH5-SW11

apple API对音量的现在

8. 移动设备能全屏后强制横屏吗?
全屏播放目前在移动设备上播放基本没啥问题,但全屏后强制横屏这个同样受到系统限制,暂时还没找到方案突破系统限制,需要用户手动旋转屏幕。另外,微信默认是关闭了屏幕旋转功能的,所以在微信里全屏即使旋转屏幕也不能横过来,可以打开设置,以微信5.0为例:”我“->"设置"->"通用"->”开启横屏模式"。
9. 系统全屏和伪全屏的区别和使用场景

| | 系统全屏|伪全屏 |
|-|
|定义|在点击视频全屏的时候,调用浏览器遵循HTML5的全屏API,将播放器占满整个屏幕|点击全屏时,通过页面的DOM元素和样式修改播放器的尺寸,让播放器撑大到当前页面的100%宽度或者高度|
|差异描述|控制栏和播放界面使用浏览器或者系统的样式,前端不可修改,也不能增加或删减元素,无法控制其表现|视频文件播放解析是浏览器或系统,控制栏和播放界面使用自己通过CSS设计的样式,可以新增或删减元素,能看到浏览器的标题栏和底部的控制栏|

为什么有伪全屏的场景?有以下几个原因:
1. 系统全屏无法满足需求,比如需要在全屏的时候展示视频标题、App下载按钮、清晰度切换等
2. 规避系统全屏的bug,我们已知有如下几个场景:

| | 现象|原因 |
|-|
|微信4.版本在安卓4.0+系统|播放视频点全屏按钮无效|安卓4.0开始全屏功能需要APP响应安卓的系统接口才有效,而微信4.版本并未实现该接口,微信在5.0才开始支持|
|微信5.0版本在搭载MIUIV5的小米1手机上|全屏以后会花屏|微信内部逻辑处理问题|

可能还有我们未知的全屏问题,所以为了规避系统全屏的bug,我们可以伪全屏的形式实现。

那么是不是任何场景或者设备都能实现伪全屏呢?

|设备或系统|是否可使用伪全屏|
|-|
|安卓2.3.*|√ 默认使用flash播放,由flash player负责全屏逻辑,目前未发现不能全屏的情况|
|安卓4.0|√ 可以使用伪全屏|
|iPad|√ 可以使用伪全屏|
|iPhone、iPod Touch|× 由于系统限制,播放视频自动进入系统全屏,所以无法使用伪全屏|

10. iPhone、iPod全屏播放样式能修改吗?
iPhone、iPad播放视频是使用的系统全屏,见问题9的详细说明,系统全屏是系统接管,是调用的系统播放器实现的播放,所以前端不能修改其样式和表现。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,053评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 11,945评论 4 60
  • 十公里,对于一个经常跑半马的人来说简直小菜一碟,但是对于跑个800米都差点没命的人来说,你已经超级厉害了。 我总是...
    橙洋阅读 357评论 0 0
  • 前篇文章已经讲了GCD了,那么这两者有什么区别? GCD VS NSOperation "NSOperatio...
    _兜兜转转_阅读 637评论 0 5