2016-06-25 5 views
0

Я изо всех сил пытаюсь сыграть this WAV file, который играет в VLC (в соответствии с которым файл Mono, IMA WAV APDCM Audio (ms) сэмплирован по адресу 24000Hz с 16 bits per sample).Как правильно воспроизводить WAV-файл, создавая AudioBuffer в JavaScript?

Я подозреваю, что есть что-то не так с самого WAV-файла, так как при попытке воспроизвести его путем включения его непосредственно через<audio>, игра кнопка неактивна ... когда я пытаюсь играть программно с помощью new Audio(), я получить ошибку Failed to load because no supported source was found.

Вот самый простой пример того, что я пробовал, который производит некоторые звука ... другие попытки я пытался, которые пытаются использовать AudioContext.decodeAudioData всю заслонку при загрузке аудио, бросая Unable to decode audio data.

Этот пример производит некоторые, несколько узнаваемый звук, но я явно делаю что-то неправильно, потому что это так scratchy- я понимаю, что AudioBuffer требует Float32Array, значения которого находятся в пределах [-1,1], что они этого не делают. Но я не знаю, как их нормализовать, так как многие из значений имеют порядок 10e32.

<!DOCTYPE html> 
<html> 

<head> 
    <meta charset="utf-8"> 
    <style> 

    </style> 
</head> 

<body> 
    <script> 
    var context = new AudioContext(); 

    function loadSound(url) { 
     var request = new XMLHttpRequest(); 
     request.open("GET", url, true); 
     request.responseType = "arraybuffer"; 


     request.onload = function() { 
      data = new Uint8Array(request.response); 

      var buffer = context.createBuffer(1, data.length, 24000); 

      var channelData = buffer.getChannelData(0); 
      for (var i = 0; i < data.length; i++) { 
       channelData[i] = data[i]; 
      } 

      var source = context.createBufferSource(); 
      source.buffer = buffer; 
      source.connect(context.destination); 
      source.start(0); 
     } 

     request.send(); 
    } 

    loadSound('./test.wav'); 
    </script> 
</body> 

</html> 

Любая помощь будет оценена по достоинству; Спасибо!

ответ

0

В this phosphorous issue Я нашел подходящий ответ в функции readADPCM и encodeAudio16bit с чтением UInt8Array и кодированием 16-битного звука.