2008-09-19 59 views
3

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

测试wavs具有512kbps比特率,16bit音频采样大小和32kHz音频采样率。新的波形分别是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 Media Player播放或者,告诉我需要一个编解码器来播放这个文件,而他们在winamp中播放得很好。

附加信息2:比较工作测试数据和错误的真实世界数据的字节,我可以看到过去的RIFF块,坏数据有一个“bext”块,互联网告诉我的是元数据与广播音频扩展相关联,而测试数据直接进入fmt块。在坏数据中有/ fmt块,所以我不知道它是否格式不正确,或者装载者是否应该进一步寻找fmt数据。我可以看到,如果我可以从提供数据的人那里得到关于这个胭脂虫块的一些信息 - 如果他们可以删除它,我的代码仍然可以工作。

+0

只是附加信息:WAV文件的信息表明它们是单声道文件。 – tzot 2008-09-19 09:54:02

回答

6

并非所有声卡都支持24位样本播放,即使他们这样做,他们通常也必须在该模式下完全打开。采样率有类似的问题。您的声卡可能工作在44.1kHz,在这种情况下需要重新采样48kHz进行播放。

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

+0

干杯标记。我会看看你的应用程序。 – tenpn 2008-09-19 10:00:44

+0

已经尝试过您的示例应用程序,它仍然无法加载 - 但现在我得到更好的错误信息:“不是波形文件 - 没有fmt头” 看到我的问题了解更多信息... – tenpn 2008-09-19 10:27:19

4

除抽样问题外,WAV只是一种容器格式,音频可以用任何音频格式压缩(就像AVI是视频容器一样)。因此,您可以使用工具GSpot来确定您的WAV是否以非标准格式编码并安装编解码器。 Winamp默认安装了比WMP更多的编解码器,这将解释Winamp播放它并且WMP不播放。

相关问题