2012-07-29 26 views
3

我有一個RAW音頻文件,它由幾個連接的較小的WAV文件組成。我可以在Sound Forge中打開並播放該文件爲48,000,8位PCM,帶符號單聲道。刪除幾個WAV文件的頭文件,然後將其餘數據連接成一個RAW文件

我想在C#中做的事情是用程序在文件中用相同或更小長度的新數據覆蓋每個單獨的WAV,我認爲我相當接近能夠做到這一點。我可以在RAW文件上做一個File.ReadAllBytes,遍歷字節數組,並確定每個WAV的開始和結束位置。然後,我在PC上選取新的WAV文件,刪除標題,並將其餘數據寫入我的RAW文件。如果新的WAV比目標小,我用0填充差值。

但是,當我在上面提到的設置中打開Sound Forge中的新文件時,我的所有WAV看起來都比實際的「聖誕樹」形狀更像固體塊,並且它們都會大聲和失真。第一次經歷這個之後,我發現所有新的源WAV都是41,000,16位PCM,有符號立體聲格式。我以這種格式打開了我新創建的RAW文件,它看起來很好。

我想我必須將我所有的新WAV轉換爲48,000,8位PCM,簽名,單聲道,第一,然後運行應用程序將它們複製到RAW文件中。我使用NAudio編寫了一些代碼,用於在將數據複製到RAW文件之前對文件進行轉換,而且我仍然遇到同樣的問題。我也試着先在Sound Forge中手動轉換每個新的WAV,但仍然有同樣的問題。

我在這裏錯過了什麼?謝謝。

+0

你可能意味着44,100而不是41,000。 – 2012-07-29 22:53:10

+0

感謝您的建議。我明白了這一點。這是有符號/無符號音頻文件的區別。我做了一些Google搜索,並且讀取默認情況下8位PCM WAV文件未簽名。爲了解決這個問題,使用NAudio將文件轉換爲8位後,我循環遍歷字節並從每個字節中減去128。我隨心所欲地做了這件事。我相信有更好的方法來做到這一點。 – user1561302 2012-07-30 05:45:26

回答

1

此代碼執行您所描述的操作(不帶填充)。它打開mainFile並在指定位置插入另一個文件。如果這兩個文件具有相同的格式,它將工作得很好。

public void InsertWave(string mainFile, string insertFile, long position) 
{ 
    byte[] data = File.ReadAllBytes(insertFile); 

    using (FileStream main = File.OpenWrite(mainFile)) 
    { 
     main.Seek(position, SeekOrigin.Begin); 
     main.Write(data, 0, data.Length); 
     main.Close(); 
    } 
} 

如果這兩個文件都是48,000赫茲,8位PCM,帶符號,單聲道你不能做任何錯誤。 但是,如果一個文件是單聲道而另一個是立體聲,或者如果一個是8位而另一個是16位,則輸出將失真。

它甚至不關心文件實際使用的格式。只要兩者具有相同的格式,並且您的位置是樣本大小的倍數,您將始終以有效的波形文件結束。

因此,如果您的輸出失真,那麼這些文件很可能具有不同的格式。 如果您將立體聲轉換爲單聲道,您還必須意識到您不能混合兩個聲道。您必須將音量降低6dB以保持相同的音量。

+0

您的位置實際上必須是框架大小的倍數,而不是樣本大小。此外,您必須降低水平約6dB,而不是3dB。更準確地說,你必須降低一半的水平,以確保你沒有削減,6dB不完全是一半。 – 2012-07-29 22:56:40

+0

你是對的:我已經把3dB改成了6dB。 我知道,在多通道文件中,您需要多倍的幀大小才能讓所有內容都正確無誤。然而,重點是對於有效的文件(即不失真),樣本量的倍數足夠好(通道將被交換)。 – pescolino 2012-07-29 23:09:25

相關問題