1、问题的提出

某一天接了个需求,需要在手机的H5页面内加入视频,我开开心心做完,准备交付的时候,问题来了,PM想要用户一进入页面,视频就开始播放,不需要用户手动点击。

2、尝试解决

加autoplay

“视频自动播放”这个需求是ok的,那我就在video标签上加个autoplay属性嘛,在PC端浏览器里面试了一下,运行流畅,没有遇到什么问题,但是放在手机浏览器里面打开,就跟没设置autoplay是一样的。

监听canplay

那不行的话,我在页面加载完成的时候,监听video的canplay,然后执行play(),应该可以运行了吧?然而放到手机里一看,还是不行。

<video id="video" src="video.mp4" controls></video>
var video = document.querySelector('#video');
video.addEventListener('canplay', function () {video.play();
})

3、思考

问题来了,加autoplay不行,可以理解,可能手机浏览器不支持这个属性吧,但是我监听视频加载完成,手动去play(),这是程序常规方法,为什么也不行?
我尝试在监听回调里面加了个alert,发现没有弹出框。
所以我很长一段时间认为,手机浏览器无法自动播放视频,是因为内存大小的限制,导致无法监听video的加载完成。

4、解决方案

方案1 使用弹框

昨天在segment上游荡,发现了原来现在的手机浏览器是不允许网页中视频自动播放的,只有与用户进行了一次交互动作,才可以播放视频。(音频同理,这里就不重复提)
我尝试了一下,在页面上加一个弹框,用户点击了弹框之后(相当于一次交互完成),开始播放视频,发现是可以播放的,部分代码如下。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport"content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, width=device-width"><title>视频自动播放</title><style>html, body {width: 100%;height: 100%;}.video-container {width: 300px;height: 600px;display: flex;flex-direction: column;justify-content: center;align-items: center;overflow: hidden;margin: 0 auto;}#video {display: block;width: 100%;}#mask {width: 100%;height: 100%;background: rgba(0, 0, 0, 0.83);position: absolute;top: 0;left: 0;z-index: 2;display: flex;flex-direction: row;justify-content: center;align-items: center;}.pop-container {width: 250px;height: 200px;background: white;border-radius: 5px;display: flex;flex-direction: column;align-items: center;justify-content: center;}button {width: 50px;height: 30px;border-radius: 4px;}</style>
</head>
<body><div class="video-container"><video id="video" src="video.mp4"></video>
</div>
<div id="mask"><div class="pop-container"><p>页面内有自动播放视频 请注意流量</p><button onclick="playVideo()">我知道了</button></div>
</div>
<script>function playVideo() {document.getElementById('mask').style.display = 'none';var video = document.querySelector('#video');video.play();}
</script>
</body>
</html>

所以解决视频自动播放的一般做法是,在页面加载的时候弹框与用户产生交互,然后才能开始自动播放(如此看来,手机浏览器是真的很重视用户的流量了。)

存在的问题

按照上面的方法,只要想要在手机端页面中实现 进入页面,视频立即自动播放,就必须要借助一个额外的动作去引导与用户发生一次交互,那岂不是很丑,有没有办法是可以不借助弹框呢?答案是 有的。

方案2 使用jsmpeg.js

jsmpeg是一款视频解码器,具体怎么用,可以百度相关文档,实话说我对此也不熟悉,第一次听见的时候是听说jsmpeg可以实现网页端的视频直播功能,这一次用来解决视频自动播放的需求也是借鉴别人的想法。
关键代码如下:(前提:项目中已经引入了jsmpeg.min.js)

<canvas id="canvas" height="750" width="750"></canvas>页面加载完成的时候执行下面的js代码:
var canvas = document.querySelector('#canvas');
// 注意这里需要将video.mp4转换成ts格式的文件 才能生效
var player = new JSMpeg.Player('video.ts', { canvas: canvas, loop: false, autoplay: false, audio: true });
player.audioOut.unlock(this.onUnlocked);
player.play();//  onUnlocked方法
function onUnlocked() {player.volume = 1;
}

这样即使不跟用户产生交互 视频也能自动播放了,
注意点
1.demo必须放在服务器上面跑才能正常加载ts文件,如果是在本地的话,不能直接拖进浏览器运行,需要起个本地服务器
2.ts文件编码方式必须为MPEG编码,考虑到现在先进的ts编码方式是H.264了,之前用H.264编码的ts发现播放不了
存在的问题
1.这样播出的视频是没有声音的
附参考链接:微信Android自动播放视频(可交互,设置层级,无控制条,非X5)ffmpeg,jsmpeg.js,.ts视频

5、补充

1.虽然最后不管通过什么方法,算是实现了视频自动播放的需求,但是在真正播放的示例中,你会发现,使用video标签的时候,虽然设置了视频的宽高,但是不起作用,所以需要在video中使用下面的属性
<video id="video" src="" controls webkit-playsinline="webkit-playsinline" playsinline></video>
这样就可以在固定区域播放视频了。
2.借助方案1的思路,其实可以实现用户上传视频时的预览

<input type="file" id="filepicker" accept="video/mp4" onchange="chooseVideoInput()">
<div class="video-container"><video id="video" src="" controls webkit-playsinline="webkit-playsinline" playsinline></video>
</div>
<script>function chooseVideoInput() {var files = document.getElementById('filepicker').files[0];var video = document.getElementById('video');// 注意下面3行代码var url = URL.createObjectURL(files);video.src = url;video.play();}
</script>

3.将mp4转换成jsmpeg可播放的ts文件的方法
mac os下安装homebrew,之后使用brew install jsmpeg,运行下面命令:ffmpeg -i in.mp4 -f mpegts -codec:v mpeg1video -codec:a mp2 -b 0 out.ts (其中in.mp4和out.ts填写原视频的路径以及转出ts的路径),亲测有效

6、总结

其实关于浏览器video的问题困扰了我很久,昨日在segment上浏览到“chrome66 禁止自动播放后,有什么比较好的方法实现audio的自动播放吗”这样一个提问的时候,进去看到回答,突然想起video是不是也是一样的情况,今天看了下,果然是类似的,解了很久的疑问,所以勉励自己一定要善于发现并举一反三。
上面提到的不论是解决方案或者说补充的,大概能解决一大半手机浏览器视频相关的问题,剩下的问题有机会再补充。

参考链接:
chrome66 禁止自动播放后,有什么比较好的方法实现audio的自动播放吗
微信Android自动播放视频(可交互,设置层级,无控制条,非X5)ffmpeg,jsmpeg.js,.ts视频
mac osx 下 homebrew安装
mac 系统安装使用 ffmpeg
HTML5音视频播放(Video,Audio)和常见的坑处理
video在微信和QQ浏览器中不全屏播放解决

手机浏览器自动播放视频video(设置autoplay无效)的解决方案相关推荐

  1. 手机 html自动播放视频,video标签设置autoplay在手机浏览器无法自动播放视频的解决方案...

    content="initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, width=device-widt ...

  2. 谷歌(chrome)浏览器不能自动播放视频video标签

    问题:VIDEO播放视频只有声音不出现画面 原因:视频格式有问题 mp4的视频编码有三种:MPEG4(DivX),MPEG4(Xvid),AVC(H264) 使用H264格式,视频播放正常 问题:谷歌 ...

  3. 手机 html自动播放视频格式,Video 在网页和移动端无法自动播放问题??

    标签介绍 标签定义视频,比如电影片段或其他视频流.支持三种视频格式:MP4.WebM.Ogg.是 H5 的新标签,使用如下: //autoplay表示视频自动播放,controls表示显示视频控制器, ...

  4. Android浏览器自动播放视频,HTML 5自动播放谷歌浏览器Android不播放

    我试图在用户在浏览器中打开网页时自动播放视频.在我的笔记本电脑上,自动播放适用于所有浏览器,但在Android上,它不适用于谷歌浏览器,在iphone中,它不适用于Safari浏览器.我已经做了一个搜 ...

  5. html ios音乐自动播放muted,video下autoplay属性无效的解决方法(添加muted属性)

    背景:video下载入ogg格式视频,并设置自动播放属性autoplay,但是使用Chrome预览时,视屏画面已加载出来,但是无法自动播放,F5刷新后可以自动播放.使用火狐浏览器可以自动播放.最初代码 ...

  6. 解决微信浏览器video标签自动播放视频失效

    正常在浏览器好好的视频,在微信内置浏览器中点击播放全屏,样式也不一样,自动播放失效.罪魁祸首是微信把video标签都成微信规则的了.下面方式可以解决视频播放全屏以及不能自动播放的问题. <vid ...

  7. html5 video在uc不自动播放,uc浏览器无法播放视频怎么办

    uc浏览器是一款 内容非常丰富的手机服务软件,如果在使用的过程中无法播放视频,那么要如何解决呢,用户在使用过程中会出现各种问题,用户可以根据自己的需求解决这些问题,只需要使用浏览器就可以了,无需其他的 ...

  8. html自动播放视频手机,html5如何实现自动播放视频

    小白们有很多不知道的东西,这很正常,html5如何实现自动播放视频也是大家疑问的一个点!具体操作方式小编的工作性质没有涉及,只能为您搬运一些教程,如果对您有帮助那就再好不过了,小伙伴们大可以通过此教程 ...

  9. 自动点击器如何设置最快_微视APP如何设置自动播放视频-微视APP设置自动播放视频的方法...

    微视APP是一款功能实用的短视频软件,在手机上安装这款软件之后就可以在使用手机的时候点击打开微视,查看一些自己感兴趣的视频,现在很多视频应用都是采用滑动的方式来进行切换视频,如果用户的手不方便进行滑动 ...

  10. html自动播放视频不可用muted,html5_videoaudio的autoplay属性失效的解决方法

    autoPlay属性失效的原因 chrome 66以上的版本为了避免多媒体标签产生随机噪音,规定了不为静音的标签不能自动播放,需手动触发开始播放,标签定义为静音(muted: true)才可以自动播放 ...

最新文章

  1. 在C#中应用哈希表(Hashtable)
  2. C++面试题(1-3)
  3. activity 生命周期_死磕Android_App 启动过程(含 Activity 启动过程)
  4. 查看tensorflow pb模型文件的节点信息
  5. snort inline模式和passive模式区别
  6. SAP Spartacus B2B页面的6个tile,url是维护在什么地方的?
  7. c语言出圈游戏课设报告,c语言作业 出圈游戏
  8. html 360不识别,html 为什么在ie里显示正常在360浏览器不正常呢?
  9. 程序员面试技巧:一起去面试,公司用他而不用你,注意这三个点
  10. 编写代码注释的最佳实践
  11. C++字符串输入输出转换
  12. MessageBox 用法
  13. LeetCode第 252 场周赛 之5187. 收集足够苹果的最小花园周长
  14. Lorenzo Von Matterhorn(暴力)(树)
  15. 简单计算器 求一元二次方程的根
  16. 如何解决WORD安全模式错误问题
  17. redis使用及Spring Session+Redis实现Session共享
  18. win7系统自带的录像在哪里 Win7问题步骤记录器教程详解
  19. python中outside loop_未知环境下的Lidar概率占位栅格图(Occupancy Grid Map) Python代码实现...
  20. GreenHills基本操作:通过 R寄存器和上下文变量 定位异常

热门文章

  1. vs 2012/2013 等工具中,使用正则表达式,查找、替换
  2. 第一章数据结构和算法简介
  3. localStorage的跨与实现方案
  4. CentOS 7 配置DHCP服务器
  5. 互评Alpha版本—SkyHunter
  6. winform-Chrome-CefSharp库
  7. 20145339顿珠 MS08_067漏洞测试
  8. pytest框架学习
  9. LightOJ 1336 Sigma Function 算数基本定理
  10. 使用Windows service创建一个简单的定时器