C# MP3播放帮助类

本文为原创文章如需转载请注明出处:

  1  /// <summary>
  2     /// *************************************************
  3     /// 类名:MP3帮助类
  4     /// 修改日期:2016/06/25
  5     /// 作者:董兆生
  6     /// 联系方式:QQ490412323
  7     /// *************************************************
  8     /// </summary>
  9     public class AudioPlay :IDisposable
 10     {
 11         /// <summary>
 12         /// 播放状态
 13         /// </summary>
 14         private PlayState _palystate = PlayState.Closed;
 15         public  PlayState PlayState
 16         {
 17             set
 18             {
 19                 if (value == _palystate) return;
 20                 OnPropertyChanged(value);
 21                 _palystate = value;
 22             }
 23             get { return _palystate; }
 24         }
 25         /// <summary>
 26         /// 操作错误事件
 27         /// </summary>
 28         public event Errordelegate EventAudioplayerror;
 29         /// <summary>
 30         /// 播放完毕事件
 31         /// </summary>
 32         public event PlayEnd EventAudioPlayEnd;
 33         /// <summary>
 34         /// 播放状态发生变化事件
 35         /// </summary>
 36         public event DelegatePlayStateChange PlayStatePropertyChanged;
 37         /// <summary>
 38         /// 播放时间变化事件
 39         /// </summary>
 40         public event DelegatePlayNowTime EventPlayTimeChange;
 41         /// <summary>
 42         /// 时间长度毫秒
 43         /// </summary>
 44         public readonly StringBuilder PlayLenght = new StringBuilder(255);
 45         /// <summary>
 46         /// 播放音量
 47         /// </summary>
 48         private  int _playvlome = 1000;
 49         public int PlayVolume{get { return _playvlome; }}
 50         /// <summary>
 51         /// 当前播放时间
 52         /// </summary>
 53         public int NowPlayTime
 54         {
 55             get { return int.Parse(_nowplaytime.ToString()); }
 56         }
 57         private readonly StringBuilder _nowplaytime = new StringBuilder(255);
 58
 59         private  AudioModel _nowPlayData;
 60         /// <summary>
 61         /// 当前播放歌曲
 62         /// </summary>
 63         public AudioModel NowPlayData { get { return _nowPlayData; } }
 64         /// <summary>
 65         /// 播放列表
 66         /// </summary>
 67         public List<AudioModel> PlayList = new List<AudioModel>();
 68
 69         private int _playindex;
 70         /// <summary>
 71         /// 当前播放歌曲在列表中的序号
 72         /// </summary>
 73         public int PlayIndex {  get { return _playindex; } }
 74         /// <summary>
 75         /// 是否单曲循环播放
 76         /// </summary>
 77         public bool IsSingleLoop { set; get; }
 78         /// <summary>
 79         /// 是否列表循环播放
 80         /// </summary>
 81         public bool IsListLoop { set; get; }
 82         /// <summary>
 83         /// 随机循环播放
 84         /// </summary>
 85         public bool IsRandLoop { set; get; }
 86
 87         private Random _random;
 88
 89         public AudioPlay(AudioModel playdata)
 90         {
 91             _nowPlayData = (AudioModel)playdata.Clone();
 92             PlayList .Add(_nowPlayData);
 93             _playindex = 0;
 94
 95
 96             var playTimer = new Timer
 97             {
 98                 Enabled = true,
 99                 Interval = 1000
100             };
101
102             playTimer.Tick += playTimer_Tick;
103         }
104
105         public AudioPlay(List<AudioModel> playList)
106         {
107             PlayList = new List<AudioModel>(playList);
108             _nowPlayData = PlayList[0];
109             _playindex = 0;
110
111
112             var playTimer = new Timer
113             {
114                 Enabled = true,
115                 Interval = 1000
116             };
117             playTimer.Tick += playTimer_Tick;
118         }
119
120         public bool NextPlay()
121         {
122             if (PlayList==null) return false;
123
124             if (_playindex + 1 >= PlayList.Count) return false;
125
126             Closed();
127
128             _nowPlayData = PlayList[_playindex + 1];
129
130             Open();
131
132             SetVolume(PlayVolume);
133
134             Play();
135
136             _playindex = _playindex + 1;
137
138             return true;
139         }
140
141         public bool PreviousPlay()
142         {
143             if (PlayList==null) return false;
144
145             if (_playindex - 1 <0 ) return false;
146
147             Closed();
148
149             _nowPlayData = PlayList[_playindex - 1];
150
151             Open();
152
153             SetVolume(PlayVolume);
154
155             Play();
156
157             _playindex = _playindex - 1;
158
159             return true;
160         }
161
162         public bool JumpPlay(int index)
163         {
164             if (PlayList == null) return false;
165
166             if (index < 0 && index > PlayList.Count - 1) return false;
167
168              Closed();
169
170             _nowPlayData = PlayList[index];
171
172             Open();
173
174             SetVolume(PlayVolume);
175
176             Play();
177
178             _playindex = index;
179
180             return true;
181         }
182
183         private void playTimer_Tick(object sender, EventArgs e)
184         {
185             if (PlayState != PlayState.Playing) return;
186
187             DoOrder(string.Format("status {0} position", _nowPlayData.AliasMovie), _nowplaytime, _nowplaytime.Capacity);
188
189             var returntimeThread = new Thread(ThreadReturnTime) {IsBackground = true};
190
191             returntimeThread.Start(_nowplaytime);
192
193             if (!_nowplaytime.Equals(PlayLenght)) return;
194
195              Closed();
196
197             _palystate = PlayState.Closed;
198
199             if (EventAudioPlayEnd !=null) EventAudioPlayEnd();
200
201             if (IsRandLoop)
202             {
203
204                 _random = new Random((int)DateTime.Now.Ticks);
205
206                 _playindex = _random.Next(0, PlayList.Count);
207
208                 _nowPlayData = PlayList[_playindex];
209
210                 JumpPlay(_playindex);
211
212                 return;
213             }
214
215             if (IsListLoop)
216             {
217
218                 if (_playindex + 1 >= PlayList.Count)
219                 {
220                     _playindex = 0;
221                 }
222                 else
223                 {
224                     _playindex = _playindex + 1;
225                 }
226
227                 _nowPlayData = PlayList[_playindex];
228
229                 JumpPlay(_playindex);
230
231                 return;
232             }
233
234             if (!IsSingleLoop) return;
235
236             JumpPlay(_playindex);
237         }
238
239         private void ThreadReturnTime(object time)
240         {
241             if(_palystate!=PlayState.Playing) return;
242
243             if (EventPlayTimeChange != null) EventPlayTimeChange(int.Parse(time.ToString()));
244         }
245
246
247         /// <summary>
248         /// 执行指令
249         /// </summary>
250         /// <param name="order">指令</param>
251         /// <param name="returnString">需要返回的数据</param>
252         /// <param name="returnsize">返回数据大小</param>
253         /// <returns></returns>
254         private bool DoOrder(string order, StringBuilder returnString,int returnsize)
255         {
256             var error = WinApiHepler.mciSendString(order, returnString, returnsize, new IntPtr());
257
258             if(IsDisplsed)return false;
259
260             if (error == 0) return true;
261
262             Errorlog(error);
263
264             return false;
265         }
266
267         /// <summary>
268         /// 事件格式化
269         /// </summary>
270         /// <param name="millisecond">毫秒</param>
271         /// <returns>hh:mm:ss</returns>
272         public static string TimeFormat(int millisecond)
273         {
274             var time = new TimeSpan(0, 0, 0, 0, millisecond);
275
276             return string.Format("{0}:{1}:{2}", time.Hours, time.Minutes, time.Seconds);
277         }
278         /// <summary>
279         /// 获得当前状态
280         /// </summary>
281         /// <returns></returns>
282         public PlayState GetPlyaState()
283         {
284             var state = new StringBuilder(50);
285
286             return DoOrder(string.Format("status {0} mode", _nowPlayData.AliasMovie), state, state.Capacity) != true ? PlayState.Error : (PlayState)Enum.Parse(typeof(PlayState), state.ToString());
287         }
288         /// <summary>
289         /// 打开音乐文件
290         /// </summary>
291         public void Open()
292         {
293             PlayState = DoOrder(string.Format("open {0} alias {1}", _nowPlayData.ShortPath, _nowPlayData.AliasMovie), null, 0) != true ? PlayState.Error : PlayState.Opne;
294
295             if (_palystate != PlayState.Opne) return;
296
297             DoOrder(string.Format("status {0} length", _nowPlayData.AliasMovie), PlayLenght, PlayLenght.Capacity);
298
299         }
300         /// <summary>
301         /// 播放音乐
302         /// </summary>
303         /// <param name="starttime">开始时间</param>
304         /// <param name="endtime">结束时间</param>
305         public void Play(int starttime,int endtime)
306         {
307             PlayState = DoOrder(string.Format("play {0} from {1} to {2} notify", _nowPlayData.AliasMovie, starttime, endtime), null, 0) != true ? PlayState.Error : PlayState.Playing;
308         }
309         /// <summary>
310         /// 播放音乐
311         /// </summary>
312         public void Play()
313         {
314             PlayState = DoOrder(string.Format("play {0} notify", _nowPlayData.AliasMovie), null, 0) != true ? PlayState.Error : PlayState.Playing;
315         }
316         /// <summary>
317         /// 暂停
318         /// </summary>
319         public void Pause()
320         {
321             PlayState = DoOrder(string.Format("pause {0}", _nowPlayData.AliasMovie), null, 0) != true ? PlayState.Error : PlayState.Paused;
322         }
323         /// <summary>
324         /// 停止
325         /// </summary>
326         public void Stop()
327         {
328             PlayState = DoOrder(string.Format("stop {0}", _nowPlayData.AliasMovie), null, 0) != true ? PlayState.Error : PlayState.Stopped;
329         }
330         /// <summary>
331         /// 关闭音乐
332         /// </summary>
333         public void Closed()
334         {
335             PlayState = DoOrder(string.Format("close {0}", _nowPlayData.AliasMovie), null, 0) != true ? PlayState.Error : PlayState.Closed;
336         }
337         /// <summary>
338         /// 设置音量
339         /// </summary>
340         /// <param name="volume">0-1000</param>
341         /// <returns></returns>
342         public  bool SetVolume(int volume)
343         {
344             if (!DoOrder(string.Format("setaudio {0} volume to {1}", _nowPlayData.AliasMovie, volume), null, 0))
345                 return false;
346             _playvlome = volume;
347             return true;
348         }
349
350         private void Errorlog(int error)
351         {
352             var errorText = new StringBuilder(50);
353
354             WinApiHepler.mciGetErrorString(error, errorText, errorText.Capacity);
355
356             if (EventAudioplayerror == null) return;
357
358             EventAudioplayerror(errorText.ToString());
359         }
360
361         private void OnPropertyChanged(PlayState state)
362         {
363             if (PlayStatePropertyChanged != null)
364             {
365                 PlayStatePropertyChanged(state);
366             }
367         }
368
369        protected bool IsDisplsed { get; set; }
370
371        ~AudioPlay()
372         {
373             Dispose();
374         }
375
376         /// <summary>
377         /// 释放
378         /// </summary>
379         public void Dispose()
380         {
381             Dispose(IsDisplsed);
382         }
383         public virtual void Dispose(bool isDisplsed)
384         {
385             if (isDisplsed)
386                 return;
387
388             EventAudioplayerror = null;
389
390             EventAudioPlayEnd = null;
391
392             EventPlayTimeChange = null;
393
394             DoOrder(string.Format("close {0}", _nowPlayData.AliasMovie), null, 0);
395         }
396
397     }
398     public delegate void Errordelegate(string error);
399
400     public delegate void PlayEnd();
401
402     public delegate void DelegateHockMesg(Message msg);
403
404     public delegate void DelegatePlayStateChange(PlayState state);
405
406     public delegate void DelegatePlayNowTime(int time);
407
408     public class WindosMessageInform :UserControl
409     {
410         int[] HockMsg { set; get; }
411
412         public event DelegateHockMesg EventHockmesg;
413
414         public WindosMessageInform(int[] hockmsg)
415         {
416             HockMsg = hockmsg;
417         }
418
419         protected override void WndProc(ref Message m)
420         {
421             if (HockMsg.ToList().Contains(m.Msg))
422             {
423                 if (EventHockmesg != null) EventHockmesg(m);
424             }
425             base.WndProc(ref m);
426         }
427     }
428
429     public class AudioModel : ICloneable
430     {
431         public AudioModel()
432         {
433
434         }
435
436         public AudioModel(string file,string alias,object data)
437         {
438             PlayFile = file;
439
440             AliasMovie = alias;
441
442             SourceData = data;
443
444             FileName = System.IO.Path.GetFileNameWithoutExtension(file);
445
446             var shortpath = new StringBuilder(255);
447
448             WinApiHepler.GetShortPathName(PlayFile, shortpath, shortpath.Capacity);
449
450             ShortPath = shortpath.ToString();
451         }
452         public string FileName { set; get; }
453
454         public string PlayFile { set; get; }
455
456         public string ShortPath { set; get; }
457
458         public string AliasMovie { set; get; }
459
460         public object SourceData { set; get; }
461
462         public object Clone()
463         {
464             var clonedata = SerializationHelper.GetSerialization(this);
465
466             return SerializationHelper.ScriptDeserialize<AudioModel>(clonedata);
467         }
468     }
469
470     public enum PlayState
471     {
472         Opne,
473         Playing,
474         Paused,
475         Stopped,
476         Closed,
477         None,
478         Error
479     }

AudioPlayHelper

基于winAPI winmm.dll

mciSendString 编写的帮助类功能比较齐全(起码比我现在网上搜的齐全@[email protected])

已经实现的功能 播放 暂停 停止 关闭就不多说了基本功能没啥好说的。

事件:播放完毕通知,时间变化通知,状态变化通知,错误通知

功能:上一首, 下一首 ,指定顺序播放

播放后状态:单曲循环,列表循环,随机播放

里面用到的BearChildren为我个人编写的工具功能如名字一样熊孩子...意思:让这个框架跟熊孩子一样什么都能做 目前还在完善中

目前框架主要是以单机桌面开发编写的一套工具,内容为图像处理,Io,数据等,我希望能有更多的人来帮助我来完善这个框架在日常工作中让开发变的更加方便快捷,

QQ群为:572582327 欢迎大家一起加入讨论丰富自己的技术 无论你是大神还是新手都欢迎你们。

代码下载链接:自带播放器demo

https://git.coding.net/BearChildren/AudioPlayHelper.git

时间: 2024-10-30 01:31:37

C# MP3播放帮助类的相关文章

Android练习项目 Mp3播放器实现(一)

对于Android的学习,需要掌握的东西有点多,需要我们认真,小心,不断的进取.前天突然有个想法,觉得Mp3播放器是一个可以练习的项目,于是在网上搜了下,发现有人已经写了博客,看了他们的博客后,我觉得他们说的一点很对,Mp3播放器基本用到了Android里面的许多知识点,做完这个过后,可能对于Android整个架构有了一定了解,我于是也想尝试下,于是准备边做,编写博客,来记录自己开发的过程,这个也许叫作项目开发日志吧. 第一个我的想法是先做:本地音乐播放器. 于是我用了个粗浅的方法来加载mp3文

android开发之MediaPlayer+Service MP3播放器

http://blog.csdn.net/zzy916853616/article/details/6450753 [java] view plaincopy import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.List; import android.app.ListActivity; import android.apps.service.Player

Android练习项目 Mp3播放器实现(二)

在经过几天的折腾之后,迎来了Mp3播放器的第二篇博客,这篇文章主要将如何实现播放器的播放,下一首,上一首,顺序播放,循环播放,随机播放,单曲循环等操作. 其实操作的过程中主要是通过参数的传递来实现功能的. 在activity里面互相传参有很多中方法,但对于activity和service进行交互有些方法并不适合,通过对Broadcast和BroadcastReceiver等操作,来控制播放的实现. 我们先设定好广播,然后通过发送信号来进行传递数据. 主要在activity里面动态注册广播,通过传

安卓MP3播放器开发实例(1)之音乐列表界面

学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正规.这个项目是当时借鉴Mars老师的初学视频做的安州手机的MP3播放器.自己又进行了改进,特别在歌词的优化和加入进度条方面的.因为是8个月前做的,水平非常0基础,bug应该非常多,如今自己又懒得再一次改进,仅仅希望可以给初学的朋友们提供一些帮助.或者起到抛砖引玉的效果.那我就心惬意足了. 先整体介绍

安卓MP3播放器开发实例(3)之进度条和歌词更新的实现

上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这个须要对服务绑定熟悉才干够理解.原理不复杂.可是步骤略微繁琐,代码贴起来可能会非常混乱. 进度条和歌词放在一起说比較好,不然比較混乱.进度条的调整大家都懂的,就是进度条调到哪里歌曲的播放就跟到哪里,歌词也得跟到哪里.首先看下上一篇看过的開始button监听事件中服务的绑定代码: //绑定播放服务 b

【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app

通过调用安卓的MediaPlayer可以直接完成Mp3等主流音频的播放,同时利用ContentResolver与Cursor可以直接读取安卓内在数据库的信息,直接获取当前sdcard中所有音频的列表,无须像<[Android]内存卡图片读取器,图库app>(点击打开链接)一样利用原始的Java代码去遍历整个sdcard卡,直接调用安卓固有的类既便捷又快速.最后,读取出来的Mp3可以通过适配器直接加载到ListView列表,做出如下所示的内存卡Mp3播放器app效果.本app在自己的真实的16G

基于GStreamer编写Mp3播放器

一.简介 作者系统为CentOS6,本文在此基础上对Mp3播放器进行开发,需要使用mp3解码库libmad和gstreamer0.10-plugins-ugly,详细步骤如下.   二.操作步骤 1)下载 wget ftp://ftp.pbone.net/mirror/atrpms.net/el5-x86_64/atrpms/stable/libmad0-0.15.1b-4.el5.x86_64.rpm wget ftp://ftp.pbone.net/mirror/atrpms.net/el5

你也可以用java的swing可以做出这么炫的mp3播放器_源码下载

I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this MP3 Player. The target for this blog is that to publish the source code, and you can download the source code and give me some advices if possible. The

C# wave mp3 播放器探寻

C# wave mp3 播放器探寻 最近无聊,想听听歌曲.可怜新电脑上歌曲就两三首,要听其它的就得在旧电脑上播放.可是,那台古董但不失健壮的本本被老婆无情的霸占了.无奈. 思来想去,得,写个程序播放吧.做个C/S播放器. 理想是美好的,现实是残酷的. 在繁琐的查找和测试之后,找来了NAdio(26 Oct 2012 NAudio 1.6)这个开源的第三方插件. 先写个结论再写过程. 结论 一.使用.net自带的SoundPlayer来播放wave文件需要注意几个地方: 使用FileStream