为什么有些 wav 文件可以在我的 c# directsound 应用程序中播放,而有些则不能?
-
01-07-2019 - |
题
我有一个 C# 应用程序,可以通过 directsound 播放简单的 wav 文件。根据我的测试数据,代码运行良好。然而,当我使用真实世界的数据时,它在创建辅助缓冲区时产生了一个非常无用的错误:“参数异常:价值没有落在预期范围内。”
测试 wav 具有 512kbps 比特率、16 位音频样本大小和 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 Media Player 中播放,告诉我需要编解码器来播放该文件,而它们在 winamp 中可以正常播放。
附加信息2:比较工作测试数据和不良实际数据的字节,我可以看到,在 RIFF 块之后,不良数据有一个“bext”块,互联网告诉我是与广播音频扩展相关的元数据,而测试数据直接进入 fmt 块。坏数据中有一个 fmt 块,所以我不知道它是否格式错误,或者加载器是否应该进一步查找 fmt 数据。我可以看看我是否可以从向我提供数据的人那里获得有关此胭脂下块的一些信息 - 如果他们可以删除它,我的代码可能仍然有效。
解决方案
并非所有声卡都支持 24 位样本播放,即使支持,它们通常也必须在该模式下以独占方式打开。采样率也存在类似的问题。您的声卡可能以 44.1kHz 运行,在这种情况下,需要重新采样 48kHz 才能播放。
我编写了一个开源 .NET 音频库,名为 NA音频 这将允许您找出给定 WAV 文件的采样率和位深度。它还提供了播放音频的替代方法(例如通过波...API),以及使用 DMO 重新采样器对象重新采样文件的能力。
其他提示
除了采样问题之外,WAV 只是一种容器格式,音频可以压缩为多种音频格式中的任何一种(就像 AVI 是视频容器一样)。所以你可以使用像这样的工具 GS点 查明您的 WAV 是否以非标准格式编码并安装编解码器。Winamp 默认安装的编解码器比 WMP 更多,这可以解释 Winamp 可以播放它而 WMP 不能。