Using local file for Web Audio API in Javascript

后端 未结 4 1418
花落未央
花落未央 2020-11-28 06:04

I\'m trying to get sound working on my iPhone game using the Web Audio API. The problem is that this app is entirely client side. I want to store my mp3s in a local folder (

相关标签:
4条回答
  • 2020-11-28 06:38

    Because ios apps are sandboxed, the web view (basically safari wrapped in phonegap) allows you to store your mp3 file locally. I.e, there is no "cross domain" security issue.

    This is as of ios6 as previous ios versions didn't support web audio api

    0 讨论(0)
  • 2020-11-28 06:47

    I had the same problem and I found this very simple solution.

    audio_file.onchange = function(){
      var files = this.files;
      var file = URL.createObjectURL(files[0]); 
                  audio_player.src = file; 
      audio_player.play();
    };
    <input id="audio_file" type="file" accept="audio/*" />
    <audio id="audio_player" />

    You can test here: http://jsfiddle.net/Tv8Cm/

    0 讨论(0)
  • 2020-11-28 06:55

    Ok, it's taken me two days of prototyping different solutions and I've finally figured out how I can do this without storing my resources on a server. There's a few blogs that detail this but I couldn't find the full solution in one place so I'm adding it here. This may be considered a bit hacky by seasoned programmers but it's the only way I can see this working, so if anyone has a more elegent solution I'd love to hear it.

    The solution was to store my sound files as a Base64 encoded string. The sound files are relatively small (less than 30kb) so I'm hoping performance won't be too much of an issue. Note that I put 'xxx' in front of some of the hyperlinks as my n00b status means I can't post more than two links.

    Step 1: create Base 64 sound font

    First I need to convert my mp3 to a Base64 encoded string and store it as JSON. I found a website that does this conversion for me here - xxxhttp://www.mobilefish.com/services/base64/base64.php You may need to remove return characters using a text editor but for anyone that needs an example I found some piano tones here - xxxhttps://raw.github.com/mudcube/MIDI.js/master/soundfont/acoustic_grand_piano-mp3.js Note that in order to work with my example you're need to remove the header part data:audio/mpeg;base64,

    Step 2: decode sound font to ArrayBuffer

    You could implement this yourself but I found an API that does this perfectly (why re-invent the wheel, right?) - https://github.com/danguer/blog-examples/blob/master/js/base64-binary.js Resource taken from - here

    Step 3: Adding the rest of the code

    Fairly straightforward

    var cNote  = acoustic_grand_piano.C2;
    var byteArray = Base64Binary.decodeArrayBuffer(cNote); 
    var context = new webkitAudioContext();
    
    context.decodeAudioData(byteArray, function(buffer) {
        var source = context.createBufferSource(); // creates a sound source
        source.buffer = buffer;    
        source.connect(context.destination); // connect the source to the context's destination (the speakers)
        source.noteOn(0); 
    }, function(err) { console.log("err(decodeAudioData): "+err); });
    

    And that's it! I have this working through my desktop version of Chrome and also running on mobile Safari (iOS 6 only of course as Web Audio is not supported in older versions). It takes a couple of seconds to load on mobile Safari (Vs less than 1 second on desktop Chrome) but this might be due to the fact that it spends time downloading the sound fonts. It might also be the fact that iOS prevents any sound playing until a user interaction event has occured. I need to do more work looking at how it performs.

    Hope this saves someone else the grief I went through.

    0 讨论(0)
  • 2020-11-28 07:05

    Use HTML5 Audio tag for playing audio file in browser.

    Ajax request works with http protocol so when you try to get audio file using file://, browser mark this request as cross domain request. Set following code in request header -

    header('Access-Control-Allow-Origin: *');
    
    0 讨论(0)
提交回复
热议问题