1

Waveファイルに変更を加えてから、直接再生したいです。

そこで、wave ファイルのバイトを格納するバイト配列を次のように定義します。

byte[] byteArr;
byteArr = File.ReadAllBytes(dlg.FileName);

ここで、dlg は OpenFile ダイアログです。

次に、次のように波形のサンプル ビット レートを変更します。

private void playSlectedWave_Click(object sender, EventArgs e)
{
    int sample = 50000;
    MemoryStream fs = new MemoryStream(byteArr);
    BinaryReader br = new BinaryReader(fs);
    int length = (int)fs.Length-8;
    fs.Position = 22;
    short channels = br.ReadInt16();
    fs.Position = 34;
    short BitsPerSample = br.ReadInt16();
    byte[] arrfile = new byte[fs.Length];
    fs.Position = 0;
    fs.Read(arrfile, 0, arrfile.Length);
    BinaryWriter bw = new BinaryWriter(fs);
    bw.BaseStream.Seek(0, SeekOrigin.Begin);
    bw.Write(arrfile, 0, 24); 
    bw.Write(sample);
    bw.Write((int)(sample* ((BitsPerSample * channels) / 8)));
    bw.Write((short)((BitsPerSample * channels) / 8));
    bw.Write(arrfile, 34, arrfile.Length - 34);
    SoundPlayer SP = new SoundPlayer(fs);
    SP.Play();
}

私の質問は、それが到達するSP.Play()と、Wave ヘッダーが破損していることを示す例外がスローされるということです。

詳細については、以前のコードを試してみましたが、MemoryStream の代わりに FileStream を使用したところ、問題なく動作しました。

誰でも理由を知っていますか?

4

3 に答える 3

2

サブ/関数の外でSoundPlayer SPを定義するか、使用します

SP.PlaySync

SP.Play();

Async です。その行をヒットした後、Sub がまだバックグラウンドで再生されている間に Sub を離れ、メモリ ストリームがメモリから変更または削除される可能性があります。

例外が発生しただけで幸運です。例外なしでデバッグしても、プログラムがクラッシュする可能性があります。

于 2016-04-22T15:54:28.377 に答える