3

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

测试 wav 具有 512kbps 的比特率、16bit 的音频采样大小和 32kHz 的音频采样率。新的 wav 分别为 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 块。/is/ 坏数据中有一个 fmt 块,所以我不知道它是否格式错误,或者加载程序是否应该进一步寻找 fmt 数据。我可以看看我是否可以从向我提供数据的人那里获得有关此 rouge bext 块的一些信息 - 如果他们可以删除它,我的代码可能仍然有效。

4

2 回答 2

7

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

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

于 2008-09-19T09:16:35.150 回答
4

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

于 2008-09-19T09:23:46.927 回答