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.rhkb.cn/news/502948.html

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

相关文章

GitLab集成Runner详细版--及注意事项汇总【最佳实践】

一、背景 看到网上很多用户提出的runner问题其实实际都不是问题&#xff0c;不过是因为对runner的一些细节不清楚导致了误解。本文不系统性的介绍GitLab-Runner&#xff0c;因为这类文章写得好的特别多&#xff0c;本文只汇总一些常几的问题/注意事项。旨在让新手少弯路。 二、…

指针 const 的组合

1、首先来了解一下常量 const int num 5&#xff1b; 那么num的值是5&#xff0c; num的值不可修改 2、来了解一下指针 int value 5; int* p &value; 我喜欢吧指针和类型放一起&#xff0c;来强调p是一个指针类型&#xff0c; 而赋值的时候就得赋值一个int类型的地址…

《C++11》各种初始化方式的详细列举与对比

在 C 中&#xff0c;初始化对象的方式多种多样。随着 C 标准的演进&#xff0c;特别是 C11 的引入&#xff0c;初始化方式得到了显著的扩展和改进。本文将详细列举 C 中的各种初始化方式&#xff0c;并对它们进行对比&#xff0c;帮助开发者更好地理解和应用这些特性。 1. C98…

前端小案例——520表白信封

前言&#xff1a;我们在学习完了HTML和CSS之后&#xff0c;就会想着使用这两个东西去做一些小案例&#xff0c;不过又没有什么好的案例让我们去练手&#xff0c;本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…

【Vim Masterclass 笔记05】第 4 章:Vim 的帮助系统与同步练习(L14+L15+L16)

文章目录 Section 4&#xff1a;The Vim Help System&#xff08;Vim 帮助系统&#xff09;S04L14 Getting Help1 打开帮助系统2 退出帮助系统3 查看具体命令的帮助文档4 查看帮助文档中的主题5 帮助文档间的上翻、下翻6 关于 linewise7 查看光标所在术语名词的帮助文档8 关于退…

10-C语言项目池

C语言项目池 《个人通讯录》 《火车订票系统》 管理员用户1录入火车票信息区间查询/购票2显示火车票信息打印购票信息3查询火车票信息退票4修改火车票信息5添加火车票信息 《学生学籍管理系统》 1录入学生信息2添加学生信息3显示学生信息4查找学生信息5删除学生信息6修改学…

Android 绘制学习总结

1、刷新率介绍 我们先来理一下基本的概念&#xff1a; 1、60 fps 的意思是说&#xff0c;画面每秒更新 60 次 2、这 60 次更新&#xff0c;是要均匀更新的&#xff0c;不是说一会快&#xff0c;一会慢&#xff0c;那样视觉上也会觉得不流畅 3、每秒 60 次&#xff0c;也就是 1…

每日一题:BM1 反转链表

文章目录 [toc]问题描述数据范围示例 C代码实现使用栈实现&#xff08;不符合要求&#xff0c;仅作为思路&#xff09; 解题思路 - 原地反转链表步骤 C语言代码实现 以前只用过C刷过代码题目&#xff0c;现在试着用C语言刷下 问题描述 给定一个单链表的头结点 pHead&#xff…

78、使用爱芯派2_AX630C开发板 3.2T高有效算力 低功耗 支持AI-ISP真黑光实验

基本思想:使用爱心元智最新的版本开发板进行实验 AX630C、AX620Q 都是 620E 这一代 一、参考这个官方教程,先把代码在本地交叉编译完成 https://github.com/AXERA-TECH/ax620e_bsp_sdk 然后在拷贝到620c设备上 root@ax630c:~/ax620e_bsp_sdk/msp/out/arm64_glibc/bin# ./…

【Redis经典面试题七】Redis的事务机制是怎样的?

目录 一、Redis的事务机制 二、什么是Redis的Pipeline&#xff1f;和事务有什么区别&#xff1f; 三、Redis的事务和Lua之间有哪些区别&#xff1f; 3.1 原子性保证 3.2 交互次数 3.3 前后依赖 3.4 流程编排 四、为什么Lua脚本可以保证原子性&#xff1f; 五、为什么R…

企业网络性能监控

什么是网络性能监控 网络性能监控&#xff08;NPM&#xff09;是指对计算机网络的性能进行持续测量、分析和管理的过程&#xff0c;通过监控流量、延迟、数据包丢失、带宽利用率和正常运行时间等关键指标&#xff0c;确保网络高效、安全地运行&#xff0c;并将停机时间降至最低…

【开源】创建自动签到系统—QD框架

1. 介绍 QD是一个 基于 HAR 编辑器和 Tornado 服务端的 HTTP 定时任务自动执行 Web 框架。 主要通过抓包获取到HAR来制作任务模板&#xff0c;从而实现异步响应和发起HTTP请求 2. 需要环境 2.1 硬件需求 CPU&#xff1a;至少1核 内存&#xff1a;推荐 ≥ 1G 硬盘&#xff1a;推…

SUB输入5V升压充电16.8V芯片HU5912

HU5912芯片&#xff0c;作为航誉微电子有限公司推出的一款高性能升压充电管理IC&#xff0c;自其面世以来&#xff0c;便以其出色的性能和广泛的应用领域&#xff0c;受到了业界的高度关注和赞誉。本文将详细介绍HU5912芯片的技术特点、应用优势、市场定位以及其在各类电子设备…

练习(继承)

大家好&#xff0c;今天我们写几道题来巩固一下我们所学的知识&#xff0c;以便我们更好的学习新内容。 方法重写&#xff1a; 继承&#xff1a; 注&#xff1a;java中只能继承一个类 那么今天分享就到这里&#xff0c;谢谢大家&#xff01;&#xff01;&#xff01;

计算机网络 (28)虚拟专用网VPN

前言 虚拟专用网络&#xff08;VPN&#xff09;是一种在公共网络上建立私有网络连接的技术&#xff0c;它允许远程用户通过加密通道访问内部网络资源&#xff0c;实现远程办公和安全通信。 一、基本概念 定义&#xff1a;VPN是一种通过公共网络&#xff08;如互联网&#xff09…

04-spring-理-ApplicationContext的实现

实现1&#xff1a;ClassPathXmlApplicationContext 1、内部维护了 DefaultListableBeanFactory 2、通过XmlBeanDefinitionReader 读取配置文件将结果加入到 DefaultListableBeanFactory 3、没有维护 bean后置处理器 &#xff0c;可以通过在xml配置 <context:annotation-c…

STM32的LED点亮教程:使用HAL库与Proteus仿真

学习目标&#xff1a;掌握使用STM32 HAL库点亮LED灯&#xff0c;并通过Proteus进行仿真验证&#xff01; 建立HAL库标准工程 1.新建工程文件夹 新建工程文件夹建议路径尽量为中文。建立文件夹的目的为了更好分类去管理项目工程中需要的各类工程文件。 首先需要在某个位置建立工…

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测

回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测 目录 回归预测 | MATLAB实ELM-Adaboost多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 一、极限学习机&#xff08;ELM&#xff09; 极限学习机是一种单层前馈神经网络&#xff0c;具有训练速…

实现AVL树

目录 AVL树概念 AVL树结构 AVL树插入 LL型 - 右单旋 RR型 - 左单旋 LR型 - 左右双旋 RL型 - 右左双旋 插入代码实现 AVL树测试 附AVL树实现完整代码 AVL树概念 前面的博客介绍了搜索二叉树&#xff0c;二叉搜索树-CSDN博客 在某些特定的情况下&#xff0c;⼆叉搜索树…

unity学习11:地图相关的一些基础

目录 1 需要从 unity的 Asset Store 下载资源 1.1 下载资源 1.2 然后可以从 package Manager 里选择下载好的包&#xff0c;import到项目里 2 创建地形 2.1 创建地形 2.2 地形 Terrain大小 2.3 各种网格的尺寸大小 2.4 比较这个地形尺寸和创建的其他物体的大小对比 3 …