我正在獲取音頻和視頻所在的遠程媒體流。在這個流中,我獲得單聲道音頻,而我需要立體聲音頻。如何使用Web Audio API將單聲道音頻轉換爲立體聲音頻
那麼我怎樣才能使用Web API的音頻單聲道音頻轉換爲立體聲音頻
我正在獲取音頻和視頻所在的遠程媒體流。在這個流中,我獲得單聲道音頻,而我需要立體聲音頻。如何使用Web Audio API將單聲道音頻轉換爲立體聲音頻
那麼我怎樣才能使用Web API的音頻單聲道音頻轉換爲立體聲音頻
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);
什麼在merger
和splitter
上發生的是,當您撥打.connect
時,您將拍攝下一個頻道,但您只想拍攝第一個頻道,然後再將其拆分。因此,我們路由到增益節點,並從那裏把它分解:
+----------------+ +----+ +------------------+
+----------+ | Splitter | |gain| | Merger |
|mono input|--->| channel0 |--->| |---->| channel0 (left) | +-----------+
+----------+ | channel1 | | | | |-->|destination|
| etc | | |---->| channel1 (right) | +-----------+
+----------------+ +----+ +------------------+
這個答案是不正確,一對夫婦的原因:1.增益節點只有一個輸出,這樣你就可以將它連接到合併的多個輸入。 2.分路器拆分多個頻道 - 但在你的情況下,你只有一個頻道,所以它不會分裂任何東西。 – Asher
@Asher:1. WebAudio [支持扇出](https://www.w3.org/TR/webaudio/#the-audionode-interface)輸出,允許單個輸出連接到多個不同的輸入。 2.我假設提問者有一個立體聲媒體流,其中只使用一個通道;如果它是單聲道媒體流,則應該自動進行上混。無論如何,感謝提及 - 規範改變了一點點超過2.5年,並且使用.connect()的舊方式不再工作 - 修正了:)。所以,這個答案是正確的。 – MarijnS95