2015-03-02 1 views
0

J'ai besoin de charger un mp3, le découper et le jouer en utilisant web audio, sur firefox une tranche mp3 n'importe où et décoder le travail bien, mais sur le safari une erreur avec la valeur nulle se produit. Existe-t-il une astuce ou un moyen de découper le ArrayBuffer sur Safari?Slice ArrayBuffer avec Safari et jouer

player.loadMp3 = function(url, callback) { 

var request = new XMLHttpRequest(); 

request.open('GET', url, true); 

request.responseType = 'arraybuffer'; 

request.onload = function() { 

    var mp3slice = request.response.slice(1000,100000); 
    player.context.decodeAudioData(mp3slice); // context is webkitAudioContext on safari 
    callback(); 

}; 

request.send(); 

};

Je dois créer un lecteur mp3 avec quelques fonctionnalités Especial:

  1. Time Shift la musique (comme http://codepen.io/eranshapira/pen/mnuoB)
  2. écart Supprimer entre les musiques (je suis arrivé ce ArrayBuffers à trancher et rejoindre ensuite avec un blob, mais seulement en safary/IPAD ne fonctionne pas).
  3. Cross plate-forme (IPAD et Android.J'utilise Apache Cordova pour cela).

Solution

player.loadMp3 = function(url, callback) { 

    console.log("loading " + url); 

    var request = new XMLHttpRequest(); 

    request.open('GET', url, true); 

    request.responseType = 'arraybuffer'; 

    request.onload = function() { 

     console.log("loaded"); 
     console.log("decoding..."); 

     player.context.decodeAudioData(request.response, function(buffer) {   

      console.log("decoded"); 

      player.buffer = player.joinAudioBuffers(player.buffer,buffer,2000000); 

      player.duration += player.buffer.duration; 

      player.time = minsSecs(player.buffer.duration); 

      console.log("concatenated"); 

      callback(); 

     }); 



    }, function() { 

     alert("decode failure"); 

    }; 

    request.send(); 
}; 

Répondre

1

Le code que vous avez montré devrait fonctionner sur aucun navigateur. Pour une chose, vous devez fournir une fonction de rappel à decodeAudioData. Vous devez également découper le décodé données après décodage, pas les données brutes codées mp3 avant le décodage. Certains navigateurs pourraient être en mesure de décoder une tranche du fichier mp3, mais ce n'est pas prévu. Quelque chose comme ceci:

player.loadMp3 = function(url, callback) { 
    var request = new XMLHttpRequest(); 
    request.open('GET', url, true); 
    request.responseType = 'arraybuffer'; 

    request.onload = function() {  
    var mp3slice = request.response.slice(1000,100000); 
    player.context.decodeAudioData(mp3slice, function(decoded) { 
     var pcmSlice = decoded.slice(1000, 100000); 
     callback(pcmSlice); 
    }); 
    }; 

    request.send(); 
}; 

Je n'ai pas testé ce code.

+0

Je mets à jour ma question avec plus d'informations, merci pour tout! – JoeLoco

+0

@CrazyJoe, la nouvelle information n'affecte pas ma réponse, mais j'ai ajouté du code pour montrer ce que je veux dire. – aldel

+0

ok, je résous le problème en utilisant une solution similaire, merci. – JoeLoco