道阻且长,行而不辍,未来可期
问题:
在手机内置浏览上,虽然没有给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 属性规定视频下载时显示的图像,或者在用户点击播放按钮前显示的图像。 */}
<video
width="100%"
autoplay
loop
muted
playsinline
src={videoData}
x5-video-player-type="h5"
poster={firstPage}
>
</video>
下载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