2013-05-09 8 views
5

Chrome 27 beta getta una SyntatxError quando provo ad eseguire la seguente riga di javascript:Web quando seguo l'API

offlineContext = new webkitOfflineAudioContext(2, 7*48000, 48000); 

Questo è in conformità con la raccomandazione del W3C, e dopo ore di ricerca sul web ho visto decine di esempi che apparentemente funzionano con questa forma esatta. So che l'API può essere soggetta a modifiche, ma non riesco a trovare alcun suggerimento che abbia. Dove sto andando male?

Stranamente, non fallisce quando provo in jsfiddle. Ho anche provato a eseguire in jsfiddle l'intera funzione in cui questo frammento esiste, eliminando un paio di elementi. Di seguito è la funzione che sto cercando di eseguire. Un "SyntaxError Dom Exception 12" si verifica dove indicato quando viene eseguita la funzione.

Ho un'app audio funzionante e sto solo cercando di aggiungere l'elaborazione in background per il rendering successivo utilizzando un OfflineAudioContext. Se definisco OfflineAudoiContext nella mia funzione init, non riesco a ottenere l'errore di sintassi. Ma ho bisogno di definirlo nella funzione createRenderData() perché ho bisogno di impostare la lunghezza e la frequenza di campionamento per ogni fonte multimediale, e se chiamo il costruttore OfflineAudioContext senza argomenti, ottengo un TypeError. Inoltre non vedo alcun modo nell'API per impostare la lunghezza e la frequenza di campionamento su un OfflineAudioContext esistente.

AudioUI.createRenderData = function() { 
    var url = BGAudioUI.renderQueue.pop(); 
    if (url) { 
     BGAudioUI.media = new Audio(url); 
     BGAudioUI.media.addEventListener('durationchange', function() { 
      console.log("background duration: " + BGAudioUI.media.duration); 
      BGAudioUI.duration = BGAudioUI.media.duration; 
      //BGAudioUI.allData = new Float32Array(Math.floor((AudioUI.context.sampleRate.toFixed()/AudioUI.downsampleFactor.toFixed() * BGAudioUI.duration)) + 1); 
      //console.log("calculated sample rate: " + Math.floor(AudioUI.context.sampleRate/AudioUI.downsampleFactor.toFixed())); 
      //console.log("duration: " + BGAudioUI.duration); 
      BGAudioUI.offlineContext = new webkitOfflineAudioContext(2, 7*48000, 48000); //SyntaxError DOM Exception 12 occurs here 
      BGAudioUI.mediaSource = BGAudioUI.offlineContext.createMediaElementSource(BGAudioUI.media); 
      BGAudioUI.offlineContext.oncomplete = function(buffer) { 
       data = buffer.getChannelData(0); 
       console.log(data.length + " records processed offline"); 
      }; 
      BGAudioUI.offlineContext.startRendering(); 
      BGAudioUI.media.play(); 
      console.log("created background media source for " + BGAudioUI.media.src); 
     }, false); 
     BGAudioUI.media.load(); 
     console.log("created background media object for " + BGAudioUI.media.src); 
    } else { 
     alert("Background rendering complete"); 
    } 
}; 
+0

Correzione: ho la SyntaxError quando chiamo anche il costruttore nella funzione init. Deve averlo perso prima. – MidnightJava

+0

Qualche possibilità che tu sia su una macchina Windows? Funziona sul mio Mac. Forse non l'hanno ancora implementato per Win/Chrome. –

+0

Non funziona su OSX ma non su CentOs (la distribuzione Fedora di Chrome). Ho scoperto qual è il problema, comunque. Si scopre che la frequenza di campionamento per OfflineAudioContext deve essere identica all'impostazione per il normale AudioContext. – MidnightJava

risposta

4

Quindi il problema è che la frequenza di campionamento per l'OfflineAudioContext deve essere impostata allo stesso valore di quella del AudioContext regolare. Chris Rogers cercherà di risolvere questo problema, cosa che è accaduta per me con OSX Chrome (canali beta e stabili), ma non per Fedora Chrome in esecuzione su CentOS (solo canale stabile testato). Ma con i due contesti audio impostati sulla stessa frequenza di campionamento, ora tutto funziona perfettamente.

1

Giusto per farvi sapere, l'inserimento di questo segmento nella console di debug in Chrome (preferibilmente mentre è su about: vuoto per non perdere nulla) produrrà tutti i valori numerici interi validi per il bitrate.

document.querySelector('body').innerHTML = ""; 
var b, sampleRate; 
for(sampleRate = 22050; 
sampleRate <= 96000; //22050 to 96000 is the minimum support according to the w3c working draft 
++sampleRate){ 
var b = true; 
try{var l = new webkitOfflineAudioContext(1,sampleRate, sampleRate);} 
catch(e){b = false} 
if(b){document.writeln(sampleRate + " is a good sample rate.");}} console.log("Complete"); 

Sembra che solo 44100 è valido in questo momento, ma the w3c specification dice che

Il parametro sampleRate descrive la frequenza di campionamento dei dati audio PCM lineare nel buffer di campione-frame al secondo . L'attuazione deve sostenere campione tassi in almeno nell'intervallo 22050 a 96000.

Mi chiedo se questo è stato sottoposto a Webkit/Chrome come un grande cattivo bug ...

Problemi correlati