0

(WAV ファイルから) サウンドを再生するプログラムを設計する必要があります。wav を作成して再生する必要があります。それが終わったら、そのウェーブ ファイルの内容を変更して、もう一度再生する必要があります。絶えず変化するウェーブ ファイルを再生するようなものです。ストリームを作成することを考えましたが、問題はそのストリームを編集すると (ms.Postion と ms.WriteByte を使用)、「ウェーブ ヘッダー ファイルが破損しています」というエラーが発生することです。以下は私のコードです:

MemoryStream ms = new MemoryStream(Sample1);
SoundPlayer myPlayer = new SoundPlayer(ms);
myPlayer.Play();                             //Wav file plays

for (int x = 0; x < 50; x++)
{
     ms.Position = 44 + x;
     ms.WriteByte(10);
}

myPlayer.Stop();
myPlayer.Play();                 //Header file corrupt

ストリームをループして、再生中に内容を変更できる別の方法はありますか。たとえば、ストリームが Sound1 をループしており、ボタンが押されるたびに、ストリームのコンテンツが変更されて Sound2 が再生されるとします。

ありがとうございました!

4

1 に答える 1

0

私はあなたが望むのと同じことをしようとしましたが、失敗しました。クラスはSoundPlayer内容を内部バッファにコピーするか、サウンドカードのメモリを直接予約しているようです。初めてplayを呼び出すとLoad、前述のことを実行するように呼び出されます。同じストリームをクラスに再割り当てしても役に立ちませんでした。Loadを呼び出してコンテンツを強制的に再ロードすることも失敗しました。彼らがこのクラスをどのように実装したかは正確にはわかりませんが、2つのSoundPlayerクラスが必要であり、(very likely)同じストリームでそれらを使用できると思います(ただし、両方を同時に再生することはできないと思いますが、共有ストリームのためですが、他の問題のため)。生成された波がそれほど大きくない場合は、単一の波を使用することもできますSoundPlayer2つのメモリストリームを持つクラス(クラスに別のメモリストリームを割り当てると、強制的にリロードする必要があると思います)。私は提案された解決策のどれもテストしていません。クラスに渡す前にストリームを巻き戻すことを忘れないでくださいSoundPlayer(これがヘッダーの破損の問題の元の問題だったと思います)。私はこれをテストしていませんが、うまくいくはずだと思います。Sample1少なくとも私の知る限り、の内容を変更してもメモリストリームに影響はないと思われます

上記が失敗した場合、またはあなたが私のようなパフォーマンスフリークであるという理由だけで、利用可能な場合はDirectSound(マネージドDirectXの一部)を使用するか、winmm.dllにあるネイティブの波動関数と構造をインポートして使用することをお勧めします欲しいです。

漠然とした答えで申し訳ありませんが、徹底的にテストする時間がありません。

于 2012-01-17T10:28:21.953 に答える