C#でmp3を再生するのはどうすればいいのでしょうか?
実は簡単にできます。
Windows Media Playerを使用します。まずプロジェクトの参照に、C:\Windows\System32\wmp.dllを追加します。
あとはこれでOK.
WMPLib.WindowsMediaPlayer player = new WindowsMediaPlayer();
1 2 3 4 5 |
void SoundPlay(string filePath) { player.URL = filePath; player.controls.play(); } |
演奏の途中でこれを実行するとこれまで再生されていたものは中止されて、新しく実行されたメソッドにわたされたファイルが再生されます。
1 2 3 4 5 6 7 8 9 10 |
string FilePath = ""; void SoundPlay(string filePath) { if (FilePath == "") { FilePath = filePath; player.URL = FilePath; } player.controls.play(); } |
同じファイルしか再生しない場合、ファイルパスをフィールド変数に保存したくなりますが、以下のコードでは再生中にSoundPlay(string filePath)を実行しても無視されます。
1 2 3 4 5 6 7 8 9 10 |
string FilePath = ""; void SoundPlay(string filePath) { if (FilePath == "") { FilePath = filePath; player.URL = FilePath; } player.controls.play(); } |
もし途中で最初から再生したい場合はいったん再生を停止しなければなりません。
1 2 3 4 5 6 7 8 9 10 11 |
string FilePath = ""; void SoundPlay(string filePath) { if (FilePath == "") { FilePath = filePath; player.URL = FilePath; } player.controls.stop(); // まだ再生中かもしれないので止める player.controls.play(); } |
ではエンドレスで音楽を再生する方法を考えます。ゲームのBGMとか途中でBGMが切れてしまっては興ざめです。
まずは再生時間を知る必要があります。
そのためには[参照の追加]で「Microsoft Shell Controls And Automation」を追加します。そして以下のようにすると再生時間を取得することができます。
GetDetailsOfでファイルプロパティを取得します。第二引数で「27」を指定すると「長さ」を取得できます。ほかにも様々なプロパティを取得できます。
最後に取得した文字列をTimeSpanに変換して返しています。取得できる再生時間の単位は秒なので、1秒に満たない場合は0秒になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[STAThread] public TimeSpan GetMoviePlaybackTime(string filename) { Type shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shell = Activator.CreateInstance(shellAppType); Shell32.Folder objFolder = shell.NameSpace(Path.GetDirectoryName(filename)); Shell32.FolderItem folderItem = objFolder.ParseName(Path.GetFileName(filename)); string strDuration = objFolder.GetDetailsOf(folderItem, 27); // TimeSpanに変換 TimeSpan ts = TimeSpan.Parse(strDuration); return ts; } |
ではこれを使ってエンドレスで再生させてみましょう。
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 64 65 66 67 68 |
public class PlaybackEndless { WMPLib.WindowsMediaPlayer Player = new WindowsMediaPlayer(); Timer Timer = new Timer(); public PlaybackEndless(string filename) { try { Timer.Tick += Timer_Tick; TimeSpan ts = TimeSpan.Zero; ts = GetMoviePlaybackTime(filename); if (ts != TimeSpan.Zero) Timer.Interval = (int)ts.TotalMilliseconds; else Timer.Interval = 1000; // ここで例外が発生するということは動画でも音声ファイルでもない Player.URL = filename; Player.controls.play(); // 必要なデータがそろってからタイマーをスタートさせる Timer.Start(); } catch { Timer.Stop(); } } [STAThread] public TimeSpan GetMoviePlaybackTime(string filename) { Type shellAppType = Type.GetTypeFromProgID("Shell.Application"); dynamic shell = Activator.CreateInstance(shellAppType); Shell32.Folder objFolder = shell.NameSpace(Path.GetDirectoryName(filename)); Shell32.FolderItem folderItem = objFolder.ParseName(Path.GetFileName(filename)); string strDuration = objFolder.GetDetailsOf(folderItem, 27); // TimeSpanに変換 TimeSpan ts = TimeSpan.Parse(strDuration); return ts; } private void Timer_Tick(object sender, EventArgs e) { Player.controls.stop(); Player.controls.play(); } public void Play() { // 再生中であればいったん止める Player.controls.stop(); Player.controls.play(); // タイマーも最初から Timer.Start(); } public void Stop() { // 再生を停止。タイマーも停止 Player.controls.stop(); Timer.Stop(); } } |
それから特定の部分だけをエンドレスで再生するクラスもつくってみましょう。
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 |
public class PlaybackEndless2 { WMPLib.WindowsMediaPlayer Player = new WindowsMediaPlayer(); Timer Timer = new Timer(); double Start = 0; // 注意:start, end の単位は秒。ミリ秒ではありません。 public PlaybackEndless2(string filename, double start, double end) { try { Start = start; Timer.Tick += Timer_Tick; Timer.Interval = (int)(end - start) * 1000; // ここで例外が発生するということは動画でも音声ファイルでもない Player.URL = filename; Player.controls.currentPosition = start; Player.controls.play(); // 必要なデータがそろってからタイマーをスタートさせる Timer.Start(); } catch { Timer.Stop(); } } public void Replay() { // 再生中であればいったん止める Player.controls.stop(); Player.controls.currentPosition = Start; Player.controls.play(); // タイマーも最初から Timer.Start(); } public void Play() { Replay(); } private void Timer_Tick(object sender, EventArgs e) { Replay(); } public void Stop() { // 再生を停止。タイマーも停止 Player.controls.stop(); Timer.Stop(); } } |