2017-01-24 69 views
9

EDIT: Właśnie stworzyłem nowy projekt Meteor i działał: D wow.Ale nadal nie działa na moim głównym projekcie .. wygląda tak, jak mam różne ustawienia.Meteor DOMException: Nie można dekodować danych dźwiękowych

W moim projekcie Meteor.js mam 4 .mp3 -file znajdujące się w public/sounds/xyz.mp3. załadować te .mp3 z:

let soundRequest = new XMLHttpRequest(); 
    soundRequest.open('GET', this._soundPath, true); 
    soundRequest.responseType = 'arraybuffer'; 
    let $this = this; 
    soundRequest.onload = function() { 
     Core.getAudioContext().decodeAudioData(soundRequest.response, function (buffer) { 
      $this.source.buffer = buffer; 
      $this.source.loop = true; 
      $this.source.connect($this.panner); 
     }); 
    }; 
soundRequest.send(); 

Działa to na google Chrome, ale kiedy budować aplikację poprzez meteor run android-device, pojawia się następujący komunikat o błędzie: DOMException: Unable to decode audio data Zastanawiam się, czy jest to problem ponieważ ładowanie .png lub .jpg prac dobrze w wersji mobilnej. Nie zainstalowałem żadnych pakietów obok meteor add crosswalk, ale odinstalowanie tego nie pomoże.

+0

można zakładać pełną błąd lub StackTrace tutaj? –

+0

Przeczytaj to: https://developer.mozilla.org/en-US/docs/Web/API/AudioContext/decodeAudioData –

+0

@lolio czy miałeś okazję obejrzeć ten link - http://stackoverflow.com/questions/38589614/webaudio-streaming-with-fetch-domexception-nie-do-dekodowania-audio-danych Cięcie strumienia może prawdopodobnie zadziałać – Gandhi

Odpowiedz

5

Nie trzeba wykonywać żądań http, aby uzyskać lokalny zasób. Możesz po prostu odwołać się do lokalnego adresu URL. Na urządzeniu z Androidem ścieżka jest inna. Zobacz ten kod:

function getSound(file) { 
    var sound = "/sounds/"+file; 
    if (Meteor.isCordova) { 
     var s; 
     if (device.platform.toLowerCase() === "android") { 
     sfile = cordova.file.applicationDirectory.replace('file://', '') + 'www/application/app' + sound; 
     } 
     else { 
     sfile = cordova.file.applicationDirectory.replace('file://', '') + sound; 
     } 
     var s = new Media(
     sfile, 
     function (success) { 
      console.log("Got sound "+file+" ok ("+sfile+")"); 
      s.play(); 
     }, 
     function (err) { 
      console.log("Get sound "+file+" ("+sfile+") failed: "+err); 
     } 
    ); 
    } else { 
     var a = new Audio(sound); 
     a.play(); 
    } 
    } 

Na urządzeniu ładuje plik dźwiękowy asynchronicznie, a następnie odtwarza go. W przeglądarce po prostu ładuje się i odtwarza synchronicznie.

+0

hej Mikkel, thx za twoją odpowiedź, problem polega na tym, że pierwszy parametr decodeAudio musi być arraybufferem? Nie rozumiem, skąd biorę arraybuffera? – greedsin

+0

Czy robisz więcej z dźwiękiem, niż po prostu grając? – Mikkel

+0

Tak, użyję go do dźwięku przestrzennego (web audio API) – greedsin