本文小编为大家详细介绍“Babylon使用麦克风并处理常见问题的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Babylon使用麦克风并处理常见问题的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。
在比较新的浏览器中,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 常量。
如果在使用媒体设备流时,你遇到了“Property 'stream' does not exist on type 'Window & typeof globalThis'.ts(2339)” 这个问题出现在TypeScript项目中。因为该类型Script不认识window.stream, 所以我们需要将它声明为any类型。解决方法如下:
(window as any).stream = stream;
这让编译器知道 window 对象现在具有一个名为stream的属性。
在较新版本的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使用麦克风并处理常见问题的方法是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
原文链接:https://juejin.cn/post/7216992973418774589