2011-03-21 102 views
4

我想在我的應用程序中添加對播放音頻文件的支持。我需要實時處理數據(例如,應用ADSR,重採樣,音高偏移等),並且因此直接需要比特。使用Windows編解碼器解碼音頻文件

我試過尋找如何做到這一點,但無法找到很多信息,除非我只想讀取波形文件或使用外部解壓縮程序。由於我安裝了大量的編解碼器,我想使用它們(如果它不應該太麻煩)。

如何在C#中進行此操作?它似乎沒有任何本地支持使用Windows編解碼器,但有一些技術可以幫助。不幸的是,它們似乎都是相當嚴格或有問題的。

Windows Media Foundation僅適用於Win7,並且沒有託管界面(嘗試過MF.NET,但效果不佳)。 DirectShow似乎被折舊(被WMF取代),並沒有託管支持。 etc ... etc ...等等......

獲得編解碼器返回音頻樣本有多難?它至多應該是幾行代碼;/

回答

1

BASS Audio Library可以解碼爲您的原始數據。我不知道它是使用Windows還是它自己的內置編解碼器,但它支持各種格式和流。還有一個.NET包裝器。

我相信你也可以使用這個庫來播放你希望創建的功能。至少對於信封來說,這絕對是可能的。再說一遍,它提供了對流的原始訪問,所以你不需要使用它來播放。

+0

似乎有點太多,太貴了,我想做。 – AbstractDissonance 2011-03-21 16:20:58

+0

我相信它是免費的非商業用途,但是,收費適用於商業許可。 – Brad 2011-03-21 16:24:56

1

NAudio有一些代碼可以用來將音頻解碼分流到ACM解碼器。這些用於其他目的的MP3解碼。 MP3解碼可以見證here。該代碼主要位於NAudio.Wave.Compression名稱空間下。從您的角度來看,艱難的一點是編寫解析器來從流中提取正確的內容以供給解碼器。

+0

我試過了一些樣品,它們沒有正常工作。我可能會嘗試它,因爲我喜歡asio功能,但我正在考慮直接嘗試ACM(現在查看API,但不知道它需要多少工作)。 – AbstractDissonance 2011-03-21 16:19:13

1

How to convert various audio formats to PCM

對於無頭VOX

using (BinaryReader br = new BinaryReader(File.OpenRead("sample.vox"))) 
{ 
    IntPtr format = AudioCompressionManager.GetPcmFormat(1, 16, 8000); 
    using (WaveWriter ww = new WaveWriter(new MemoryStream(), 
     AudioCompressionManager.FormatBytes(format))) 
    { 
     Vox.Vox2Wav(br, ww); 
    } 
} 

其他(MP3,WAV,OGG,WMA等)

DsReader dr = new DsReader("sample.ogg"); 
IntPtr formatPcm = dr.ReadFormat(); 
byte[] dataPcm = dr.ReadData(); 
dr.Close();