收藏
回答

MediaRecorder在部分安卓、鸿蒙设备中录制出的画面是纯黑色?

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 非凡大师

最后一次编辑于  02-24
回答关注问题邀请回答
收藏

2 个回答

  • 微盟
    微盟
    02-24

    当使用 MediaRecorder 录制 WebGL 画面时,在华为、荣耀及部分其他安卓设备上出现黑屏无内容的情况,可能由多种原因导致,以下是一些常见的原因及对应的解决办法:

    1. 画布上下文和帧缓冲问题


    • 原因:WebGL 渲染的画布上下文没有正确设置或者帧缓冲未正确处理,可能导致录制时无法获取到有效的画面数据。
    • 解决办法
    • 确保 WebGL 画布的上下文创建正确,例如:


    javascript

    const canvas = document.createElement('canvas');
    const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
    if (!gl) {
        console.error('无法创建 WebGL 上下文');
        return;
    }
    


    • 检查帧缓冲的设置,确保渲染操作正确地写入到帧缓冲中。

    2. 跨域资源问题


    • 原因:如果 WebGL 中使用了跨域的纹理或其他资源,浏览器的安全策略可能会阻止这些资源在录制时被正确处理。
    • 解决办法
    • 确保所有使用的资源都来自同一域名,或者在服务器端正确配置 CORS(跨域资源共享)头信息。例如,在 Node.js 的 Express 服务器中可以这样配置:
    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. 设备兼容性和硬件加速问题

    • 原因:部分安卓设备可能对 WebGL 的支持存在差异,或者硬件加速设置不正确,导致录制时无法正常捕获画面。
    • 解决办法
    • 尝试在代码中手动启用或禁用硬件加速。在一些浏览器中,可以通过设置特定的 CSS 属性来控制硬件加速,例如:
    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 没有在合适的时机捕获帧。

    • 解决办法
    • 确保 WebGL 的渲染循环正常工作,不断更新画面。例如:
    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 画面黑屏的问题。如果问题仍然存在,建议在不同的设备和浏览器版本上进行测试,以进一步确定问题的根源。


    02-24
    有用
    回复
  • 智能回答 智能回答 该问答由AI生成
    02-24
    有用
登录 后发表内容