Babylon使用麦克风并处理常见问题解决

 更新时间:2023年04月03日 15:00:02   作者:方寸匠心  
这篇文章主要为大家介绍了Babylon使用麦克风并处理常见问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

引言

在Babylon.js中媒体设备流使用起来有很多坑,我们将在本文中逐一说明这些坑并提供相应的解决方案。

问题1:Property 'constraints' does not exist on type 'Window & typeof globalThis'.

在比较新的浏览器中,navigator对象中的getUserMedia方法已经被废弃了。取而代之的是navigator.mediaDevices.getUserMedia(),并且constraints应该作为参数传入。

const constraints = { audio: true, video: false };
navigator.mediaDevices.getUserMedia(constraints)

对于问题 Property 'constraints' does not exist on type 'Window & typeof globalThis'.ts(2339)。这是因为 TypeScript 没有识别到constraints变量的类型,可以尝试直接定义一个 const constraints 常量。

问题2: Property 'stream' does not exist on type 'Window & typeof globalThis'.ts(2339)

如果在使用媒体设备流时,你遇到了“Property 'stream' does not exist on type 'Window & typeof globalThis'.ts(2339)” 这个问题出现在TypeScript项目中。因为该类型Script不认识window.stream, 所以我们需要将它声明为any类型。解决方法如下:

(window as any).stream = stream;

这让编译器知道 window 对象现在具有一个名为stream的属性。

问题3: Property 'oninactive' does not exist on type 'MediaStream'.ts(2339)

在较新版本的Web API中,MediaStream对象不再包含oninactive属性,需要更改事件监听方式。 解决方法如下:

stream.addEventListener('inactive', () => {
    console.log('Stream ended ... ...');
});

而不是

stream.oninactive = () => {
    console.log('Stream ended ... ...');
};

此更改暴露了更多事件,同时也需要更改您的代码来处理它们。

总结

在 Babylon.js 中,使用媒体设备流时出现的问题通常是由于您没有根据最新的约定执行操作,或者由于 TypeScript 编译器不知道您所做的更改而导致的。通过遵循我们提供的指南和解决方案,您应该能够轻松地解决这些问题。

示例源码(修改前):

loadingASoundFromTheMicrophone = (scene: Scene, canvas: HTMLCanvasElement) => {
        let engine = scene.getEngine();
        let freeCamera = new FreeCamera("freeCamera", new Vector3(0, 5, -10), scene);
        freeCamera.setTarget(Vector3.Zero());
        freeCamera.attachControl(canvas, true);
        let hemisphericLight = new HemisphericLight("hemisphericLight", new Vector3(0, 1, 0), scene);
        hemisphericLight.intensity = 0.7;
        let sphere = MeshBuilder.CreateSphere("sphere", {segments: 16, diameter: 2}, scene);
        const constraints = window.constraints = { audio: true, video: false };
        function handleSuccess(stream: MediaStream) {
            const audioTracks = stream.getAudioTracks();
            console.log('Got stream with constraints:', constraints);
            console.log(`Using audio device: ${audioTracks[0].label}`);
            stream.oninactive = function() {
                console.log('Stream ended');
            };
            window.stream = stream; // make variable available to browser console
            var bjsSound = new Sound("mic", stream, scene);
            bjsSound.attachToMesh(sphere);
            bjsSound.play();
        }
        function handleError(error: any) {
            console.log('navigator.getUserMedia error: ', error);
        }
        navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
        return scene;
    }

示例源码(修改后):

loadingASoundFromTheMicrophone = (scene: Scene, canvas: HTMLCanvasElement) => {
        let engine = scene.getEngine();
        let freeCamera = new FreeCamera("freeCamera", new Vector3(0, 5, -10), scene);
        freeCamera.setTarget(Vector3.Zero());
        freeCamera.attachControl(canvas, true);
        let hemisphericLight = new HemisphericLight("hemisphericLight", new Vector3(0, 1, 0), scene);
        hemisphericLight.intensity = 0.7;
        let sphere = MeshBuilder.CreateSphere("sphere", {segments: 16, diameter: 2}, scene);
        const constraints = {  audio: true, video: false };
        function handleSuccess(stream: MediaStream) {
            const audioTracks = stream.getAudioTracks();
            console.log('Got stream with constraints:', constraints);
            console.log(`Using audio device: ${audioTracks[0].label}`);
            stream.addEventListener('inactive', () => {
                console.log('Stream ended ... ...');
            });
            (window as any).stream = stream; // make variable available to browser console
            var bjsSound = new Sound("mic", stream, scene);
            bjsSound.attachToMesh(sphere);
            bjsSound.play();
        }
        function handleError(error: any) {
            console.log('navigator.getUserMedia error: ', error);
        }
        navigator.mediaDevices.getUserMedia(constraints).then(handleSuccess).catch(handleError);
        return scene;
    }

以上就是Babylon使用麦克风并处理常见问题解决的详细内容,更多关于Babylon麦克风常见问题的资料请关注脚本之家其它相关文章!

相关文章

  • var与Javascript变量隐式声明

    var与Javascript变量隐式声明

    在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它。
    2009-09-09
  • JavaScript设计模式之工厂模式简单实例教程

    JavaScript设计模式之工厂模式简单实例教程

    这篇文章主要介绍了JavaScript设计模式之工厂模式,结合完整实例形式分析了工厂模式的概念、原理及javascript定义与使用工厂模式的相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • 基于bootstrap的文件上传控件bootstrap fileinput

    基于bootstrap的文件上传控件bootstrap fileinput

    这篇文章主要为大家详细介绍了基于bootstrap的文件上传控件bootstrap fileinput,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • JavaScript实现刷新不重记的倒计时

    JavaScript实现刷新不重记的倒计时

    网上关于JavaScript实现倒计时的文章有很多,但是一般都是刷新后会重新开始计时,可是我们有的时候会需要刷新却不重新计算的倒计时,这该怎么做呢?下面我们一起来看看这种倒计时怎么实现吧。
    2016-08-08
  • js时间日期格式化封装函数

    js时间日期格式化封装函数

    这里给大家推荐一款自己封装的js时间日期格式化的函数,非常的简洁实用,分享给有需要的小伙伴
    2014-12-12
  • javascript 得到变量类型的函数

    javascript 得到变量类型的函数

    在JavaScript中,有时需要准确知道一个变量的类型,显然typeof函数不能满足这个要求,这个函数在大多数情况下都返回object。
    2010-05-05
  • JavaScript的setter与getter方法

    JavaScript的setter与getter方法

    这篇文章主要为大家详细介绍了JavaScript的setter与getter方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-11-11
  • js图数据结构处理 迪杰斯特拉算法代码实例

    js图数据结构处理 迪杰斯特拉算法代码实例

    这篇文章主要介绍了js图数据结构处理 迪杰斯特拉算法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-09-09
  • 基于javascript实现tab切换特效

    基于javascript实现tab切换特效

    这篇文章主要介绍了基于javascript实现tab切换特效的相关资料,具有一定的参考价值,需要的朋友可以参考下
    2016-03-03
  • JS数组求和的常用方法总结【5种方法】

    JS数组求和的常用方法总结【5种方法】

    这篇文章主要介绍了JS数组求和的常用方法,结合实例形式总结分析了5种数组求和的常见操作方法与相关处理技巧,需要的朋友可以参考下
    2019-01-01

最新评论