代码之家  ›  专栏  ›  技术社区  ›  tenpn

为什么有些wav文件可以在我的c#directsound应用程序中播放,而有些则不能?

  •  3
  • tenpn  · 技术社区  · 17 年前

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

    测试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块。坏数据中有/is/a fmt块,所以我不知道它的格式是否错误,或者加载器是否应该进一步查找fmt数据。我可以看看我是否能从提供数据的人那里得到一些关于这个rouge-bext块的信息——如果他们能删除它,我的代码可能仍然可以工作。

    2 回复  |  直到 16 年前
        1
  •  7
  •   Mark Heath    17 年前

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

    我写了一个开源。NET音频库已调用 NAudio 这将允许您找出给定WAV文件的采样率和比特深度。它还提供了播放音频的替代方法(例如通过WAV…API),以及使用DMO重采样器对象对文件进行重采样的能力。

        2
  •  4
  •   Vinko Vrsalovic    17 年前

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