THREE.js的VideoTexture以及CanvasTexture在部分浏览器以及小程序webview中纯黑不起作用的解决办法

黑色是因为video没有自动播放导致的。
而且video必须设置muted(静音)属性,否则视频都无法播放;
如果不设置muted,也可以用设置x5-video-player-type="h5" 替代(意为兼容qq浏览器,解决在小程序中黑色的问题)

  const coverVideoTarget = document.getElementById('coverVideo');function initThree(){scene = new THREE.Scene();// camera = new THREE.Camera();camera = new THREE.PerspectiveCamera(75,window.innerWidth/window.innerHeight,0.1,10000);camera.matrixAutoUpdate = false;scene.add(camera);scene.add(new THREE.AmbientLight(0xffffff, 1.5));root = new THREE.Object3D();root.matrixAutoUpdate = false;scene.add(root);renderer = new THREE.WebGLRenderer({ canvas: canvas, alpha: true, antialias: true });renderer.setPixelRatio(window.devicePixelRatio);renderer.setSize(webglWidth, webglHeight);setVideo('./video/18912265449355602.mp4');// setModel();}function setVideo(videoUrl){console.log('setVideo')coverVideoTarget.src = videoUrl;const texture = new THREE.VideoTexture(coverVideoTarget);var mat = new THREE.MeshBasicMaterial({map: texture,transparent:true});const geo = new THREE.PlaneGeometry(400,240);// const geo = new THREE.PlaneGeometry(20,12);coverVideo = new THREE.Mesh(geo, mat);coverVideo.position.z = -50;coverVideo.position.x = 140;coverVideo.position.y = 200;root.add(coverVideo);}function setVideo2(videoUrl){console.log('setVideo2')coverVideoTarget.src = videoUrl;let vWidth = 400, vHeight = 240;coverVideoTarget.addEventListener('canplay', function () {vWidth = this.videoWidth;vHeight = this.videoHeight;});var canvas_process = document.createElement('canvas');// 未被加入body。用于绘制video帧图片并传入tracker识别使用var context_process = canvas_process.getContext('2d');const texture = new THREE.CanvasTexture(canvas_process);function update() {context_process.fillStyle = 'black';context_process.fillRect(0, 0, vWidth, vHeight);context_process.drawImage(coverVideoTarget, 0, 0, vWidth, vHeight);texture.needsUpdate = true;requestAnimationFrame(update);}update();var mat = new THREE.MeshBasicMaterial({map: texture,transparent:true});const geo = new THREE.PlaneGeometry(400,240);// const geo = new THREE.PlaneGeometry(20,12);coverVideo = new THREE.Mesh(geo, mat);coverVideo.position.z = -50;coverVideo.position.x = 140;coverVideo.position.y = 200;root.add(coverVideo);}function initNFT(marker, videoUrl) {// video宽高比 240 : 360if (typeof(NFTworker) !== 'undefined') {NFTworker.terminate();NFTworker = undefined;}// setVideo(videoUrl);NFTworker = new Worker('../js/imgTracker.worker.js');NFTworker.postMessage({ type: "initNFT", pw: trackImgWidth, ph: trackImgHeight, trackData: './../examples/Data/camera_para.dat', marker: marker });var resultTime = new Date().getTime(),noResultTime = 0;NFTworker.onmessage = function (ev) {var msg = ev.data;switch (msg.type) {case "nftInitSuccess": {var proj = JSON.parse(msg.proj);proj[0] *= ratioW;proj[4] *= ratioW;proj[8] *= ratioW;proj[12] *= ratioW;proj[1] *= ratioH;proj[5] *= ratioH;proj[9] *= ratioH;proj[13] *= ratioH;setMatrix(camera.projectionMatrix, proj);nftProcess();break;}case 'found': {// console.log('found')coverVideo && (coverVideo.visible = true);coverVideoTarget.play();setMatrix(root.matrix, JSON.parse(msg.matrixGL_RH));renderer.render(scene, camera);resultTime = new Date().getTime();nftProcess();break;}case 'noResult': {coverVideo && (coverVideo.visible = false);coverVideoTarget.pause();renderer.render(scene, camera);var noResultTime = new Date().getTime();if (noResultTime - resultTime > 3000) {console.log('go track');// trackProcess('track');nftProcess();} else {nftProcess();}break;}}};};
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>ALVA Image Tracker</title><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=0.5, maximum-scale=1"><link rel="stylesheet" href="css/nft-style.css">
</head>
<style>#coverVideo{/* visibility: hidden; */position: fixed;/* left: 0px; */left: -1000000px;top:0px;z-index: 10000;width: 320px;height: 240px;background-color: pink;}
</style>
<body><div id="loading" ><span class="loading-text">Loading, please wait</span></div><div id="app"><videoloopautoplaymutedplaysinlineid="cameraVideo"></video><video id="coverVideo" loop controls  webkit-playsinline="true" x-webkit-airplay="true"playsinline="true" x5-video-player-type="h5" preload="auto" src='./video/18912265449355602.mp4'></video><canvas id="canvas"></canvas></div><script src="../vconsole.min.js"></script><script src="js/third_party/three.js/three.js"></script><script src="js/third_party/three.js/GLTFLoader.js"></script><script src="https://res2.wx.qq.com/open/js/jweixin-1.6.0.js"></script><script src="threejs_worker.js"></script></body></html>
	var imgTracker;var cameraVideo = document.getElementById( 'cameraVideo' );if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {var hint = { audio: false, video: true };if( window.innerWidth < 800 ) { // 宽高比为2/3或者3/2var width = ( window.innerWidth < window.innerHeight ) ? 240 : 360;var height = ( window.innerWidth < window.innerHeight ) ? 360 : 240;width = width * window.devicePixelRatio;height = height * window.devicePixelRatio;hint = {audio: false,video: {facingMode: 'environment',// 调用后置摄像头width: { min: width, max: width }},};}navigator.mediaDevices.getUserMedia( hint ).then( function( stream ) {cameraVideo.srcObject = stream;cameraVideo.addEventListener( 'loadedmetadata', function() {cameraVideo.play();start(cameraVideo);} );} ).catch(err => {console.log('catch');});} else {}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

软件系统安全逆向分析-混淆对抗

1. 概述 在一般的软件中&#xff0c;我们逆向分析时候通常都不能直接看到软件的明文源代码&#xff0c;或多或少存在着混淆对抗的操作。下面&#xff0c;我会实践操作一个例子从无从下手到攻破目标。 花指令对抗虚函数表RC4 2. 实战-donntyousee 题目载体为具有漏洞的小型软…

#渗透测试#网络安全# 一文了解什么是跨域CROS!!!

免责声明 本教程仅为合法的教学目的而准备&#xff0c;严禁用于任何形式的违法犯罪活动及其他商业行为&#xff0c;在使用本教程前&#xff0c;您应确保该行为符合当地的法律法规&#xff0c;继续阅读即表示您需自行承担所有操作的后果&#xff0c;如有异议&#xff0c;请立即停…

ClickHouse vs StarRocks 选型对比

一、面向列存的 DBMS 新的选择 Hadoop 从诞生已经十三年了&#xff0c;Hadoop 的供应商争先恐后的为 Hadoop 贡献各种开源插件&#xff0c;发明各种的解决方案技术栈&#xff0c;一方面确实帮助很多用户解决了问题&#xff0c;但另一方面因为繁杂的技术栈与高昂的维护成本&…

Win11家庭版转专业版

Win11家庭版转专业版&#xff08;亲测有效&#xff09; 第一步 【断网】输入这个密钥&#xff1a; R8NJ8-9X7PV-C7RCR-F3J9X-KQBP6 第二步 点击下一步会自动重启 第三步 【联网】输入这个密钥&#xff1a; F3NWX-VFMFC-MHYYF-BCJ3K-QV66Y 注意 两次输入密钥的地方一致 …

IP 地址与蜜罐技术

基于IP的地址的蜜罐技术是一种主动防御策略&#xff0c;它能够通过在网络上布置的一些看似正常没问题的IP地址来吸引恶意者的注意&#xff0c;将恶意者引导到预先布置好的伪装的目标之中。 如何实现蜜罐技术 当恶意攻击者在网络中四处扫描&#xff0c;寻找可入侵的目标时&…

【Word_笔记】Word的修订模式内容改为颜色标记

需求如下&#xff1a;请把修改后的部分直接在原文标出来&#xff0c;不要采用修订模式 步骤1&#xff1a;打开需要转换的word后&#xff0c;同时按住alt和F11 进入&#xff08;Microsoft Visual Basic for Appliations&#xff09; 步骤2&#xff1a;插入 ---- 模块 步骤3&…

[0405].第05节:搭建Redis主从架构

Redis学习大纲 一、3主3从的集群配置&#xff1a; 1.1.集群规划 1.分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 2.每组是一主一从&#x…

科研绘图系列:R语言绘制分组箱线图(boxplot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图输出系统信息介绍 科研绘图系列:R语言绘制分组箱线图(boxplot) 加载R包 library(ggpubr) library(ggplot2) library(tidyverse) # dev…

Hadoop - MapReduce编程

文章目录 前言一、创建mapreduce-demo项目1. 在idea上创建maven项目2. 导入hadoop相关依赖 二、MapReduce编程1. 相关介绍1.1 驱动类&#xff08;Driver Class&#xff09;1.1.1 驱动类的定义1.1.2 驱动类的功能1.1.3 驱动类的作用 1.2 Mapper1.2.1 Mapper 的定义1.2.2 Mapper …

原码的乘法运算>>>只有0,1

MQ : 乘数 X : 被乘数 ACC : 乘积高位 [当前位是1,加上被乘数; 当前位是 0,加上0] 例如: MQ的最低位是1,所以要加上被乘数(01101) >>>> 得出 01101 >>>>> ACC MQ 需要整体逻辑右移 (原本01101 01011 >>> 001101 0101) 现在的次低位是…

mapbox基础,style样式汇总,持续更新

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言二、&#x1f340;根属性2.1 so…

人工智能知识分享第九天-机器学习_集成学习

集成学习 概念 集成学习是机器学习中的一种思想&#xff0c;它通过多个模型的组合形成一个精度更高的模型&#xff0c;参与组合的模型称为弱学习器&#xff08;基学习器&#xff09;。训练时&#xff0c;使用训练集依次训练出这些弱学习器&#xff0c;对未知的样本进行预测时…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

排序算法——堆排序

什么是堆 堆就是一种特殊的二叉树&#xff0c;他有以下特点&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值&#xff1b; 堆总是一棵完全二叉树。 堆又可以分为大根堆和小根堆 大根堆&#xff1a;根节点最大&#xff0c;每个节点都小于或等于父节点 小跟堆&am…

K-means算法在无监督学习中的应用

K-means算法在无监督学习中的应用 K-means算法是一种典型的无监督学习算法&#xff0c;广泛用于聚类分析。在无监督学习中&#xff0c;模型并不依赖于标签数据&#xff0c;而是根据输入数据的特征进行分组。K-means的目标是将数据集分成K个簇&#xff0c;使得同一簇内的数据点…

Linux 35.6 + JetPack v5.1.4之 pytorch升级

Linux 35.6 JetPack v5.1.4之 pytorch升级 1. 源由2. 升级步骤1&#xff1a;获取二进制版本步骤2&#xff1a;安装二进制版本步骤3&#xff1a;获取torchvision步骤4&#xff1a;安装torchvision步骤5&#xff1a;检查安装版本 3. 使用4. 补充4.1 torchvision版本问题4.2 支持…

Spring——自动装配

假设一个场景&#xff1a; 一个人&#xff08;Person&#xff09;有一条狗&#xff08;Dog&#xff09;和一只猫(Cat)&#xff0c;狗和猫都会叫&#xff0c;狗叫是“汪汪”&#xff0c;猫叫是“喵喵”&#xff0c;同时人还有一个自己的名字。 将上述场景 抽象出三个实体类&…

TCP与DNS的报文分析

场景拓扑&#xff1a; 核心路由配置&#xff1a; 上&#xff08;DNS&#xff09;&#xff1a;10.1.1.1/24 下(WEB)&#xff1a;20.1.1.1/24 左&#xff08;client&#xff09;&#xff1a;192.168.0.1/24 右(PC3)&#xff1a;192.168.1.1/24Clint2配置&a…

PWR-STM32电源控制

一、原理 睡眠模式不响应其他操作&#xff0c;比如烧写程序&#xff0c;烧写时按住复位键松手即可下载&#xff0c;在禁用JTAG也可如此烧写程序。 对于低功耗模式可以通过RTC唤醒、外部中断唤醒、中断唤醒。 1、电源框图&#xff1a; VDDA主要负责模拟部分的供电、Vref和Vref-…

WebSocket 测试入门篇

Websocket 是一种用于 H5 浏览器的实时通讯协议&#xff0c;可以做到数据的实时推送&#xff0c;可适用于广泛的工作环境&#xff0c;例如客服系统、物联网数据传输系统&#xff0c; 基础介绍 我们平常接触最多的是 http 协议的接口&#xff0c;http 协议是请求与响应的模式&…