2014-01-31 92 views

回答

2

2016年8月更新:


顯然, .connect()調用的行爲改變;在過去的輸入/輸出指標進行自動每次通話遞增,但現在他們只是默認爲0 - 所以不確定時,調用將始終輸出0連接到輸入0


如果輸入流有兩個頻道,但只使用其中一個頻道,您必須手動將該頻道路由至左右揚聲器。通過使用ChannelSplitter,可以將立體聲connection(與MediaElementSource的連接)中的兩個channels分成兩個單獨的單聲道connections。然後左側(或右側,取決於您的使用情況)通道連接可輕鬆路由至ChannelMerger的左側和右側連接(這得益於扇出支持,允許將單個輸出連接至多個不同的輸入)將所有的mono input connections整合到一個stero output connection中。如舊回答中所示的Gain節點是不必要的。

如上所述,可以通過向connect(AudioNode destination, optional unsigned long output = 0, optional unsigned long input = 0);調用指定正確的索引來進行這些連接。

//create a source node to capture the audio from your video element 
source = context.createMediaElementSource(document.querySelector('video')); 

//Create the splitter and the merger 
splitter = context.createChannelSplitter(); 
merger = context.createChannelMerger(); 

//route the source audio to the splitter. This is a stereo connection. 
source.connect(splitter); 

//route output 0 (left) from the splitter to input 0 (left) on the merger. This is a mono connection, carrying the left output signal to the left input of the Merger. 
splitter.connect(merger, 0, 0); 
//route output 0 (left) from the splitter to input 1 (right) on the merger. This is a mono connection as well, carrying the left output signal to the right input of the Merger. 
splitter.connect(merger, 0, 1); 

//finally, connect the merger to the destination. This is a stereo connection. 
merger.connect(context.destination); 

這就是它在圖表中的樣子。請記住,輸入和分路器以及合併和目的地之間的連接是立體聲連接(或更多,取決於配置 - 當您有2.1,5.1或7.1組合時,合併和目標之間的連接可以包含3,6或8個通道),而分離器和合並器之間的兩個連接是單聲道連接。

+--------------+ +------------+ +-------------------+ +-----------+ 
| Stereo input |===>| Splitter | | Merger   |===>|destination| 
+--------------+ | channel0 |--->| channel0 (left) | +-----------+ 
        | channel1 | \ |     | 
        | etc  | ->| channel1 (right)| 
        +------------+ +-------------------+ 

我不是百分之百的把握,但這可能與 channel merger node工作。您只需將一個增益節點連接到輸入1和2(請撥打 .connect兩次)。

編輯(我現在有時間,所以一個更完整的答案):

你真的收到一個聲道音頻,爲webAudio應自動混合​​,根據this document,其中規定:For example, if a mono audio stream is connected to a stereo input it should just mix to left and right channels appropriately.。如果您收到一個立體聲流,其中只有一個通道包含數據,則需要在兩個通道拆分此起來,然後與音頻連接通道,左,右:(working example here

gain = context.createGain(); 
splitter = context.createChannelSplitter(); 
merger = context.createChannelMerger(); 
merger.connect(context.destination); 

source.connect(splitter); 
splitter.connect(gain); 
gain.connect(merger); 
gain.connect(merger); 

什麼在mergersplitter上發生的是,當您撥打.connect時,您將拍攝下一個頻道,但您只想拍攝第一個頻道,然後再將其拆分。因此,我們路由到增益節點,並從那裏把它分解:

   +----------------+ +----+  +------------------+ 
+----------+ | Splitter | |gain|  | Merger   | 
|mono input|--->|  channel0 |--->| |---->| channel0 (left) | +-----------+ 
+----------+ |  channel1 | | |  |     |-->|destination| 
       |  etc  | | |---->| channel1 (right) | +-----------+ 
       +----------------+ +----+  +------------------+ 

+0

這個答案是不正確,一對夫婦的原因:1.增益節點只有一個輸出,這樣你就可以將它連接到合併的多個輸入。 2.分路器拆分多個頻道 - 但在你的情況下,你只有一個頻道,所以它不會分裂任何東西。 – Asher

+0

@Asher:1. WebAudio [支持扇出](https://www.w3.org/TR/webaudio/#the-audionode-interface)輸出,允許單個輸出連接到多個不同的輸入。 2.我假設提問者有一個立體聲媒體流,其中只使用一個通道;如果它是單聲道媒體流,則應該自動進行上混。無論如何,感謝提及 - 規範改變了一點點超過2.5年,並且使用.connect()的舊方式不再工作 - 修正了:)。所以,這個答案是正確的。 – MarijnS95

相關問題