將雙通道音訊轉換為兩條單通道音訊的解決方案

Kevinarcsin001發表於2024-09-20

方案一

程式碼

在Python中,可以使用wave模組來讀取雙通道(立體聲)音訊檔案,並將每個通道分別儲存為獨立的音訊檔案。以下是一個簡單的示例,演示瞭如何實現這一過程:

import wave

# 開啟雙通道音訊檔案
with wave.open('stereo_audio.wav', 'rb') as stereo_wave:
    # 獲取音訊檔案的引數
    n_channels, sample_width, framerate, n_frames, comptype, compname = stereo_wave.getparams()
    
    # 確保音訊是雙通道的
    assert n_channels == 2, "Audio is not stereo."
    
    # 讀取音訊資料
    data = stereo_wave.readframes(n_frames)
    
    # 分離左右通道資料
    left_channel = data[::2]
    right_channel = data[1::2]

    # 儲存左通道為單獨的音訊檔案
    with wave.open('left_channel.wav', 'wb') as left_wave:
        left_wave.setparams((1, sample_width, framerate, 0, comptype, compname))
        left_wave.writeframes(left_channel)

    # 儲存右通道為單獨的音訊檔案
    with wave.open('right_channel.wav', 'wb') as right_wave:
        right_wave.setparams((1, sample_width, framerate, 0, comptype, compname))
        right_wave.writeframes(right_channel)

print("Channels have been successfully extracted and saved.")

在此指令碼中,我們首先使用wave模組開啟一個名為stereo_audio.wav的雙通道音訊檔案。然後,我們讀取整個音訊幀,並根據取樣寬度和通道數將左右通道的資料分開。最後,我們將每個通道的資料寫入到新的音訊檔案中,分別命名為left_channel.wav和right_channel.wav。

請注意,這個指令碼假設原始音訊檔案是16位的PCM資料。如果你的音訊檔案有不同的引數,你可能需要根據實際情況調整sample_width和其他引數。

在執行此指令碼之前,請確保你的環境中已經安裝了Python,並且你有許可權讀取和寫入指定的音訊檔案。此外,確保音訊檔案路徑正確,且音訊檔案確實為雙通道立體聲格式。

部分引數說明:

在使用 wave 模組處理音訊檔案時,getparams() 方法返回的元組包含了音訊檔案的關鍵引數,每個引數都有特定的含義:

  1. n_channels

    • 表示音訊檔案的通道數。例如,單聲道(Mono)音訊的通道數為1,立體聲(Stereo)音訊的通道數為2。
  2. sample_width

    • 表示每個取樣點的位元組寬度。例如,8位音訊的 sample_width 通常是1位元組,而16位音訊通常是2位元組。這個引數影響每個取樣點可以表示的值的範圍。
  3. framerate

    • 表示音訊的取樣率,即每秒鐘取樣的次數,單位是Hz(赫茲)。例如,CD品質的音訊通常有44100Hz的取樣率。
  4. n_frames

    • 表示音訊檔案中的幀數。一幀通常包含一個取樣週期內所有通道的取樣資料。因此,對於立體聲音訊,一幀包含兩個取樣點(左右通道各一個)。
  5. comptype

    • 表示音訊資料的壓縮型別。在未壓縮的PCM音訊中,這個值通常是'NONE'。對於壓縮音訊格式,這個值會指示使用了哪種壓縮演算法。
  6. compname

    • 表示壓縮型別的名稱,如果音訊未壓縮,則通常為空字串。對於壓縮音訊,這個值會提供關於使用的壓縮演算法的更多資訊。

這些引數對於正確地讀取、處理和寫入音訊資料至關重要。例如,當你想要將音訊資料寫入到一個新的音訊檔案時,你必須確保新檔案的引數與原始音訊檔案相匹配,或者至少是相容的,以便正確地重建音訊波形。

方案二

使用ffmpeg轉換:

命令為 fmpeg -i input.wav -map_channel 0.0.0 left.wav -map_channel 0.0.1 right.wav
這個命令的作用是將一個立體聲(雙通道)的音訊檔案 input.wav 分割成兩個單聲道(單通道)的音訊檔案:left.wav 和 right.wav。left.wav 包含原始音訊的左通道,而 right.wav 包含右通道。各個部分含義如下:

-i input.wav:這是 ffmpeg 的輸入檔案選項,-i 表示輸入(input),後面跟著的是輸入檔案的名稱。在這個例子中,輸入檔案是名為 input.wav 的音訊檔案。

-map_channel 0.0.0:這是 ffmpeg 的一個高階通道對映選項。-map_channel 後面跟著的是通道對映的引數。這裡的 0.0.0 表示選擇第一個輸入流(0)的第一個通道(0)的第一個子通道(0),通常用於選擇音訊流中的特定通道。

left.wav:這是輸出檔案的名稱,用於儲存 -map_channel 指定的音訊通道。在這個例子中,left.wav 將儲存從輸入音訊中提取的左通道音訊。

-map_channel 0.0.1:這是另一個通道對映選項,用於選擇第一個輸入流的第二個通道(1),通常用於選擇立體聲音訊中的右通道。

right.wav:這是另一個輸出檔案的名稱,用於儲存 -map_channel 指定的第二個音訊通道。在這個例子中,right.wav 將儲存從輸入音訊中提取的右通道音訊。

結論

上述兩種方案都可以實現需求,但是親測來看,使用ffmpeg這種方式的音訊效果更好,好像加了降噪功能,而python的只是將原始的資料進行了提取,會有噪音。

相關文章