首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ios上使用typescript/web音频api

在ios上使用typescript/web音频api
EN

Stack Overflow用户
提问于 2017-02-27 06:31:40
回答 1查看 2.3K关注 0票数 2

我在一个网站上工作,将使用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;代码看起来像这样(这都是原型代码,所以错误处理非常临时):

代码语言:javascript
复制
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时,我得到一个错误消息:

代码语言:javascript
复制
TypeError: Can only call AudioContext.decodeAudioData on instance of AudioContext.

由于它试图调用decodeAudioData方法的变量的类型是'any‘而不是' AudioContext ',我不知道它从哪里得到它必须是AudioContext的想法。但在任何情况下,这都不是解决问题的正确方法。我没有关于webkitAudioContext的类型信息,只有关于AudioContext的类型信息。是否有必要的类型信息存在,而我只是没有找到它?如果它不存在,创建它会有困难吗?或者,有没有一种方法可以完全绕过这组类的类型检查(这不是我的首选,但如果这是我们目前所能做的最好的选择,我会采用它)?或者是有一些我不知道的完全不同的方法来解决这个问题?

EN

回答 1

Stack Overflow用户

发布于 2017-02-28 06:58:45

解决了,至少达到了一次近似。这一行:

代码语言:javascript
复制
    PlayerService._audioContext = new ((<any>window).AudioContext || (<any>window).webkitAudioContext)();

创建在ios和非ios平台上工作的音频上下文,并使用"any's“防止typescript出现错误。这对我来说已经足够了,直到浏览器都不再使用webkit前缀,或者被适当的类型定义所支持。

我在使用decodeAudioData()时遇到的问题是由于ios上的Chrome无法理解我试图播放的.ogg文件造成的。当我切换到mp3时,它起作用了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42475034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档