为什么有些wav文件在我的c#directsound应用程序中播放,但有些则没有?

时间:2008-09-19 09:10:44

标签: c# audio directx directsound

我有一个c#应用程序通过directsound播放简单的wav文件。根据我的测试数据,代码运行良好。但是,当我使用真实数据时,它在创建辅助缓冲区时产生了一个非常无益的错误:“ArgumentException:Value不在预期范围内。”

测试wavs具有512kbps比特率,16比特音频样本大小和32kHz音频采样率。新的wavs分别为1152kbps,24bit和48kHz。如何让directsound处理这些较大的值,或者如果不能在尝试播放文件之前如何以编程方式检测这些值?

它管理的是DirectX v9.00.1126我正在使用,我在下面提供了一些示例代码:

using DS = Microsoft.DirectX.DirectSound;  
...  
DS.Device device = new DS.Device();
device.SetCooperativeLevel(this, CooperativeLevel.Normal);  
...
BufferDescription bufferDesc = new BufferDescription();
bufferDesc.ControlEffects = false;  
...
try
{
    SecondaryBuffer sound = new SecondaryBuffer(path, bufferDesc, device);
    sound.Play(0, BufferPlayFlags.Default);
}
...

其他信息:现实世界的wav文件也不会在Windows媒体播放器中播放,告诉我播放文件需要一个编解码器,而它们在winamp中播放得很好。

附加信息2:比较工作测试数据和不良真实数据的字节,我可以看到,通过RIFF块,坏数据有一个“bext”块,互联网通知我是元数据关联使用广播音频扩展,而测试数据直接进入fmt块。坏数据中有/一个fmt块,所以我不知道它是否格式错误,或者加载器是否应该进一步寻找fmt数据。我可以看看是否可以从提供数据的人那里获得有关此rouge bext chunk的一些信息 - 如果他们可以删除它,我的代码可能仍然有效。

2 个答案:

答案 0 :(得分:6)

并非所有声卡都支持24位样本播放,即使这样,它们也必须在该模式下专门打开。采样率存在类似问题。您的声卡可能在44.1kHz运行,在这种情况下需要重新采样48kHz才能播放。

我编写了一个名为NAudio的开源.NET音频库,它可以让你找出给定WAV文件的采样率和位深度。它还提供了播放音频的替代方法(例如,通过Wav ... API),以及使用DMO重采样器对象重新采样文件的功能。

答案 1 :(得分:4)

除了采样问题,WAV只是一种容器格式,音频可以用无数种音频格式压缩(就像AVI是视频的容器一样)。因此,您可以使用GSpot之类的工具来查明您的WAV是否以非标准格式编码并安装编解码器。 Winamp默认安装了比WMP更多的编解码器,这可以解释Winamp播放它而WMP没有。