2014-11-28 6 views
5

Sto provando a instradare l'audio stereo attraverso un channelsplitter a 6 canali con controlli di guadagno, e quindi di nuovo in uno channelMerger, per controllare tutti i 6 canali di un 5.1 set. Il set è collegato tramite HDMI e Windows emette correttamente su tutti e 6 i canali (una schermata in cui è possibile consentire a tutti e 6 i diffusori di riprodurre un suono separatamente).Uscita audio Web 5.1 (6 canali)

Gli unici esempi che ho trovato avere questo pezzo di codice:

if (context.destination.maxChannelCount >= 6) { 
    context.destination.channelCount = 6; 
} 
else { 
    context.destination.channelCount = 2; 
} 

Quando inizializzazione del audiocontext, i miei valori di default channelCount a 2 e la maxChannelCount è 6.

Io uso il seguente codice per creare lo splitter, concentrazione e guadagni trascorre:

if (context.destination.maxChannelCount >= 6) { 
    context.destination.channelCount = 6; 
} 
else { 
    context.destination.channelCount = 2; 
} 

context.destination.channelCountMode = "explicit"; 
context.destination.channelInterpretation = "discrete"; 

var ammount = context.destination.channelCount; 

console.log('Ammount of channels:',ammount); //this outputs 6 

window.channelSplitter = context.createChannelSplitter(ammount); 
window.channelMerger = context.createChannelMerger(ammount); 

postGain.connect(channelSplitter); //postGain is the last node of the audio system 
channelMerger.connect(context.destination); 
window.channelGains = []; 
for(i=0;i<ammount;i++){ 
    channelGains[i] = context.createGain(); 

    channelSplitter.connect(channelGains[i],i,0); 
    channelGains[i].connect(channelMerger,0,i); 
} 

ho provato questo in cromo (39.0.2171.71 m), dove è maxChannelCount 6. uscite Firefox 2.

Modifica: Dopo aver giocherellato con il channelSplitter, ho scoperto che tutte le uscite oltre alle prime due sono state disattivate. Questo è corretto secondo lo spec, quando si usano i "diffusori" di interpretazione del canale. Ciò significa che ho bisogno di riempire i canali me stesso, probabilmente usando gli algoritmi descritti here. Devo ancora verificare se chrome emette correttamente tutti e 6 i canali.

risposta

4

Il problema è stato causato dal fatto che il channelSplitter non ha emesso l'output su tutti i canali (cosa che mi aspettavo). Sebbene questo comportamento sia corretto secondo le specifiche. Quindi abbiamo bisogno di scrivere il nostro stereo per l'upmixer 5.1. Ma per testare l'uscita del suono ho usato il canale sinistro e sono stato in grado di emettere tutti i 6 canali in modo indipendente. Ho incontrato solo un problema. Il parametro di input (3 °) sul metodo di connessione non determina l'ordine dell'output, come visto here. L'ordine di chiamata .connect() determina l'ordine dell'output. Tuttavia, il 3 ° numero deve essere presente e diverso dalle altre volte che ho chiamato .connect (ma entro i limiti della quantità di ingressi).

Un'altra cosa che ho notato che la channelCount sulla fusione e divisore è uguale a 2. Tuttavia ho trovato che does not matter when having channelCountMode set to max

Oltre a tutto quanto sopra, I giocherellava con tutte le impostazioni, ma non hanno alcuna inpact su Questo. L'unica cosa che è importante fare è impostare channelCount sul nodo di destinazione su maxChannelCount.

Tuttavia, quando non si collegano tutti i canali a una fusione di canale, la fusione esegue il mixaggio dei segnali in ingresso in base alle regole these. Quando si imposta channelInterpretation in modo esplicito, si ottiene comunque il risultato del mixaggio, mentre secondo le specifiche dovrebbe riempire i canali e lasciare ogni canale che non ha un input vuoto (e quindi emettendo solo il primo canale sul canale sinistro, e lasciare il uscita a destra silenziosa).

Di seguito è riportato uno snippet per riprodurre i canali stereo.

onload = function(){ 
 
    window.context = new AudioContext(); 
 
    window.source = context.createMediaElementSource(document.getElementById('player')); 
 
    window.splitter = context.createChannelSplitter(2); 
 
    source.connect(splitter); 
 
    window.merger = context.createChannelMerger(2); 
 

 
    window.leftGain = context.createGain(); 
 
    window.rightGain = context.createGain(); 
 

 
    splitter.connect(leftGain, 0, 0); 
 
    splitter.connect(rightGain, 1, 0); 
 

 
    
 
    //--------try (de)commenting things below------- 
 
    leftGain.connect(merger, 0, 0); 
 
    rightGain.connect(merger, 0, 1); 
 
    //merger.channelInterpretation = 'discrete' //doesn't seem to have influcence.. 
 
    //merger.channelCountMode = 'explicit' //makes everything only output to the left channel 
 
    
 
    //-------until here------ 
 
    
 
    merger.connect(context.destination); 
 

 
    var leftRange = document.querySelector('#left'); 
 
    var rightRange = document.querySelector('#right'); 
 
    leftRange.oninput = function(){leftGain.gain.value = this.value} 
 
    rightRange.oninput = function(){rightGain.gain.value = this.value} 
 
}
<!DOCTYPE html> 
 
<html> 
 
    <head> 
 
    <meta charset="utf-8"> 
 
    <title>JS Bin</title> 
 
    </head> 
 
    <body> 
 
    <audio src="http://upload.wikimedia.org/wikipedia/en/4/45/ACDC_-_Back_In_Black-sample.ogg" controls autoplay id="player" preload></audio><br /> 
 
    <label for="left">Left channel</label> 
 
    <input type="range" min=0 max=1 step=.01 value=1 id="left" /><br /> 
 
    <label for="right">Right channel</label> 
 
    <input type="range" min=0 max=1 step=.01 value=1 id="right" /> 
 
    </body> 
 
</html>

+1

Interessante. Questo deve essere riconsegnato al comitato WebAudio in modo che il modo in cui funziona sia definito precisamente nelle specifiche. – notthetup

+0

@notthetup Sì, stavo pensando di presentare un bug su https://code.google.com/p/chromium/issues/list. – MarijnS95

+1

@notthetup Ho deciso di non presentare un bug.Ho manipolato sia channelInterpretation sia channelCountMode, e anche queste funzionalità fanno la differenza. Ad esempio, il collegamento di un canale a una fusione stereo verrà emescolato, in base a [questo] (https://developer.mozilla.org/en-US/docs/Web/API/AudioNode.channelInterpretation). Quando si imposta ChannelInterpretation su discreto e si collegano entrambi i canali, viene riprodotto solo l'output dell'altoparlante sinistro. Ecco qualcosa su [fiddle with] (http://jsbin.com/legafifome/2/edit) – MarijnS95