Fab*_*ert 9 audio mobile-safari ios web-audio-api
在iOS 7.1上,当使用Web Audio API播放音频时,我不断发出嗡嗡声/嘈杂/失真的声音.听起来像这样扭曲,代替这样的正常.
使用HTML5音频时,相同的文件也没问题.这一切都适用于桌面(Firefox,Chrome,Safari).
编辑:
即:嗡嗡声的音频在iOS 7.1上.只要.
Howler.js不是问题.问题仍然是使用纯JS这样:
var context;
var sound;
var extension = '.' + ( new Audio().canPlayType( 'audio/ogg' ) !== '' ? 'ogg' : 'mp3');
/** Test for WebAudio API support **/
try {
    // still needed for Safari
    window.AudioContext = window.AudioContext || window.webkitAudioContext;
    // create an AudioContext
    context = new AudioContext();
} catch(e) {
    // API not supported
    throw new Error( 'Web Audio API not supported.' );
}
function loadSound( url ) {
    var request = new XMLHttpRequest();
    request.open( 'GET', url, true );
    request.responseType = 'arraybuffer';
    request.onload = function() {
        // request.response is encoded... so decode it now
        context.decodeAudioData( request.response, function( buffer ) {
        sound = buffer;
        }, function( err ) {
            throw new Error( err );
        });
    }
    request.send();
}
function playSound(buffer) {
    var source = context.createBufferSource();
    source.buffer = buffer;
    source.connect(context.destination);
    source.start(0);
}
loadSound( '/tests/Assets/Audio/En-us-hello' + extension );
$(document).ready(function(){ 
    $( '#clickme' ).click( function( event ) {
        playSound(sound);
    });
}); /* END .ready() */
Run Code Online (Sandbox Code Playgroud)
此处提供此代码的实时版本:Web Audio API - Hello world
谷歌没有提出有关iOS 7.1上这种扭曲声音问题的任何结果.
还有其他人遇到过吗?我应该向Apple提交错误报告吗?
我认为问题是由于重置audioContext.sampleRate属性引起的,这似乎是在浏览器/ OS播放以不同采样率记录的内容之后发生的。
我设计了以下解决方法,该方法基本上以静默方式播放以设备当前播放的采样率记录的简短wav文件:
"use strict";
var getData = function( context, filePath, callback ) {
    var source = context.createBufferSource(),
        request = new XMLHttpRequest();
    request.open( "GET", filePath, true );
    request.responseType = "arraybuffer";
    request.onload = function() {
        var audioData = request.response;
        context.decodeAudioData(
            audioData,
            function( buffer ) {
                source.buffer = buffer;
                callback( source );
            },
            function( e ) {
                console.log( "Error with decoding audio data" + e.err );
            }
        );
    };
    request.send();
};
module.exports = function() {
    var AudioContext = window.AudioContext || window.webkitAudioContext,
        context = new AudioContext();
    getData(
        context,
        "path/to/short/file.wav",
        function( bufferSource ) {
            var gain = context.createGain();
            gain.gain.value = 0;
            bufferSource.connect( gain );
            gain.connect( context.destination );
            bufferSource.start( 0 );
        }
    );
};
Run Code Online (Sandbox Code Playgroud)
显然,如果某些设备的采样率不同,则需要为每个采样率检测并使用一个特定的文件。
看起来 iOS6+ Safari 的默认采样率是 48000。如果你在第一次打开 mobile safari 时在开发者控制台中输入这个,你会得到 48000:
var ctx = new window.webkitAudioContext();
console.log(ctx.sampleRate);
Run Code Online (Sandbox Code Playgroud)
进一步参考:https : //forums.developer.apple.com/thread/20677
然后,如果您在 load: 时关闭初始上下文ctx.close(),下一个创建的上下文将使用大多数其他浏览器使用的采样率 (44100),并且声音将播放而不会失真。
归功于此为我指明了正确的方向(以防上述内容将来不再有效):https : //github.com/Jam3/ios-safe-audio-context/blob/master/index.js
自发布日期起的功能:
function createAudioContext (desiredSampleRate) {
  var AudioCtor = window.AudioContext || window.webkitAudioContext
  desiredSampleRate = typeof desiredSampleRate === 'number'
    ? desiredSampleRate
    : 44100
  var context = new AudioCtor()
  // Check if hack is necessary. Only occurs in iOS6+ devices
  // and only when you first boot the iPhone, or play a audio/video
  // with a different sample rate
  if (/(iPhone|iPad)/i.test(navigator.userAgent) &&
      context.sampleRate !== desiredSampleRate) {
    var buffer = context.createBuffer(1, 1, desiredSampleRate)
    var dummy = context.createBufferSource()
    dummy.buffer = buffer
    dummy.connect(context.destination)
    dummy.start(0)
    dummy.disconnect()
    context.close() // dispose old context
    context = new AudioCtor()
  }
  return context
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1602 次  |  
        
|   最近记录:  |