為什麼要有該類的存在呢?音樂的好處很多,不在一一贅述。我只說一點,在閱讀的時候如果有輕音樂相伴,有時候會事半功倍,提高工作效率,愉悅心情。所以編寫此類。這只是一個輔助作用。該類的全部代碼如下所示。
1 using System.Runtime.InteropServices;
2 using System;
3 namespace Common
4 {
5 public class MP3Player
6 {
7 /// <summary>
8 /// 文件地址
9 /// </summary>
10 public string FilePath;
11 /// <summary>
12 /// 播放音樂
13 /// </summary>
14 public void Play()
15 {
16 string tmepstr="";
17 tmepstr = tmepstr.PadLeft(128, Convert.ToChar(" "));
18 mciSendString("close all", "", 0, 0);
19 mciSendString("open " + FilePath + " alias media", tmepstr, tmepstr.Length, 0); mciSendString("play media", "", 0, 0);
20 }
21
22 /// <summary>
23 /// 暫停
24 /// </summary>
25 public void Pause()
26 {
27 mciSendString("pause media", "", 0, 0);
28 }
29
30 /// <summary>
31 /// 停止
32 /// </summary>
33 public void Stop()
34 {
35 mciSendString("close media", "", 0, 0);
36 }
37 /// <summary>
38 /// 繼續播放
39 /// </summary>
40 public void Resume()
41 {
42 string TemStr = "";
43 TemStr = TemStr.PadLeft(128, Convert.ToChar(" "));
44 mciSendString("resume media", TemStr, TemStr.Length, 0);
45 }
46
47 //獲取音樂長度
48 public int GetMusicLength
49 {
50 get
51 {
52 string durLength = "";
53 durLength = durLength.PadLeft(128, Convert.ToChar(" "));
54 mciSendString("status media length", durLength, durLength.Length, 0);
55 durLength = durLength.Trim();
56 if (durLength == "" || durLength == "\0") return 0;
57 return (int)(Convert.ToDouble(durLength));
58 }
59 }
60 /// <summary>
61 /// API函數 www.2cto.com
62 /// </summary>
63 [DllImport("winmm.dll", EntryPoint = "mciSendString", CharSet = CharSet.Auto)]
64 private static extern int mciSendString(
65 string lpstrCommand,
66 string lpstrReturnString,
67 int uReturnLength,
68 int hwndCallback
69 );
70 }
71 }
該類主要利用WINMM.dll實現播放MP3。方法也十分簡單,不在詳細贅述,我只說明一點,也是我在開發 當中遇到的棘手的問題。就是在同一個文件夾下面有的MP3能播放,有的不能放。開始我以為是MP3中文路徑的問題,但是我測試過多次,把文件全部都改成英文,問題依舊。通過搜索引擎不停的搜索答案,問題始終沒有解決,曾經想放棄使用winmm.dll,使用別的方法來實現MP3。但是功夫不負有心人,最後還是在朋友的幫助下,找到了問題的原因,並解決了此問題。原來這個問題的原因主要還是文件路徑的問題,但不是中文的問題,而是winmm.dll播放在window下播放MP3短路徑沒有任何問題,如果是長路徑必須把長路徑轉化成DOS下的短路徑表示方法才能正常播放。該方法的具體代碼如下所示。
[DllImport("kernel32.dll ", CharSet = CharSet.Auto)]
public static extern int GetShortPathName([MarshalAs(UnmanagedType.LPTStr)] string path,[MarshalAs(UnmanagedType.LPTStr)] StringBuilder shortPath,int shortPathLength);
StringBuilder shortMusicPath = new StringBuilder(80);
int result = GetShortPathName(mymp3list[0], shortMusicPath, shortMusicPath.Capacity);
string s = shortMusicPath.ToString();
GetShortPathName參數說明:1、MP3路徑;2、返回的短路徑;3、內存中文本最大長度。
作者 zhaoyang