WebGL画面录制器MediaRecorder在华为、荣耀及部分其他安卓设备中使用时,会出现webgl画布渲染正常,但是录制出的视频画面黑屏无内容的情况。是否有办法解决这个问题?
目前发现以下设备存在录制黑屏的问题:
`ALT-AL10`: HUAWEI Mate X5
`ICL-AL10`: HUAWEI Mate X6
`ICL-AL20`: HUAWEI Mate X6 典藏版
`RVL-AL09`: 荣耀 Note10
`BRA-AL00`: HUAWEI Mate 60
`ALN-AL00` `ALN-AL80`: HUAWEI Mate 60 Pro
`ALN-AL10`: HUAWEI Mate 60 Pro+
`ALN-AL10`: HUAWEI Mate 60 RS ULTIMATE DESIGN 非凡大师
`CLS-AL00`: HUAWEI Mate 70
`PLR-AL00`: HUAWEI Mate 70 Pro
`PLA-AL10`: HUAWEI Mate 70 Pro+
`PLU-AL10`: HUAWEI Mate 70 RS ULTIMATE DESIGN 非凡大师
当使用
MediaRecorder
录制 WebGL 画面时,在华为、荣耀及部分其他安卓设备上出现黑屏无内容的情况,可能由多种原因导致,以下是一些常见的原因及对应的解决办法:1. 画布上下文和帧缓冲问题
javascript
const canvas = document.createElement('canvas'); const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl'); if (!gl) { console.error('无法创建 WebGL 上下文'); return; }
2. 跨域资源问题
const express = require('express'); const app = express(); app.use((req, res, next) => { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type'); next(); });
3. 设备兼容性和硬件加速问题
canvas { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); }
检查设备的浏览器设置,确保 WebGL 和硬件加速功能已启用。
4.
MediaRecorder
参数设置问题原因:
MediaRecorder
的参数设置不正确,例如录制的 MIME 类型不被设备支持,可能导致录制黑屏。检查 MediaRecorder 的 MIME 类型,确保设备支持该类型。可以通过以下方式检查支持的 MIME 类型:const supportedMimeTypes = []; const types = [ 'video/webm;codecs=vp9', 'video/webm;codecs=vp8', 'video/webm;codecs=h264', 'video/mp4;codecs=h264' ]; types.forEach(type => { if (MediaRecorder.isTypeSupported(type)) { supportedMimeTypes.push(type); } }); console.log('支持的 MIME 类型:', supportedMimeTypes);
选择设备支持的 MIME 类型进行录制,例如:
const stream = canvas.captureStream(60); // 60fps const recorder = new MediaRecorder(stream, { mimeType: 'video/webm;codecs=vp9' });
5. 渲染循环和帧捕获问题
原因:WebGL 的渲染循环可能没有正确更新画面,或者
MediaRecorder
没有在合适的时机捕获帧。function render() { // 清空画布 gl.clearColor(0.0, 0.0, 0.0, 1.0); gl.clear(gl.COLOR_BUFFER_BIT); // 绘制 WebGL 内容 // ... requestAnimationFrame(render); } render();
确保
MediaRecorder
在渲染完成后开始录制,例如在requestAnimationFrame
的回调函数中开始录制。通过以上步骤的排查和处理,应该可以解决大部分
MediaRecorder
录制 WebGL 画面黑屏的问题。如果问题仍然存在,建议在不同的设备和浏览器版本上进行测试,以进一步确定问题的根源。