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

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浏览器中不全屏播放解决

原文地址:https://www.cnblogs.com/baimeishaoxia/p/11816413.html

时间: 2024-11-05 12:26:02

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

兼容360模式自动播放视频【需要flvpalyer.swf】

<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="210" height="160"> <param name="movie

不要问我为什么在手机浏览器不能自动播放视频跟音频

首先,移动端浏览器大部分是禁用video和audio的autoplay功能: 并且,很多移动浏览器也不支持首次js调用play方法进行播放. 这样做主要是为了防止不必要的自动播放浪费流量. 要实现可以播放音频文件,不能隐藏播放的控件. js方法调用play的代码: <script> $(function(){ $("#body").on("touchstart",function(){ audio.play(); }); }); </script&

IIS主机在某些情况下无法播放视频的设置方法

默认情况下,Windows Server的IIS主机是不支持FLV文件类型,通过http访问是无法播放视频. MIME类型就是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序来打开. 设置MIME,让IIS支持更多文件类型. 在IIS中添加FLV的MIME类型: IIS里面的站点属性->http头->添加Mime类型 扩展名填写:.flv Mime类型填写:flv-application/octet-stream 重新启动该站点 其它

手机端audio部分手机无法自动播放处理

<section class="music rotate"> <audio loop src="/static/wishChina/music1.mp3" id="audio_play" autoplay preload></audio> </section> //下面为jquery处理,加载完成,则调用该方法,播放音乐 function audioAutoPlay(id) { var audio

实现微信浏览器自动播放MP3音乐

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>MP3</title> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.8.3/jquery.min.js"></script> </hea

H5.video在微信中禁止全屏播放视频和直播流

这段时间在做一个直播项目,有直播需求,也有视频播放需求,要求能在微信中以半屏的方式播放,另外半屏可以做一些操作,还有些组件需要悬浮在视频上方.网上各种扒拉,各种实验,以求在微信中实现不全屏就能播放和自动播放,最终还是用了单纯的video标签.自动播放到目前还是没找到完美的解决方法. 非全屏播放视频 <video loop autoPlay src={url} controls={true} poster={pic} playsinline webkit-playsinline x5-video-

H5音乐自动播放ios//禁止安卓手机图片点击

定义音乐按钮 <div id="music-btn" class="o-play" style="width: 24px; height: 24px; display: block; position: absolute; top: 12px; right: 12px; z-index: 9999; background: url(images/musicbtn.png) no-repeat center/cover;"></d

video实现有声音自动播放

video实现自动播放有声音 需求:老板见人家可以的,我们的也要可以!!! 前端:自动播放,简单... 要实现:鼠标移入视频播放同时有声音,移出让你暂停,,,,, 问题集合 1- 自动播放实现没有声音, 2- 怎么实现有声音自动播放? 3- 鼠标移入移出实现... 解决 1--了解故事背景: 因为曾经某些"邪恶"的前辈们,在页面中展示了很多类似 是兄弟就一起来-----我是(⊙_⊙)辉??? 动感的画面,有趣的话语,曾经也被吸引住了,只是那个声音..... 简而言之----厂商认为用户

H5 播放视频常见bug及解决方案

本文摘自:本文来自“小时光茶社(Tech Teahouse)”公众号 原文:https://mp.weixin.qq.com/s/MM5ZwCiWLAeHalsNYMImnw 1. 自动播放问题 通过autoplay属性视频的自动播放需要在video标签上添加autoplay属性, 如: <video autoplay><video/> 但是在很多浏览器里,如iOS下并不支持这个属性,在iOS下必须给webview设置: self.wView.allowsInlineMediaPl