video标签在安卓手机内置浏览器上的播放问题

道阻且长,行而不辍,未来可期

问题:

在手机内置浏览上,虽然没有给video标签设置controls,但在内置浏览器上,就是会显示。
而且,video一旦自动播放,video的层级就会提升到最前,想设置一个盒子覆盖在上面都做不到,给前端造成了很大的困扰。

看了很多相关问题的解决方法,直到看到把video的src设置为blob(视频流)安卓手机的内置浏览器因为认不出数据格式,而不再劫持video标签的渲染。直觉是个好方法,开始动手。

解决demo(react):

import axios from 'axios';
import demoMP4 from '../assets/demo.mp4';

export function getURL(){
 return new Promise(function(resolve, reject){
    axios({
        method:'get',
        url:demoMP4,
        responseType: 'blob',//axios的post方法中responseType的默认值是“json”,改为“blob”即可。
        type: 'video/mp4'
      }).then(res=>{
        console.log(res,'@_@')
        let blob = new Blob([res.data]);//使用Blob类型的数据创建一个Blob类型的对象
        let url = window.URL.createObjectURL(blob);//将blob对象处理成url
        console.log(url,'url');//blob:http://localhost:3002/0e7424b0-c40b-4ae5-a0d6-74f6e60xxxxx
        resolve(url);
      }).catch(error=>{
        reject(error);
      })
 })
}

请添加图片描述

 console.log(url,'url');
 //blob:http://localhost:3002/0e7424b0-c40b-4ae5-a0d6-74f6e60xxxxx
 useEffect(()=>{
    getURL().then(url=>{
      setVideoData(url);
    }).catch(err=>{
      console.log(err);
    });
  },[])

 {/* poster: 属性规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。 */}
 {/* preload: 属性规定在页面加载后载入视频。*/}
  <video
       width="100%"  
       autoplay 
       loop 
       muted
       playsinline
       src={videoData}
       x5-video-player-type="h5"
       poster={firstPage}
    >
 </video>            

x5-video-player-type: 启用同层H5播放器,就是在视频全屏的时候,div可以呈现在视频层上,也是WeChat安卓版特有的属性。同层播放别名也叫做沉浸式播放,播放的时候看似全屏,但是已经除去了control和微信的导航栏,只留下"X"和"<"两键。目前的同层播放器只在Android(包括微信)上生效,暂时不支持iOS。至于为什么同层播放只对安卓开放,是因为安卓不能像ISO一样局域播放,默认的全屏会使得一些界面操作被阻拦,如果是全屏H5还好,但是做直播的话,诸如弹幕那样的功能就无法实现了,所以这时候同层播放的概念就解决了这个问题。不过在测试的过程中发现,不同版本的IOS和安卓效果略有不同。

下载blob类型的文件:
在回调函数中可以这样写

.then(res=>{
        console.log(res.data,'@_@')
      
        let blob = new Blob([res.data]);
        let url = window.URL.createObjectURL(blob);
        console.log(url,'url');//blob:http://localhost:3002/0e7424b0-c40b-4ae5-a0d6-74f6e60xxxxx
        //创建一个a标签,利用a标签的download属性,将mp4下载到本地
        let a = document.createElement("a");
        a.href = url;
        a.download = "xxx.mp4";    // 这里的文件名可以去res的header中取
        a.click();
        // 释放url对象
        window.URL.revokeObjectURL(url);
      })

video设置了autoplay在PC端不能自动播放,移动端也不行

pc端解决办法:
给video标签添加 muted

移动端解决办法:

  useEffect(()=>{
    const videos =document.getElementsByTagName("video");
    videos[0].play();
  },[])

参考文档:https://blog.csdn.net/SuiFengDieWu/article/details/125625900
参考文档:https://blog.csdn.net/littlebearGreat/article/details/103287596
参考文档:https://blog.csdn.net/weixin_42178670/article/details/116235454

### 微信 H5 Video 标签自动播放解决方案 在微信环境中,H5页面中的`<video>`标签默认情况下无法实现自动播放功能。这是由于微信浏览器的安全策略限制所致[^1]。以下是几种可行的解决方案: #### 方法一:监听 WeixinJSBridgeReady 事件 通过监听 `WeixinJSBridgeReady` 事件来触发视频的自动播放行为。此方法适用于 iOS 和部分 Android 设备。 ```javascript document.addEventListener('WeixinJSBridgeReady', function () { const videoElement = document.querySelector('video'); if (videoElement) { videoElement.play().catch(() => { console.error('Auto play failed.'); }); } }, false); ``` 这种方法利用了微信内置 JS Bridge 的初始化完成信号,在桥接加载完成后尝试调用视频的 `play()` 方法。 --- #### 方法二:用户交互触发动态播放 对于某些设备或场景下仍然无法自动播放的情况,可以通过用户的显式操作(如点击、触摸等)动态启动视频播放。这种方式可以规避大部分浏览器的安全限制。 ```html <button id="start-video">Start Video</button> <video id="myVideo" src="example.mp4"></video> <script> document.getElementById('start-video').addEventListener('click', function () { const videoElement = document.getElementById('myVideo'); videoElement.play(); }); </script> ``` 上述代码片段展示了如何通过按钮点击事件手动控制视频播放的行为[^3]。 --- #### 方法三:静音模式下的自动播放 许多现代浏览器允许在设置为静音的情况下启用 `<video>` 元素的自动播放功能。因此可以在 HTML 中添加 `muted` 属性并配合 `autoplay` 使用。 ```html <video autoplay muted loop playsinline src="example.mp4"></video> ``` 需要注意的是,即使设置了 `muted` 和 `autoplay`,仍可能因平台差异而失效。此时建议结合 JavaScript 显式调用 `play()` 方法以增强兼容性。 --- #### 方法四:处理 X5 浏览器全屏劫持问题 针对 Android 平台上的 X5 内核浏览器可能会强制将 `<video>` 标签切换至全屏模式的问题,可通过以下手段缓解: - **禁用全屏模式**:在 `<video>` 标签中加入 `webkit-playsinline` 或者标准化后的 `playsinline` 属性。 ```html <video autoplay muted playsinline webkit-playsinline src="example.mp4"></video> ``` - **隐藏原生控件**:通过 CSS 隐藏掉不必要的 UI 控制条,从而减少干扰体验。 ```css video::-internal-media-controls-overlay-cast-button { display: none; } video::cue { color: white; background-color: black; } ``` 这些调整能够有效降低被腾讯播放器接管的风险[^2]。 --- ### 总结 综合以上分析可知,解决微信 H5 页面中 `<video>` 标签无法自动播放的核心在于合理运用 API 调整以及适配不同终端特性。具体实施时可根据实际需求选取合适的组合方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值