c#小软件(SaveClassic)开发手记--(3)基础类(MP3播放类MP3Player)
2011-12-09 11:45 zhaoyang 阅读(1905) 评论(2) 编辑 收藏 举报为什么要有该类的存在呢?音乐的好处很多,不在一一赘述。我只说一点,在阅读的时候如果有轻音乐相伴,有时候会事半功倍,提高工作效率,愉悦心情。所以编写此类。这只是一个辅助作用。该类的全部代码如下所示。
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函数
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、内存中文本最大长度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述