Javascript 在移动导航器中分配音频HTML src的Blob大小限制?

Javascript 在移动导航器中分配音频HTML src的Blob大小限制?,javascript,blob,html5-audio,wav,Javascript,Blob,Html5 Audio,Wav,如果我为大于500000000 KB(48 MB)的音频HTML元素动态分配SRC,则Mobile browser将启动一个错误。如果blob低于500000000 KB,则没有问题 大约13分钟的单声道音频。我需要30分钟 可以放大吗 我正在使用javascript生成声波(本例中为随机噪声),并保存在Uint8Array缓冲区中 var megaBytes = 48; //50331648 KBytes var bytes = megaBytes*1024*1024; var

如果我为大于500000000 KB(48 MB)的音频HTML元素动态分配SRC,则Mobile browser将启动一个错误。如果blob低于500000000 KB,则没有问题

大约13分钟的单声道音频。我需要30分钟

可以放大吗

我正在使用javascript生成声波(本例中为随机噪声),并保存在Uint8Array缓冲区中

  var megaBytes = 48; //50331648 KBytes
  var bytes = megaBytes*1024*1024;

  var uint8 = new Uint8Array(bytes);
  for (i = 0; i < bytes; i++) {
    uint8[i] = getRandomInt(0,100) + 128;
  }
    var myBlob = new Blob( [arrBytesFinal] , { type : 'audio/wav; codecs=0' });
    var readerBlob = new FileReader();
    readerBlob.addEventListener("loadend", function() {
        var myAudioFinal = readerBlob.result.toString(); 
        audioControl.src = myAudioFinal; //HERE THE NAVIGATOR PROBLEM.
        playButton.disabled = false;
    });
    readerBlob.readAsDataURL(myBlob);   
创建音频/wav类型Blob并将HTML audioControl指定为src之后

  var megaBytes = 48; //50331648 KBytes
  var bytes = megaBytes*1024*1024;

  var uint8 = new Uint8Array(bytes);
  for (i = 0; i < bytes; i++) {
    uint8[i] = getRandomInt(0,100) + 128;
  }
    var myBlob = new Blob( [arrBytesFinal] , { type : 'audio/wav; codecs=0' });
    var readerBlob = new FileReader();
    readerBlob.addEventListener("loadend", function() {
        var myAudioFinal = readerBlob.result.toString(); 
        audioControl.src = myAudioFinal; //HERE THE NAVIGATOR PROBLEM.
        playButton.disabled = false;
    });
    readerBlob.readAsDataURL(myBlob);   
一些注意事项:

  • 确保您的WAV确实是一个WAV文件(根据RIFF格式等,头为44字节)

  • 使用
    readerBlob.result.toString()不会提供音频数据(是字节值中的文本)

请尝试上一次显示的代码的此版本(未测试):

var myBlob = new Blob( [arrBytesFinal] , { type : 'audio/wav;' });
var readerBlob = new FileReader();
readerBlob.addEventListener("loadend", function( evt ) {
    var myAudioFinal = new Uint8Array( readerBlob.result );
    //var myAudioFinal = new Uint8Array( evt.target.result ); //# or try this way...
    audioControl.src = myAudioFinal; //HERE THE NAVIGATOR PROBLEM.
    playButton.disabled = false;
      
});
readerBlob.readAsArrayBuffer(myBlob); 

只需像audioControl.src=URL.createObjectURL(myBlob)
那样。DataURL只能如此之大。@StackSlave data://URL本身可以更大(在v8浏览器中约为512MB),但它肯定比blob://URI占用更多内存(约为3倍+)。为了便于操作,您可以使用Web Audio API直接生成声音,而无需内存压力@凯伊多。谢谢但我不能使用Web音频API,因为如果导航器最小化或移动暂停,导航器会关闭声音。