C# directsound アプリで一部の wav ファイルが再生され、一部の wav ファイルは再生されないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/100654

  •  01-07-2019
  •  | 
  •  

質問

DirectSound を通じて単純な wav ファイルを再生する C# アプリケーションを持っています。私が持っていたテストデータでは、コードは正常に動作しました。ただし、実際のデータを使用すると、2 次バッファーの作成時に非常に役に立たないエラーが発生しました。「引数例外:値が予想範囲内にありません。」

テスト wav のビット レートは 512kbps、オーディオ サンプル サイズは 16 ビット、オーディオ サンプル レートは 32 kHz でした。新しい 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 チャンクを超えて「最適な」チャンクがあり、ブロードキャスト オーディオ拡張子に関連付けられたメタデータであることがインターネットで通知されていることがわかります。テスト データは直接 fmt チャンクに入ります。不正なデータには fmt チャンクが含まれているため、その形式が悪いのか、ローダーが fmt データをさらに探す必要があるのか​​わかりません。データを提供してくれた人からこのルージュ ベクタのチャンクに関する情報を入手できるかどうかを確認できます。もし彼らがそれを削除できれば、私のコードはまだ動作する可能性があります。

役に立ちましたか?

解決

すべてのサウンドカードが 24 ビット サンプル再生をサポートしているわけではありません。サポートしている場合でも、多くの場合、そのモードで排他的に開く必要があります。サンプルレートにも同様の問題があります。サウンドカードが 44.1kHz で動作している可能性があります。その場合、再生するには 48kHz をリサンプリングする必要があります。

私はオープンソースの .NET オーディオ ライブラリを作成しました。 Nオーディオ これにより、特定の WAV ファイルのサンプル レートとビット深度を知ることができます。また、オーディオを再生する別の方法も提供します (例:ウェーブを通して...API)、DMO リサンプラー オブジェクトを使用してファイルをリサンプリングする機能。

他のヒント

サンプリングの問題に加えて、WAV は単なるコンテナ形式であり、オーディオは無数のオーディオ形式のいずれかで圧縮できます (AVI がビデオのコンテナであるのと同じです)。したがって、次のようなツールを使用できます Gスポット WAV が非標準形式でエンコードされているかどうかを確認し、コーデックをインストールします。Winamp には、WMP よりも多くのコーデックがデフォルトでインストールされています。これは、Winamp がコーデックを再生し、WMP が再生しないことを説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top