前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >H5直播避坑指南

H5直播避坑指南

原创
作者头像
小时光
发布于 2018-01-15 10:27:51
发布于 2018-01-15 10:27:51
5.6K0
举报
文章被收录于专栏:Technology ShareTechnology Share

作者简介:

文赫,2015年加入腾讯,作为前端开发工程师参与过手Q游戏公会,游戏中心,企鹅电竞等项目,具有丰富的移动端开发和直播开发经验。

导语 企鹅电竞项目,直播和视频播放是其中的核心。面对着产品同学不断的询问:为什么h5的体验这么差?为什么不能和app的播放体验保持一致?我们对着h5不明确的文档和不同浏览器的怪异表现欲哭无泪。 经过一系列的调研爬坑,斩荆披棘,我们一步步提升了体验,做到了和app基本一致的体验。在摸索优化背后,我们也想把这些问题和解决方法总结下来,让其他同学做到直播的时候可以自豪的说,这就是我们的h5直播体验

1. 自动播放问题

通过autoplay属性

视频的自动播放需要在video标签上添加autoplay属性, 如:

<video autoplay><video/>

但是在很多浏览器里,如iOS下并不支持这个属性,在iOS下必须给webview设置

self.wView.allowsInlineMediaPlayback = YES;self.wView.mediaPlaybackRequiresUserAction = NO;

才能让这个属性生效从而让用户一进入页面就开始视频的自动播放

通过直接调用video.play()方法

在一些情况下我们想加入一些判断逻辑,如判断用户网络环境,在wifi下自动播放,在4g环境下给出提示,这中情况下就适合直接选中video并调用video.play来播放视频

但是这种情况下也需要webview的支持,如在手Q下可以做到直接调用,在微信下因为不允许视频直接播放,则必须通过用户的真实操作来触发调用video.play(),这就是各种微信的h5活动页面需要引导用户进行一下点击操作才开始的原因。

同时发现真实点击必须使用触发touchendclickdoubleclickkeydown 事件等标准的事件才能触发,使用Zepto封装过的tap事件并不能触发播放器的播放

2. 页面内联播放问题

在iOS Safari和一些安卓的一些浏览器下播放视频的时候,不能在h5页面中播放视频,系统会自动接管视频

如果需要在h5页面内播放视频,需要在视频标签上加上 webkit-playsinline,在iOS10以后,需要加上playsinline,建议同时加上这两个属性,同时需要app支持这种模式,手Q和微信都支持这种模式

代码语言:js
AI代码解释
复制
//在html
<video id="player" webkit-playsinline playsinline > 

//在app内设置webview属性
webview.allowsInlineMediaPlayback = YES;

3. 视频的高度问题

在安卓下,一些浏览器如QQ浏览器和UC浏览器,系统会把视频的层级调到最高,所以如果想在页面上显示dom元素,都会被视频盖住,单纯的设置该dom的z-index是无效的,如图所示

解决方案:

1.在弹出会显示在视频上方dom的时候暂停视频播放

2.将视频所在的dom的父元素的高度设为1

3.处理完弹出的事件后将视频所在的父元素高度还原

4. 视频的默认播放图标

在iOS下会有一个默认的播放图标,如图所示

在iOS都会默认显示,不能通过js控制,但是可以通过css样式将其隐藏

代码语言:js
AI代码解释
复制
video::-webkit-media-controls-start-playback-button {        display: none;
}

5.视频的控制栏

在h5播放的时候,如果在video标签上设置了controls属性,则会在视频里显示控制栏

代码语言:js
AI代码解释
复制
//在html
<video controls >

需要注意的是这个控制栏是系统webview自带的,无法通过css控制其样式,建议不要使用这个属性而是自己通过dom自己制作一套控制条

6.视频的刷新

我们知道video暴露了play和pause方法来提供视频的播放和暂停,但是h5没有标准的刷新方法,如果我们想实现视频的刷新,则需要通过js实现

代码语言:txt
AI代码解释
复制
var player = $('#player')[0];
player.load();
setTimeout(function () {
     player.play();
})

7.视频的全屏问题

1)全屏api

h5暴露了一个webkitRequestFullScreen方法,可以让每个dom都请求全屏,当然video标签也可以使用。

但是在测试中发现,一些安卓机不支持该属性,如小米手机,所以需要在调用的时候进行一下判断

代码语言:txt
AI代码解释
复制
var player = $('#player')[0];if (player.webkitSupportsFullscreen) {
    player.webkitEnterFullscreen();
} else {
   player.webkitRequestFullScreen();
}

2)系统接管播放

我们上边说道调用h5的webkitRequestFullScreen方法来进入视频的全屏,那么这个方法会使浏览器完全接管视频播放,如图所示

这种接管的后果是这时的我们是没有办法控制视频的播放,也没有办法在上面浮动我们的dom元素,如弹幕,礼物这些,会完全被视频盖在下面,所以我们的目标即是解决这种系统接管的问题

3)使用伪全屏(样式全屏)

样式全屏的核心是设置video标签的宽高,使其撑满整个webview,看上去像全屏一样

但是因为视频一般都是16:9的宽高比,所以在竖屏情况下不能很好的做到铺满整个屏幕

而一般用户进入页面基本都是竖屏,所以我们就要考虑怎么让用户在竖屏点击全屏按钮时,能体验到像终端app一样自动进入横屏全屏的体验,下面有两种方案

1.在用户点击全屏时候,通过css3属性旋转屏幕

通过css的transform,我们可以把dom元素旋转显示

通过-webkit-transform: rotate(90deg)并设置video的高度为当前webview的宽度,video的宽度为当前webview的高度来实现旋转全屏。

这种模式的显示没有太大问题,但因为是通过css控制的页面dom显示,对于原生的空间不能很好的控制,如系统的键盘

在拉起键盘输入弹幕的时候,键盘不受控制还是竖屏显示了

如果页面不涉及与原生组件的交互,那么这种方案是一种很可行且兼容性比较好的方案

2.用户在点击全屏时,通过js api来控制webview旋转横屏

在手Q里,我们和终端的同学合作添加了控制webview横竖屏的接口

在用户点击全屏的时候,先判断当前是否横屏

代码语言:js
AI代码解释
复制
/**
 * 是否横屏
 */
function isHorizontal() {       
    if (window.orientation != undefined) {        
        return (window.orientation == 90 || window.orientation == -90);
    } else {         
        return window.innerWidth > window.innerHeight;
    }
}//设置webview为横竖屏
 mqq.ui.setWebViewBehavior({         
      orientation: 0 //0是竖屏,1是横屏
 });
 
 

如果是竖屏则强制webview旋转进入横屏,同时监听页面的resize方法,页面横竖屏变化的时候会触发这个方法,在这个方法里再动态的调整video的宽高来铺满整个屏幕

注:

之前我们发现x5插入了一段js来劫持视频的全屏的事件

满足条件的video标签全屏时都会被X5接管,另外调用webkitEnterFullscreen方法时,X5也会接管播放器。

如果发现在x5内核下无法使用伪全屏而被浏览器接管,可以咨询下x5同事为你的域名开启白名单,不接管你域名下的视频播放

总结:

在经历过各种优化和调整后,我们可以在h5直播页做到看直播,看弹幕,发弹幕,发送礼物,表情,查看排名等各种功能,再配合上手Q里的隐藏titlebar的_wv=16777217,可以实现全屏播放效果,做到了媲美原生播放的体验。

现在的h5的播放还有很多的表现和兼容性的问题,希望这份指南可以帮你在遇到同样的坑时能尽快爬出来,并优化你的h5播放体验,吸引到更多的用户 : D

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
视频H5 video最佳实践
随着 4G 的普遍以及 WiFi 的广泛使用,手机上的网速已经足够稳定和高速,以视频为主的 HTML5 也越来越普遍了,相比帧动画,视频的表现更加丰富,这里介绍一些实践经验。
gnip
2020/10/28
4.7K0
腾讯云 Web 超级播放器开发实战
腾讯云 Web 超级播放器 TCPlayer 可实现在手机浏览器和 PC 浏览器上播放音视频流的问题,功能强劲,兼容性好,可以不依赖用户安装 App,就能进行播放。
初九之潜龙勿用
2024/06/20
2850
H5案例分享:微信视频播放全屏问题(转)
   在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微信框,出现控制条,如果视频不是腾讯视频,播放完毕会出现腾讯视频的广告推送,今天我们就来看一下如何规避这些问题。
山河木马
2019/03/05
6.8K1
H5视频自动播放踩坑杂记
最近的一次业务需求中,偶然接到了这么一个需求:“用户首屏可以自动播放一段视频,希望点击再全屏”。
不换
2024/04/30
1.2K0
H5视频自动播放踩坑杂记
走进安卓的重灾区----video
html5的video已经出来很久了。在ios上使用基本上没什么毛病,但是安卓下就是一个重灾区了,各种体验差。这几天搞了安卓的兼容,简直是要吐血。所以特意总结了一些强势的坑点。
winty
2019/12/21
1.6K0
网页视频autoplay兼容及解决方案
自动播放是指无需经过用户的同意就可以开始播放视频。这包括在video元素使用autoplay属性或者通过JavaScript代码直接调用video元素的play方法。 <video src="/video.mp4" autoplay> 和 videoElement.play();
用户6256742
2024/07/31
4940
网页视频autoplay兼容及解决方案
网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
PC端相应简单些,浏览器对<video>标签的兼容还是很好的,但是想要在浏览器中当做Banner视频自动播放就必须设置这些属性来更好地实现;
Tz一号
2020/09/10
3.8K0
听说你也在开发年终盘点?送你一篇详尽的踩坑实战~
年终了,听说你也在开发年终盘点?也许你可以看看这篇腾讯 ABCmouse 圣诞年终盘点活动页的踩坑实战记录。 圣诞节的时候 ABCmouse 为用户精心准备了一份圣诞礼物,你也想看下吗?快来扫下这个神奇的二维码... 好吧,知道你可能不想扫码 '__' ,直接看下图吧(截取了其中一段) 当然了,这篇文章不是介绍整个开发过程(实际上本身开发周期很短,开发才三天,另外两天bugfix和视觉还原,时间非常赶)。这篇文章主要记录我在开发的过程的过程的一些经验总结和遇到的坑。 坑一:视频坑 这次的年终盘点在前
用户1097444
2022/06/29
7330
听说你也在开发年终盘点?送你一篇详尽的踩坑实战~
【技巧】ionic3视频播放
一般视频的展示方式有两种:缩略图和直接播放,分别对应下面两种效果(可参考直播应用和今日头条视频):
IT晴天
2018/08/20
2K0
WKWebView音视频媒体播放处理
由于H5的video未设置autoplay、playsinline属性。我们需自己注入,才能实现效果。
conanma
2021/10/28
4.4K0
中高级前端必须注意的40条移动端H5坑位指南 | 网易三年实践
不知不觉在网易已有三年半,占了一半时间都在与移动端打交道,整个阶段都是遇坑填坑的学习过程。移动端开发在前端里像神一样地存在,不是说它多难而是说它坑位实在太多了,怎样填都填不完。Android和iOS各显神通,Android的系统版本和屏幕分辨率多得难以一招兼容,iOS的顽固标准和未知特性多得难以快速掌握。
JowayYoung
2021/02/03
4.4K0
关于“吴亦凡入伍”H5背后的技术—兼容android【 前端篇】
作者:nicky, 腾讯Tgideas 前端开发工程师 在“吴亦凡入伍”H5刷爆朋友圈之后,看到网上有较多同学对背后的技术感兴趣,正好借着机会跟大家分享一下。如果你正好也遇到在android下视频自动播放和两个视频连续播放(中间不需要触发)的问题,希望本文会对你有所帮助。 关于这个H5大概的实现原理,网上已经有人分析的很详细,我这里就不多做介绍了。 这次要分享是在兼容android下遇到的难点和兼容的思路: 第一个问题就是为了实现 Page1中里面图片中的人物要突然动起来,然后走出页面,那么video在初始
腾讯大讲堂
2018/02/12
8110
关于“吴亦凡入伍”H5背后的技术—兼容android【 前端篇】
EasyNVR H5无插件直播方案前端构建之:引用videojs无法自动播放
使用videojs来进行视频播放,videojs本身自带自动播放属性; 通过添加autoplay(),来完成视频播放的自动加载;
EasyNVR
2020/04/23
2.4K0
EasyNVR H5无插件直播方案前端构建之:引用videojs无法自动播放
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
本文由蘑菇街前端开发工程师“三体”分享,原题“蘑菇街云端直播探索——启航篇”,有修订。
JackJiang
2022/05/31
5.3K1
视频直播技术干货:一文读懂主流视频直播系统的推拉流架构、传输协议等
EasyNVR纯H5摄像机直播解决方案前端解析之:RTSP安防监控实时直播的网页H5自动播放方案
我们很多安防、互联网、直播的应用场景中,在打开一路直播流后,极少看到需要点击播放按钮才能直播 播放视频流的情况,但是由于H5场景的播放需要兼容的浏览器非常多,这样的情况下经常会遇到各种各样的摄像机网页播放的问题,比如这里解析的视频流自动播放的问题:
EasyNVR
2020/04/23
5K0
EasyNVR纯H5摄像机直播解决方案前端解析之:RTSP安防监控实时直播的网页H5自动播放方案
复杂帧动画之移动端video采坑实现
本文由 IMWeb 首发于 IMWeb 社区网站 imweb.io。点击阅读原文查看 IMWeb 社区更多精彩文章。 在企鹅辅导品牌页中,我们需要实现一个动画如下: 页面滚动到动画区域,播放动画, 对应动画部分如下: 帧动画当前的实现有以下几种方式: GIF 动画 大家比较熟悉的图片格式 lottie(http://airbnb.io/lottie/) Airbnb 开源项目,通过解析 AE 动画为 json 数据,支持跨平台的动画效果解决方案;lottie 在辅导中已经有实际应用,使用过的同学都表示
用户1097444
2022/06/29
2.4K0
复杂帧动画之移动端video采坑实现
H5 项目实用
如果你关闭自动识别后 ,又希望某些电话号码能够链接到 iPhone 的拨号功能 ,那么可以通过这样来声明电话链接 ,
White feathe
2021/12/08
5.3K0
移动端H5坑位指南
使用<a>能快速调用移动设备的电话/短信/邮件三大通讯功能,使用<input>能快速调用移动设备的的图库/文件。 这些功能方便了页面与系统的交互,关键在于调用格式一定要准确,否则会被移动端浏览器忽略。
饼干_
2022/08/23
3.5K0
关于直播卖货系统平台在微信浏览器中音视频播放的问题
Android 上,因为各个软件使用的浏览器渲染引擎不一样,所以直播卖货系统页面播放的效果差异也很大,这里主要以微信为主。微信使用的是腾讯浏览器自带的X5内核。
云豹kj的晨曦
2020/09/17
1.3K0
关于直播卖货系统平台在微信浏览器中音视频播放的问题
前端-video 标签沉浸式播放解决方案
“沉浸播放式”这个概念是我从Android开发里面的沉浸式引申过来的一个概念,沉浸式其实就是隐藏页面顶部的status bar和底部的navigation bar之后呈现出来的页面,一般用户很容易把沉浸式状态栏和透明化状态栏混为一谈,他们的区别如下:
grain先森
2019/03/29
2.1K0
前端-video 标签沉浸式播放解决方案
推荐阅读
相关推荐
视频H5 video最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档