mp3形式などのオーディオファイルを再生するにはどうすればいいのでしょうか? WAVE音声ファイルを再生する方法であればSoundPlayerクラスを使う方法があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//WAVEファイルを再生する private void PlaySound(string waveFile) { //再生されているときは止める if (player != null) StopSound(); // 再生する player = new System.Media.SoundPlayer(waveFile); player.Play(); } //再生されている音を止める private void StopSound() { if (player != null) { player.Stop(); player.Dispose(); player = null; } } |
ところがMIDI(.mid)やMP3(.mp3)形式などの再生機能は用意されていませんので、Win32 APIなどを使用する必要があります。
参考にしたサイト MIDI、MP3などの音楽ファイルを再生する – .NET Tips (VB.NET,C#…)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[System.Runtime.InteropServices.DllImport("winmm.dll")] private static extern int mciSendString(String command, StringBuilder buffer, int bufferSize, IntPtr hwndCallback); private string aliasName = "MediaFile"; private void PlayMp3(string fileName) { string cmd; cmd = "open \"" + fileName + "\" type mpegvideo alias " + aliasName; if(mciSendString(cmd, null, 0, IntPtr.Zero) != 0) return; cmd = "play " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } private void StopMp3() { string cmd; cmd = "stop " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); cmd = "close " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } |
注意が必要なのは、停止しないと次に再生することができなくなることです。再生に必要な時間がわかっているのであればタイマーを使って停止させればよいのですが、ゲームの場合は再生している途中で次の音を再生しなければならない場合があります。そのときは途中で前の音の再生を中止すればよいのですが、これだとタイマーイベントが発生したとき、現在再生されているものが中止されてしまうという問題がおきます。
そこで中止するかどうかのbool変数をリストに保存してしまいます。途中で新しく再生がはじまったときはすでに停止されているのでタイマーイベントが発生しても中止する必要はありません。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
List<bool> isPlayings = new List<bool>(); private void PlayMp3(string fileName) { if(isPlayings.Count > 0 && isPlayings.Last()) { // この部分が実行されるのは最後まで再生されずに途中で中止する場合である。 isPlayings[isPlayings.Count -1] = false; UrgentStopMp3(); } // リストの最後にこれは再生中であることがわかるようにtrueを格納する isPlayings.Add(true); // 再生する string cmd; cmd = "open \"" + fileName + "\" type mpegvideo alias " + aliasName; if(mciSendString(cmd, null, 0, IntPtr.Zero) != 0) return; cmd = "play " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); Timer timer = new Timer(); timer.Interval = 2000; // ファイル名から再生に必要な時間はわかるはずなので、timer.Intervalに適切な値をいれる timer.Tick += Timer_Tick1; timer.Start(); void Timer_Tick1(object sender1, EventArgs e1) { // 時間になったら停止するためにStopMp3()を実行する Timer timer1 = (Timer)sender1; timer1.Stop(); timer1.Dispose(); StopMp3(); } } private void StopMp3() { // 再生中の場合は停止する。 // すでに停止している場合はなにもしない。 if(isPlayings[0]) { string cmd; cmd = "stop " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); cmd = "close " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } isPlayings.RemoveAt(0); } // 最後まで再生されずに途中で中止された private void UrgentStopMp3() { string cmd; cmd = "stop " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); cmd = "close " + aliasName; mciSendString(cmd, null, 0, IntPtr.Zero); } |