我在一个网站上工作,将使用web audio API播放音频文件。我在Visual Studio代码中使用typescript和Angular 2。我可以让一切在ios以外的平台上运行良好;但是在iPad上,我遇到了一些令人费解的错误。
第一个问题是如何获得既能在ios平台上工作又能在非ios平台上工作的AudioContext。我知道它可以用普通的javascript来完成,例如http://gopherwoodstudios.com/wa/mp3/test.htm。按下按钮的需要很烦人,但我可以接受。所以我认为我遇到的问题与typescript有关。(我是一个打字新手,所以我可能误解了这里的一些基础知识。)
在ios上,你在运行时得到的仍然是一个webkitAudioContext,而不是一个AudioContext。似乎我使用的typescript定义不理解如何处理它。要么这样,要么我不知道如何告诉它需要知道的东西。最初我有一个AudioContext类型的成员变量,在非ios平台上一切正常。为了适应ios,我尝试将变量的类型更改为any,这样如果存在而AudioContext不存在,我就可以放入webkitAudioContext;代码看起来像这样(这都是原型代码,所以错误处理非常临时):
export class PlayerService {
private static _audioContext: any = null;
//......
public static getAudioContext(): any {
if (!PlayerService._audioContext) {
try {
if (typeof AudioContext !== "undefined") {
// We have an AudioContext type, so use it.
PlayerService._audioContext = new AudioContext();
} else if (window['webkitAudioContext'] !== "undefined") {
// We don't have AudioContext, but we do have webkitAudioContext,
// so attempt to use that.
PlayerService._audioContext = Object.create(window['webkitAudioContext'].prototype);
} else {
throw new Error('AudioContext not supported. :(');
}
} catch (err) {
console.log(err.message);
alert('Cannot create audio context.');
throw err;
}
}
return PlayerService._audioContext;
} 这在非ios平台上仍然有效;在ios平台上,它设法返回一个webkitAudioContext,其中包含预期的方法和属性。( Object.create(...)这是我能找到的让这么多东西发挥作用的唯一方法。)稍后,当我在这个对象上调用decodeAudioData时,我得到一个错误消息:
TypeError: Can only call AudioContext.decodeAudioData on instance of AudioContext.由于它试图调用decodeAudioData方法的变量的类型是'any‘而不是' AudioContext ',我不知道它从哪里得到它必须是AudioContext的想法。但在任何情况下,这都不是解决问题的正确方法。我没有关于webkitAudioContext的类型信息,只有关于AudioContext的类型信息。是否有必要的类型信息存在,而我只是没有找到它?如果它不存在,创建它会有困难吗?或者,有没有一种方法可以完全绕过这组类的类型检查(这不是我的首选,但如果这是我们目前所能做的最好的选择,我会采用它)?或者是有一些我不知道的完全不同的方法来解决这个问题?
发布于 2017-02-28 06:58:45
解决了,至少达到了一次近似。这一行:
PlayerService._audioContext = new ((<any>window).AudioContext || (<any>window).webkitAudioContext)();创建在ios和非ios平台上工作的音频上下文,并使用"any's“防止typescript出现错误。这对我来说已经足够了,直到浏览器都不再使用webkit前缀,或者被适当的类型定义所支持。
我在使用decodeAudioData()时遇到的问题是由于ios上的Chrome无法理解我试图播放的.ogg文件造成的。当我切换到mp3时,它起作用了。
https://stackoverflow.com/questions/42475034
复制相似问题