2014-04-13 2 views
3

У меня есть файл AAC с 6 каналами. Если я открываю его непосредственно в браузере, я слышу все 6 каналов, смешанных для воспроизведения на стереодинамиках. Если я воспроизведу его через API веб-аудио, я слышу только левый и правый каналы.Каналы API веб-аудио не смешиваются

Я загружаю буфер, создавая AudioBufferSourceNode, назначая ему буфер, а затем подключаюсь к месту назначения AudioContext.

С моей консоли:

> buffer.numberOfChannels 
6 
> source.channelCount 
2 
> source.channelCountMode 
"max" 
> source.channelInterpretation 
"speakers" 
> context.destination 
AudioDestinationNode {maxChannelCount: 2, channelInterpretation: "speakers", channelCountMode: "explicit", channelCount: 2, numberOfOutputs: 0…} 

Является ли это причиной того, что я не слышу другие каналы, потому что destination.channelCountMode это explicit?

Есть ли способ изменить это или получить AudioContext для использования его down-mixing logic?

Я создал simple jsFiddle example, показывая настройку. Если вы загружаете файл напрямую, вы услышите, что 6 каналов смешаны в 2, но нет, если вы запустите его через Web Audio Context.

+0

API веб-аудио должен делать то, что вы ищете. Можете ли вы предоставить jsfiddle вашего кода с образцом? –

+0

+1. Отправьте файл, я посмотрю. – cwilso

+0

Спасибо. Я добавил jsFiddle. – pr1001

ответ

3

Вы заметили, что ваш JSFiddle работает нормально в Firefox? Chrome с другой стороны не работает как «ожидаемый». Я ожидаю, потому что, поскольку Web Audio по-прежнему является проектом, не все функции могут быть реализованы еще всеми поддерживающими браузер браузерами (FYI см. В поддержке браузера here).

Я привел пример, который должен работать так, как вы хотите here. Как вы подозревали, вам необходимо реализовать логику смешения вниз по спецификации W3C, о которой вы упомянули. Это делается с помощью метода createScriptProcessor в сочетании с событием аудиопроцесса.

код следующим образом (это не готовый к производству как таковой, но вы можете взять его отсюда :)):

<script src="http://www.html5rocks.com/en/tutorials/webaudio/intro/js/buffer-loader.js"></script> 
<script type="text/javascript"> 
window.onload = init; 
var context; 
var bufferLoader; 

function init() { 
window.AudioContext = window.AudioContext || window.webkitAudioContext; 
context = new AudioContext(); 
bufferLoader = new BufferLoader(
    context, 
    [ 
    'http://labs.bubblefoundry.com/internet-of-cars/corsproxy.php?url=http://labs.bubblefoundry.com/internet-of-cars/sounds/5_1IDENT.m4a' 
    ], 
    finishedLoading 
); 
bufferLoader.load(); 


function finishedLoading(bufferList) { 
    var javascriptNode = null; 
    var source1 = context.createBufferSource(); 

    source1.buffer = bufferList[0]; 
    javascriptNode = context.createScriptProcessor(2048, 6, 2); // audioContext.createScriptProcessor([bufferSize][, numberOfInputChannels][, numberOfOutputChannels]); 
    source1.connect(javascriptNode); 
    javascriptNode.connect(context.destination); 

    console.log(javascriptNode); 

    function onProcess(e) {  
     var in1 = e.inputBuffer.getChannelData(0); // Left input 
     var in2 = e.inputBuffer.getChannelData(1); // Right input 
     var in3 = e.inputBuffer.getChannelData(2); // Center input 
     var in4 = e.inputBuffer.getChannelData(3); // (??) 
     var in5 = e.inputBuffer.getChannelData(4); // Left Surround input 
     var in6 = e.inputBuffer.getChannelData(5); // Right Surround input 

     var leftOut = e.outputBuffer.getChannelData(0); // Left output 
     var rightOut = e.outputBuffer.getChannelData(1); // Right output 

     for (var i = 0; i < in1.length; i++) { 
      leftOut[i] = in1[i] + 0.7071 *(in3[i] + in5[i]); // W3C formula for Down Mixing 
      rightOut[i] = in2[i] + 0.7071 *(in3[i] + in6[i]); // W3C formula for Down Mixing 
     } 
    } 
    source1.start(0); 
    javascriptNode.onaudioprocess = onProcess; 
} 
} 
</script> 

Я заметил канал 4 (отмечен ?? на мой комментарий), кажется, Молчи. Но здесь мои знания объемного звука могут быть короткими.

+0

Ха, конечно же, я даже не подумал, что Chrome еще не смешал. Спасибо за пример! – pr1001

+0

PS Канал 4, вероятно, является сабвуфером. – pr1001

+0

Web Audio API очень многообещающий - по-прежнему требуется небольшая работа. Получайте удовольствие от этого :) –

 Смежные вопросы

  • Нет связанных вопросов^_^