视频流对象创建时loadeddata事件监听器无法触发问题排查
排查video元素loadeddata事件不触发的原因
以下是针对问题的具体排查方向:
1. 确认video元素及资源基础状态
- 先验证
console.log("Video Acquired")是否输出,确保document.querySelector("video")成功获取到DOM元素。如果没拿到元素,事件绑定根本不会生效。 - 检查video的
src属性是否正确配置,直接在控制台打印video.src,确认资源地址可正常访问,同时排查是否存在跨域(CORS)问题。 - 查看video的
preload属性:若设置为none,浏览器不会预加载视频数据,可能导致loadeddata无法触发,可尝试改为preload="auto"。
2. 检查事件绑定时机
- 确认
createStreamingPlane函数的执行时机:如果函数执行时video元素还未挂载到DOM中,querySelector会返回null,事件绑定失败。建议将函数放在DOMContentLoaded事件回调中执行,或确保video元素在函数执行前已存在于DOM。 - 排查是否事件已提前触发:如果video在你绑定
loadeddata监听器之前就已经完成了第一帧加载,事件不会再触发。可通过video.readyState判断,若readyState >= 2(对应HAVE_CURRENT_DATA状态),说明数据已加载,可直接手动执行监听器内的逻辑。
3. 排查视频资源本身问题
- 检查视频格式/编码是否被当前浏览器支持,可在控制台打印
video.error查看具体错误信息。 loadeddata触发的前提是浏览器已加载视频的第一帧,若视频文件损坏或无有效帧数据,事件不会触发。
4. 浏览器环境与权限限制
- 若使用的是直播流,注意非HTTPS环境下可能存在资源加载限制,或检查是否存在浏览器权限限制(如媒体资源访问权限)。
- 打开浏览器控制台的Network面板,查看视频资源的加载状态,是否存在404、500等加载错误;Console面板是否有相关报错提示。
相关代码:
static createStreamingPlane(){ console.log("Stream Test") const video = document.querySelector("video"); console.log("Video Acquired") video.addEventListener('loadeddata',function(){ console.log("Function start") const videoTexture = new THREE.VideoTexture(video); console.log("Video Texture loaded") var size = 3; var geometry = new THREE.PlaneGeometry(size+2, size); //var texture = new THREE.TextureLoader().load(link); console.log('add'); var material = new THREE.MeshBasicMaterial({ map: videoTexture, side: THREE.DoubleSide, transparent: true, }); console.log("Material loaded") var mesh = new THREE.Mesh(geometry, material); console.log("Mesh loaded") var frame_geo = new THREE.PlaneGeometry(size + 2.81, size + 0.815); frame_geo.name = 'frame_check'; var frame_text = new THREE.TextureLoader().load(link_f); var frame_mat = new THREE.MeshBasicMaterial({ map: frame_text, side: THREE.DoubleSide, transparent: true, }); var frame_mesh = new THREE.Mesh(frame_geo, frame_mat); frame_mesh.position.set(0, -0.15, 0); const group = new THREE.Group(); group.name = 'image with frame'; mesh.name = 'image'; frame_mesh.name = 'frame'; frame_mesh.visible = true; frame_mesh.renderOrder = 1; group.add(mesh); group.add(frame_mesh); VRPandaEditor.vrPandaSceneController.currentScene.scene.add(group); var newObject1 = new VRPandaObject(group); VRPandaEditor.execute(new AddObjectCommand(newObject1)); VRPandaEditor.vrPandaObjectController.selectObject(newObject1); },false); }
内容的提问来源于stack exchange,提问作者J H
相关产品推荐
相关产品推荐

