WAV 再生後の C# SoundPlayer の静的
-
12-12-2019 - |
質問
このコードを使用してリソースから WAV ファイルを再生すると、オーディオは正しく再生されますが、再生後に短いノイズが発生します (約 1/2 秒)。
//System.Media.SystemSounds.Beep.Play();
SoundPlayer sndPlayer = new SoundPlayer();
sndPlayer.Stream = Resources.Notify;
sndPlayer.Play();
コメントを解除すると、 System.Media.SystemSounds.Beep.Play()
上の行を実行すると、リソースからのビープ音と通知音は両方とも正しく再生され、雑音は発生しません。上記のコードのいくつかの異なるバリエーションを試してみましたが、常に静的な結果が得られました。初期のガベージコレクションに関連するものがあった場合に備えて、すべての変数を静的にしようとしましたが、役に立ちませんでした。
WAV ファイルは私がコピーしたものです c:\WINDOWS\Media\ding.wav
(Windows XP では) Windows Media Player では正常に再生されます。また、新品を使用する場合は、 SoundPlayer("c:\WINDOWS\Media\ding.wav")
, 、ファイルからは正しく再生されます。
と何か関係があるのではないかと想像しますが、 UnmanagedMemoryStream
それ Resources.Notify
です。最初にそれをマネージド ストリームに読み込む必要があるでしょうか?PNG ファイルを使用しないと問題が発生することはわかっています new Bitmap(Resource.MyPNG)
そして使ってみてください Resource.MyPNG
代わりに直接、WAV リソースでも同様のことが考えられるでしょうか。
アップデート : 当初はサウンドが再生されるたびにこの問題が発生すると思っていましたが、今ではアプリでサウンドを最初に再生するときにのみ発生するようです。したがって、初期化を行う必要があるのでしょうか?
私もこれを試しましたが、同じ問題がありました:
SoundPlayer sndPlayer = new SoundPlayer(Resources.Notify);
sndPlayer.Play();
解決 2
1 台の PC でのみ問題が発生しました。まったくわかりませんでした。他のアプリではこの問題が発生していないようですが、これまでのところ 1 台の PC (おそらく 15 台のテストのうち) だけであれば、時間を費やす価値はありません。より良い答えが得られたら報告します。
他のヒント
これは MS が使用する内部実装です My.Audio.Play(), SoundPlayer クラスをインスタンス化する方法を確認してください。オーバーロードされたコンストラクターを利用しています。 ファイルパスを取得します 以下に示すように またはストリーム:
http://msdn.microsoft.com/en-us/library/system.media.soundplayer.aspx
public void Play(string location, AudioPlayMode playMode)
{
this.ValidateAudioPlayModeEnum(playMode, "playMode");
SoundPlayer sound = new SoundPlayer(this.ValidateFilename(location));
this.Play(sound, playMode);
}
SoundPlayerをインスタンス化するときにストリームを渡してみてもらえますか?