2011-03-21 60 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();