当前位置:编程学习 > C#/ASP.NET >>

c#小软件(SaveClassic)开发手记--(3)基础类(MP3播放类MP3Player)

 

  为什么要有该类的存在呢?音乐的好处很多,不在一一赘述。我只说一点,在阅读的时候如果有轻音乐相伴,有时候会事半功倍,提高工作效率,愉悦心情。所以编写此类。这只是一个辅助作用。该类的全部代码如下所示。

 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.zzzyk.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

补充:软件开发 , C# ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,