3

directsound を介して単純な wav ファイルを再生する ac# アプリケーションを持っています。私が持っていたテストデータでは、コードはうまくいきました。しかし、実世界のデータを使用すると、セカンダリ バッファーの作成時に非常に役に立たないエラーが発生しました:「ArgumentException: 値が期待される範囲内にありません。」

テスト 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 チャンクに入ります。/is/ 不正なデータに fmt チャンクがあるため、形式が不適切なのか、それともローダーが fmt データをさらに探す必要があるのか​​はわかりません。データを提供してくれた人々から、このルージュ ベクスト チャンクに関する情報を入手できるかどうかを確認できます。彼らがそれを削除できれば、私のコードは引き続き機能する可能性があります。

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 に答える