IOS 关于AudioContex的坑

1 篇文章 0 订阅

最近在做HTML5 网页端和音频相关的项目,在安卓、PC(chrome)、Mac(safari)下,AudioContext均能正常工作,但偏偏在IOS底下吃了亏,咋整都无法工作。示例代码如下:

window.AudioContext = window.AudioContext || window.webkitAudioContext || false;

if (window.AudioContext) {
    alert('no Web Audio API support');
    return false;
}
window.auctx = new AudioContext();
console.log('采样率:'+auctx.sampleRate);
navigator.mediaDevices.getUserMedia({audio:true}).then(function(stream){
    console.log('设备:'+stream.getAudioTracks()[0].label);
    window.aisrc = auctx.createMediaStreamSource(stream);
    window.aiprc = auctx.createScriptProcessor(2048,1,1);
    window.aiprc.onaudioprocess = function (e){
        var in_data = e.inputBuffer.getChannelData(0);
        var out_data = e.outputBuffer.getChannelDate(0);
        out_data.set(in_data); // TODO: 这里得到的是Float32Array, 是-1.0 ~ 1.0的裸数据流,可以根据自己的需要转换
    }
    /* 连接音频节点 */
    aisrc.connect(aiprc).connect(auctx.destination);
    console.log('音频初始化成功');
}.catch(function(err){
    console.log('初始化失败,请授予音频权限');
}

以上代码仅作示例,,,未实际运行。测试发现IOS上始终无法进入onaudioprocess回调,原因是auctx的state处于suspend挂起状态,但笔者无论怎么调用auctx.resume()都无法使之进入running状态。。。
后来在apple的论坛上发现有人回答这个问题,是苹果的策略引起的,大意是必须通过 click、touch的事件回调,在回调函数里面创建AudioContext,并调用resume才能正常工作。。原因是防止在载入的时候就突然播放声音,防止吓到用户。。。 - -
修改代码如下,顺便注意auctx要挂在全局变量下,不然垃圾回收了会出错的。。

$('#button').on('tap', function(){
    /* 把原来的代码挪到这里就好了。。。 */
    auctx.resume(); // 不调用resume是不会退出suspend状态的
}

以上
Apple论坛讨论原帖
github上的示例代码
Apple官方支持文档

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值