C# MP3播放幫助類

来源:http://www.cnblogs.com/dongzhaosheng/archive/2016/06/25/5617131.html
-Advertisement-
Play Games

1 /// <summary> 2 /// ************************************************* 3 /// 類名:MP3幫助類 4 /// 修改日期:2016/06/25 5 /// 作者:董兆生 6 /// 聯繫方式:QQ490412323 7 // ...


本文為原創文章如需轉載請註明出處:
  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
              
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ASP.NET MVC5入門基礎,添加一個模型、視圖、控制器,完成增刪改查的功能。 ...
  • 一、前言 上篇運用了.Net Remoting技術解決了本地與伺服器版本對比,並下載更新包的過程。 本篇主要是應用Process,來實現重啟程式的過程。 情景假設: Revit2016正載入某dll,其版本為1.0.0.0。伺服器的更新dll版本為1.0.0.10。 下載完後,Revit2016關閉 ...
  • 寫在前面 在學非同步,有位園友推薦了《async in C#5.0》,沒找到中文版,恰巧也想提高下英文,用我拙劣的英文翻譯一些重要的部分,純屬娛樂,簡單分享,保持學習,謹記謙虛。 如果你覺得這件事兒沒意義翻譯的又差,盡情的踩吧。如果你覺得值得鼓勵,感謝留下你的贊,在今後每一次應該猛烈突破的時候,不選擇 ...
  • 國內知名B2C系統  Urselect 很不錯的asp.net 架構參考與nopCommerce abp等國外開源系統,針對國內定製,採用領域模型設計,不過該系統很適合企業做B2C,品牌電商,商城操作簡單實用,功能也相當強大,是目前.net 系統裡面技術實力較強的後起之秀。 ...
  • 0. 沒有找到一款中意的分頁插件,又不想使用現成的(醜到爆),所以自己動手造一個吧 先看下效果(其實也不咋滴...): 我的小站地址:我的Bootstrap小站; PS:(問博客園:為什麼老是刪我的置頂隨便?上一篇閱讀量都快500了,也分分鐘給我從首頁刪掉...真是無語了<博客園地址:http:// ...
  • 第一次寫,小緊張! 即將畢業了,現在將我畢業設計中用到的小的編程技術以及自己的一些理解分享出來,希望可以做點小貢獻。 首先要感謝網上各路大神無私的分享,沒有你們,就沒有我的收穫。 在大四之前,對於編程只是學習過簡單的C語言,從來沒有接觸過工程實踐。最後的畢業設計肯定要開發程式,於是認真學習了一段時間 ...
  • Async in C# 5.0(C#中的非同步編程Async) 蝸牛翻譯之第一章 ...
  • 交流QQ群 ASP.NET鷹組 460845632 我會傾囊相授 我們要做微信支付當配置好微信微信商戶和支付配置之後我們首先應該看 https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=9_1# 這是微信統一下單的參數,我將這個參數做成 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...