为什么有些wav文件在我的c#directsound应用程序中播放,而有些却没有?
我有一个通过DirectSound播放简单的WAV文件的功能。使用我拥有的测试数据,代码可以正常工作。但是,当我使用实际数据时,它在创建辅助缓冲区时产生了一个非常无用的错误:" ArgumentException:值不在预期范围内。"
测试波形具有512kbps的比特率,16位的音频采样大小和32kHz的音频采样率。新的波形分别为1152kbps,24位和48kHz。如何获得DirectSound来应对这些较大的值,否则,如何在尝试播放文件之前以编程方式检测这些值?
它是我正在使用的Managed 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块。坏数据中有/ is /一个fmt块,因此我不知道它的格式是否错误,或者加载程序是否应该进一步查找fmt数据。我可以查看是否可以从向我提供数据的人员那里获得关于此胭脂糊糊块的一些信息,如果他们可以将其删除,则我的代码仍然可以工作。
解决方案
并非所有的声卡都支持24位样本播放,即使它们支持,通常也必须在该模式下专门打开它们。采样率也有类似的问题。声卡可能以44.1kHz运行,在这种情况下,需要重新采样48kHz才能播放。
我已经编写了一个名为NAudio的开源.NET音频库,该库可让我们找出给定WAV文件的采样率和位深。它还提供了回放音频的其他方式(例如,通过Wav ... API),以及使用DMO重采样器对象对文件进行重采样的功能。
除了采样问题外,WAV只是一种容器格式,音频可以采用多种音频格式中的任何一种进行压缩(就像AVI是视频容器一样)。因此,我们可以使用GSpot之类的工具来确定WAV是否以非标准格式编码,然后安装编解码器。 Winamp默认安装的编解码器比WMP多,这可以解释Winamp播放而WMP不播放。