簡體   English   中英

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

[英]Why do some wav files play in my c# directsound app but some don't?

我有一個 c# 應用程序,它通過 directsound 播放簡單的 wav 文件。 根據我的測試數據,代碼運行良好。 然而,當我使用真實世界的數據時,它在創建輔助緩沖區時產生了一個非常無用的錯誤:“ArgumentException:值不在預期范圍內。”

測試波形具有 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”塊,inte.net 告訴我元數據與廣播音頻擴展,而測試數據直接進入 fmt 塊。 壞數據中有一個 fmt 塊,所以我不知道它的格式是否錯誤,或者加載程序是否應該進一步查找 fmt 數據。 我可以看看我是否可以從向我提供數據的人那里獲得關於這個 rouge bext 塊的一些信息——如果他們可以刪除它,我的代碼可能仍然有效。

並非所有聲卡都支持 24 位樣本播放,即使支持,也通常必須以該模式專門打開。 采樣率也存在類似的問題。 您的聲卡可能以 44.1kHz 的頻率運行,在這種情況下,需要重新采樣 48kHz 才能播放。

我寫了一個名為NAudio的開源 .NET 音頻庫,它可以讓你找出給定 WAV 文件的采樣率和位深度。 它還提供了播放音頻的替代方法(例如通過 Wav...API),以及使用 DMO 重采樣器 object 重采樣文件的能力。

除了采樣問題,WAV 只是一種容器格式,音頻可以壓縮為無數音頻格式中的任何一種(就像 AVI 是視頻的容器一樣)。 所以你可以使用像GSpot這樣的工具來找出你的 WAV 是否以非標准格式編碼並安裝編解碼器。 Winamp 默認安裝的編解碼器多於 WMP,這可以解釋 Winamp 播放它而 WMP 不播放的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM