javascript - Threejs 对 2D 视频的响应能力
问题描述
我想在 three.js 中播放交互式 2D 视频。我想在调整浏览器窗口大小时保持视频纵横比。
我当前的代码
var camera, scene, renderer;
var texture_placeholder,
distance = 500;
init();
render();
function init() {
var container, mesh;
container = document.getElementById('container');
camera = new THREE.PerspectiveCamera(90, 1, 0.1, 50000);
camera.target = new THREE.Vector3(0, 0, 0);
scene = new THREE.Scene();
var videoRatio = 16 / 9;
var geometry = new THREE.PlaneBufferGeometry(1.7, 1);
var video = document.createElement('video');
video.width = 960;
video.height = 540;
video.autoplay = true;
video.loop = true;
video.mute = true;
video.setAttribute('crossorigin', 'anonymous');
video.src = "http://commondatastorage.googleapis.com/gtv-videos-bucket/sample/BigBuckBunny.mp4"
var texture = new THREE.VideoTexture(video);
texture.minFilter = THREE.LinearFilter;
texture.format = THREE.RGBFormat;
var material = new THREE.MeshBasicMaterial({
map: texture
});
video.onplay = function() {
onWindowResize();
}
mesh = new THREE.Mesh(geometry, material);
scene.add(mesh);
renderer = new THREE.WebGLRenderer({
depth: true
});
renderer.setPixelRatio(window.devicePixelRatio);
renderer.setSize(window.innerWidth, window.innerHeight);
container.appendChild(renderer.domElement);
window.addEventListener('resize', onWindowResize, false);
var playBtn = document.getElementById("play_btn").onclick = function() {
console.log("[DEBUG] play button clicked");
video.play();
renderer.setSize(window.innerWidth, window.innerHeight);
}
}
function onWindowResize() {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
console.log("[DEBUG] onWindowResize");
}
function render() {
requestAnimationFrame(render);
update();
}
function update() {
camera.updateProjectionMatrix();
camera.position.z = 0.5;
renderer.setSize(window.innerWidth, window.innerHeight);
renderer.render(scene, camera);
}
<script src="//cdnjs.cloudflare.com/ajax/libs/three.js/109/three.js"></script>
<button id="play_btn">play</button>
<div id="container"></div>
Codepen 演示:https ://codepen.io/mr1985/pen/OJVOKgY
目前,我正在使用 iframe 来解决这个问题,但我更愿意使用 three.js 来处理视频纵横比。这里是我的 iframe 供参考:
<style>
.iframe-container {
overflow: hidden;
padding-top: 56.25%;
position: relative;
}
.iframe-container iframe {
border: 0;
height: 100%;
left: 0;
position: absolute;
top: 0;
width: 100%;
}
</style>
<div class="iframe-container">
<iframe width="960" height="540" src="http://localhost:8000/mini_player.html" frameborder="0" allowfullscreen scrolling="no"</iframe>
</div>
任何帮助将不胜感激。
解决方案
删除以下行解决了桌面浏览器上的问题:
video.width = 960;
video.height = 540;
在移动设备上,我仍然有错误的比例。我添加了以下内容以不全屏播放视频:
video.setAttribute( 'playsinline' , '' );.
推荐阅读
- java - 如何在 Windows 操作系统上删除或禁用 Java 中的“制表符选择器”?
- python - 自动工作流服务来处理 Google Drive 文件?
- javascript - 如何对异步功能进行适当的单元测试?
- python - Openstack Python API novaclient - 带有描述的安全组规则列表
- javascript - 使用用户输入显示json的值
- r - dplyr:将具有 3 个级别的因子列更改为具有 TRUE 和 FALSE 的 3 个逻辑列
- excel - 使用 VLOOKUP 在 Excel 中查找模式?
- symfony4 - Symfony 4.4 - 无法解决参数
- python - ODEs 模拟问题
- html - html nodejs中的表单在收到post请求后返回未定义