ここではWAVE音声ファイルを再生する方法をいくつか紹介します。
.NET Framework 2.0から追加されたSoundPlayerクラスを使用すれば、簡単にWAVEファイルを再生できます。
SoundPlayerクラスには、WAVEファイルを再生するためのメソッドが3つ用意されています。それぞれ以下のような違いがあります。
SoundPlayerクラスのメソッド | 説明 |
---|---|
PlaySync | サウンドを最後まで再生し終えるまで待機します(同期再生)。つまりPlaySyncメソッドを呼び出した後、サウンドが終了するまでユーザーインターフェイスがブロックされ、何もできなくなります。 |
Play | サウンドをバックグラウンドで再生します(非同期再生)。つまりPlayメソッドを呼び出した後も、すぐに次のコードが実行されます。 |
PlayLooping | サウンドをバックグラウンドで再生し、さらにループ再生(サウンドが終了すると、頭に戻って再び再生する)します。 |
以下にSoundPlayerクラスを使ってWAVEファイルを再生、停止する例を示します。フォームに2つのボタンコントロール"Button1"と"Button2"が配置されているときに、Button1で再生し、Button2で停止します。
Private player As System.Media.SoundPlayer = Nothing 'WAVEファイルを再生する Private Sub PlaySound(ByVal waveFile As String) '再生されているときは止める If Not (player Is Nothing) Then StopSound() End If '読み込む player = New System.Media.SoundPlayer(waveFile) '非同期再生する player.Play() '次のようにすると、ループ再生される 'player.PlayLooping() '次のようにすると、最後まで再生し終えるまで待機する 'player.PlaySync() End Sub '再生されている音を止める Private Sub StopSound() If Not (player Is Nothing) Then player.Stop() player.Dispose() player = Nothing End If End Sub 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click PlaySound("C:\music.wav") End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click StopSound() End Sub
private System.Media.SoundPlayer player = null; //WAVEファイルを再生する private void PlaySound(string waveFile) { //再生されているときは止める if (player != null) StopSound(); //読み込む player = new System.Media.SoundPlayer(waveFile); //非同期再生する player.Play(); //次のようにすると、ループ再生される //player.PlayLooping(); //次のようにすると、最後まで再生し終えるまで待機する //player.PlaySync(); } //再生されている音を止める private void StopSound() { if (player != null) { player.Stop(); player.Dispose(); player = null; } } //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { PlaySound("C:\\music.wav"); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { StopSound(); }
.NET Framework 2.0以降のVB.NETでは、My.Computer.Audioを使ってWAVEファイルを再生することもできます。Audio.Playメソッドは内部でSoundPlayerクラスを使用しているため、SoundPlayerクラスを使用した方法と根本的には同じです。
以下にMy.Computer.Audioを使ってWAVEファイルを再生、停止する例を示します。SoundPlayerクラスの例と同じ事を行っています。
'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) _ Handles Button1.Click 'バックグラウンドでWAVを再生する My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.Background) '次のようにすると、ループ再生される 'My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.BackgroundLoop) '次のようにすると、最後まで再生し終えるまで待機する 'My.Computer.Audio.Play("C:\music.wav", AudioPlayMode.WaitToComplete) End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click '再生しているWAVを停止する My.Computer.Audio.Stop() End Sub
//参照にMicrosoft.VisualBasic.dllが追加されている必要がある private Microsoft.VisualBasic.Devices.Audio audio = new Microsoft.VisualBasic.Devices.Audio(); //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //バックグラウンドでWAVを再生する audio.Play("C:\\music.wav", Microsoft.VisualBasic.AudioPlayMode.Background); //次のようにすると、ループ再生される //audio.Play("C:\\music.wav", // Microsoft.VisualBasic.AudioPlayMode.BackgroundLoop); //次のようにすると、最後まで再生し終えるまで待機する //audio.Play("C:\\music.wav", // Microsoft.VisualBasic.AudioPlayMode.WaitToComplete); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { //再生しているWAVを停止する audio.Stop(); }
次に、Win32 APIのPlaySound関数を使用して再生する方法を紹介します。この方法は、ヘルプの「方法 : プラットフォーム呼び出しを使用して Wave ファイルを再生する (C# プログラミング ガイド)」で紹介されていますので、そちらも参考になるでしょう。
以下に例を示します。My.Computer.Audioで紹介した例と同じ事を行っています。
'サウンドを再生するWin32 APIの宣言 <Flags()> _ Public Enum PlaySoundFlags SND_SYNC = &H0 SND_ASYNC = &H1 SND_NODEFAULT = &H2 SND_MEMORY = &H4 SND_LOOP = &H8 SND_NOSTOP = &H10 SND_NOWAIT = &H2000 SND_ALIAS = &H10000 SND_ALIAS_ID = &H110000 SND_FILENAME = &H20000 SND_RESOURCE = &H40004 SND_PURGE = &H40 SND_APPLICATION = &H80 End Enum <System.Runtime.InteropServices.DllImport("winmm.dll", _ CharSet:=System.Runtime.InteropServices.CharSet.Auto)> _ Private Shared Function PlaySound(ByVal pszSound As String, _ ByVal hmod As IntPtr, ByVal fdwSound As PlaySoundFlags) As Boolean End Function 'Button1のClickイベントハンドラ Private Sub Button1_Click(ByVal sender As Object, _ ByVal e As EventArgs) Handles Button1.Click '非同期再生する PlaySound("C:\music.wav", IntPtr.Zero, _ PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC) 'ループ再生するには、次のようにする 'PlaySound("C:\music.wav", IntPtr.Zero, _ ' PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_ASYNC Or _ ' PlaySoundFlags.SND_LOOP) '同期再生するには、次のようにする 'PlaySound("C:\music.wav", IntPtr.Zero, _ ' PlaySoundFlags.SND_FILENAME Or PlaySoundFlags.SND_SYNC) End Sub 'Button2のClickイベントハンドラ Private Sub Button2_Click(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Button2.Click '再生しているWAVを停止する PlaySound(Nothing, IntPtr.Zero, PlaySoundFlags.SND_PURGE) End Sub
//サウンドを再生するWin32 APIの宣言 [Flags] public enum PlaySoundFlags : int { SND_SYNC = 0x0000, SND_ASYNC = 0x0001, SND_NODEFAULT = 0x0002, SND_MEMORY = 0x0004, SND_LOOP = 0x0008, SND_NOSTOP = 0x0010, SND_NOWAIT = 0x00002000, SND_ALIAS = 0x00010000, SND_ALIAS_ID = 0x00110000, SND_FILENAME = 0x00020000, SND_RESOURCE = 0x00040004, SND_PURGE = 0x0040, SND_APPLICATION = 0x0080 } [System.Runtime.InteropServices.DllImport("winmm.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern bool PlaySound( string pszSound, IntPtr hmod, PlaySoundFlags fdwSound); //Button1のClickイベントハンドラ private void Button1_Click(object sender, EventArgs e) { //非同期再生する PlaySound("C:\\music.wav", IntPtr.Zero, PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_ASYNC); //ループ再生するには、次のようにする //PlaySound("C:\\music.wav", IntPtr.Zero, // PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_ASYNC | // PlaySoundFlags.SND_LOOP); //同期再生するには、次のようにする //PlaySound("C:\\music.wav", IntPtr.Zero, // PlaySoundFlags.SND_FILENAME | PlaySoundFlags.SND_SYNC); } //Button2のClickイベントハンドラ private void Button2_Click(object sender, EventArgs e) { //再生しているWAVを停止する PlaySound(null, IntPtr.Zero, PlaySoundFlags.SND_PURGE); }
MCI(Media Control Interface)を使用してもWaveファイルを再生できます。この方法については、こちらをご覧ください。
Windows Media Player Controlを使用して音声ファイルを再生する方法は、こちらで紹介しています。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。