C# MP3播放帮助类
/// <summary>
/// *************************************************
/// 类名:MP3帮助类
/// 修改日期:2016/06/25
/// 作者:董兆生
/// 联系方式:QQ490412323
/// *************************************************
/// </summary>
public class AudioPlay :IDisposable
{
/// <summary>
/// 播放状态
/// </summary>
private PlayState _palystate = PlayState.Closed;
public PlayState PlayState
{
set
{
if (value == _palystate) return;
OnPropertyChanged(value);
_palystate = value;
}
get { return _palystate; }
}
/// <summary>
/// 操作错误事件
/// </summary>
public event Errordelegate EventAudioplayerror;
/// <summary>
/// 播放完毕事件
/// </summary>
public event PlayEnd EventAudioPlayEnd;
/// <summary>
/// 播放状态发生变化事件
/// </summary>
public event DelegatePlayStateChange PlayStatePropertyChanged;
/// <summary>
/// 播放时间变化事件
/// </summary>
public event DelegatePlayNowTime EventPlayTimeChange;
/// <summary>
/// 时间长度毫秒
/// </summary>
public readonly StringBuilder PlayLenght = new StringBuilder();
/// <summary>
/// 播放音量
/// </summary>
private int _playvlome = ;
public int PlayVolume{get { return _playvlome; }}
/// <summary>
/// 当前播放时间
/// </summary>
public int NowPlayTime
{
get { return int.Parse(_nowplaytime.ToString()); }
}
private readonly StringBuilder _nowplaytime = new StringBuilder(); private AudioModel _nowPlayData;
/// <summary>
/// 当前播放歌曲
/// </summary>
public AudioModel NowPlayData { get { return _nowPlayData; } }
/// <summary>
/// 播放列表
/// </summary>
public List<AudioModel> PlayList = new List<AudioModel>(); private int _playindex;
/// <summary>
/// 当前播放歌曲在列表中的序号
/// </summary>
public int PlayIndex { get { return _playindex; } }
/// <summary>
/// 是否单曲循环播放
/// </summary>
public bool IsSingleLoop { set; get; }
/// <summary>
/// 是否列表循环播放
/// </summary>
public bool IsListLoop { set; get; }
/// <summary>
/// 随机循环播放
/// </summary>
public bool IsRandLoop { set; get; } private Random _random; public AudioPlay(AudioModel playdata)
{
_nowPlayData = (AudioModel)playdata.Clone();
PlayList .Add(_nowPlayData);
_playindex = ; var playTimer = new Timer
{
Enabled = true,
Interval =
}; playTimer.Tick += playTimer_Tick;
} public AudioPlay(List<AudioModel> playList)
{
PlayList = new List<AudioModel>(playList);
_nowPlayData = PlayList[];
_playindex = ; var playTimer = new Timer
{
Enabled = true,
Interval =
};
playTimer.Tick += playTimer_Tick;
} public bool NextPlay()
{
if (PlayList==null) return false; if (_playindex + >= PlayList.Count) return false; Closed(); _nowPlayData = PlayList[_playindex + ]; Open(); SetVolume(PlayVolume); Play(); _playindex = _playindex + ; return true;
} public bool PreviousPlay()
{
if (PlayList==null) return false; if (_playindex - < ) return false; Closed(); _nowPlayData = PlayList[_playindex - ]; Open(); SetVolume(PlayVolume); Play(); _playindex = _playindex - ; return true;
} public bool JumpPlay(int index)
{
if (PlayList == null) return false; if (index < && index > PlayList.Count - ) return false; Closed(); _nowPlayData = PlayList[index]; Open(); SetVolume(PlayVolume); Play(); _playindex = index; return true;
} private void playTimer_Tick(object sender, EventArgs e)
{
if (PlayState != PlayState.Playing) return; DoOrder(string.Format("status {0} position", _nowPlayData.AliasMovie), _nowplaytime, _nowplaytime.Capacity); var returntimeThread = new Thread(ThreadReturnTime) {IsBackground = true}; returntimeThread.Start(_nowplaytime); if (!_nowplaytime.Equals(PlayLenght)) return; Closed(); _palystate = PlayState.Closed; if (EventAudioPlayEnd !=null) EventAudioPlayEnd(); if (IsRandLoop)
{ _random = new Random((int)DateTime.Now.Ticks); _playindex = _random.Next(, PlayList.Count); _nowPlayData = PlayList[_playindex]; JumpPlay(_playindex); return;
} if (IsListLoop)
{ if (_playindex + >= PlayList.Count)
{
_playindex = ;
}
else
{
_playindex = _playindex + ;
} _nowPlayData = PlayList[_playindex]; JumpPlay(_playindex); return;
} if (!IsSingleLoop) return; JumpPlay(_playindex);
} private void ThreadReturnTime(object time)
{
if(_palystate!=PlayState.Playing) return; if (EventPlayTimeChange != null) EventPlayTimeChange(int.Parse(time.ToString()));
} /// <summary>
/// 执行指令
/// </summary>
/// <param name="order">指令</param>
/// <param name="returnString">需要返回的数据</param>
/// <param name="returnsize">返回数据大小</param>
/// <returns></returns>
private bool DoOrder(string order, StringBuilder returnString,int returnsize)
{
var error = WinApiHepler.mciSendString(order, returnString, returnsize, new IntPtr()); if(IsDisplsed)return false; if (error == ) return true; Errorlog(error); return false;
} /// <summary>
/// 事件格式化
/// </summary>
/// <param name="millisecond">毫秒</param>
/// <returns>hh:mm:ss</returns>
public static string TimeFormat(int millisecond)
{
var time = new TimeSpan(, , , , millisecond); return string.Format("{0}:{1}:{2}", time.Hours, time.Minutes, time.Seconds);
}
/// <summary>
/// 获得当前状态
/// </summary>
/// <returns></returns>
public PlayState GetPlyaState()
{
var state = new StringBuilder(); return DoOrder(string.Format("status {0} mode", _nowPlayData.AliasMovie), state, state.Capacity) != true ? PlayState.Error : (PlayState)Enum.Parse(typeof(PlayState), state.ToString());
}
/// <summary>
/// 打开音乐文件
/// </summary>
public void Open()
{
PlayState = DoOrder(string.Format("open {0} alias {1}", _nowPlayData.ShortPath, _nowPlayData.AliasMovie), null, ) != true ? PlayState.Error : PlayState.Opne; if (_palystate != PlayState.Opne) return; DoOrder(string.Format("status {0} length", _nowPlayData.AliasMovie), PlayLenght, PlayLenght.Capacity); }
/// <summary>
/// 播放音乐
/// </summary>
/// <param name="starttime">开始时间</param>
/// <param name="endtime">结束时间</param>
public void Play(int starttime,int endtime)
{
PlayState = DoOrder(string.Format("play {0} from {1} to {2} notify", _nowPlayData.AliasMovie, starttime, endtime), null, ) != true ? PlayState.Error : PlayState.Playing;
}
/// <summary>
/// 播放音乐
/// </summary>
public void Play()
{
PlayState = DoOrder(string.Format("play {0} notify", _nowPlayData.AliasMovie), null, ) != true ? PlayState.Error : PlayState.Playing;
}
/// <summary>
/// 暂停
/// </summary>
public void Pause()
{
PlayState = DoOrder(string.Format("pause {0}", _nowPlayData.AliasMovie), null, ) != true ? PlayState.Error : PlayState.Paused;
}
/// <summary>
/// 停止
/// </summary>
public void Stop()
{
PlayState = DoOrder(string.Format("stop {0}", _nowPlayData.AliasMovie), null, ) != true ? PlayState.Error : PlayState.Stopped;
}
/// <summary>
/// 关闭音乐
/// </summary>
public void Closed()
{
PlayState = DoOrder(string.Format("close {0}", _nowPlayData.AliasMovie), null, ) != true ? PlayState.Error : PlayState.Closed;
}
/// <summary>
/// 设置音量
/// </summary>
/// <param name="volume">0-1000</param>
/// <returns></returns>
public bool SetVolume(int volume)
{
if (!DoOrder(string.Format("setaudio {0} volume to {1}", _nowPlayData.AliasMovie, volume), null, ))
return false;
_playvlome = volume;
return true;
} private void Errorlog(int error)
{
var errorText = new StringBuilder(); WinApiHepler.mciGetErrorString(error, errorText, errorText.Capacity); if (EventAudioplayerror == null) return; EventAudioplayerror(errorText.ToString());
} private void OnPropertyChanged(PlayState state)
{
if (PlayStatePropertyChanged != null)
{
PlayStatePropertyChanged(state);
}
} protected bool IsDisplsed { get; set; } ~AudioPlay()
{
Dispose();
} /// <summary>
/// 释放
/// </summary>
public void Dispose()
{
Dispose(IsDisplsed);
}
public virtual void Dispose(bool isDisplsed)
{
if (isDisplsed)
return; EventAudioplayerror = null; EventAudioPlayEnd = null; EventPlayTimeChange = null; DoOrder(string.Format("close {0}", _nowPlayData.AliasMovie), null, );
} }
public delegate void Errordelegate(string error); public delegate void PlayEnd(); public delegate void DelegateHockMesg(Message msg); public delegate void DelegatePlayStateChange(PlayState state); public delegate void DelegatePlayNowTime(int time); public class WindosMessageInform :UserControl
{
int[] HockMsg { set; get; } public event DelegateHockMesg EventHockmesg; public WindosMessageInform(int[] hockmsg)
{
HockMsg = hockmsg;
} protected override void WndProc(ref Message m)
{
if (HockMsg.ToList().Contains(m.Msg))
{
if (EventHockmesg != null) EventHockmesg(m);
}
base.WndProc(ref m);
}
} public class AudioModel : ICloneable
{
public AudioModel()
{ } public AudioModel(string file,string alias,object data)
{
PlayFile = file; AliasMovie = alias; SourceData = data; FileName = System.IO.Path.GetFileNameWithoutExtension(file); var shortpath = new StringBuilder(); WinApiHepler.GetShortPathName(PlayFile, shortpath, shortpath.Capacity); ShortPath = shortpath.ToString();
}
public string FileName { set; get; } public string PlayFile { set; get; } public string ShortPath { set; get; } public string AliasMovie { set; get; } public object SourceData { set; get; } public object Clone()
{
var clonedata = SerializationHelper.GetSerialization(this); return SerializationHelper.ScriptDeserialize<AudioModel>(clonedata);
}
} public enum PlayState
{
Opne,
Playing,
Paused,
Stopped,
Closed,
None,
Error
}
AudioPlayHelper
基于winAPI winmm.dll
mciSendString 编写的帮助类功能比较齐全(起码比我现在网上搜的齐全@-@)
已经实现的功能 播放 暂停 停止 关闭就不多说了基本功能没啥好说的。
事件:播放完毕通知,时间变化通知,状态变化通知,错误通知
功能:上一首, 下一首 ,指定顺序播放
播放后状态:单曲循环,列表循环,随机播放
里面用到的BearChildren为我个人编写的工具功能如名字一样熊孩子...意思:让这个框架跟熊孩子一样什么都能做 目前还在完善中
目前框架主要是以单机桌面开发编写的一套工具,内容为图像处理,Io,数据等,我希望能有更多的人来帮助我来完善这个框架在日常工作中让开发变的更加方便快捷,
QQ群为:点击链接加入群【NaughtyKid学习交流群】:https://jq.qq.com/?_wv=1027&k=5hdQ2Ag 欢迎大家一起加入讨论丰富自己的技术 无论你是大神还是新手都欢迎你们。
代码下载链接:自带播放器demo
https://git.coding.net/BearChildren/AudioPlayHelper.git

C# MP3播放帮助类的更多相关文章
- iOS开发拓展篇—封装音频文件播放工具类
iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...
- 安卓MP3播放器开发实例(1)之音乐列表界面
学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...
- 团队编程--MP3播放器
设计思路: 这次的作业是一个MP3播放器,它是一个团队项目.由于我们都没接触过这类的编程.刚开始的时候我们是不知道从什么地方着手的.经过我们的商量我们决定从现在市场主流的音乐播放器上找到几个主要的功能 ...
- android开发之MediaPlayer+Service MP3播放器
import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Lis ...
- 安卓MP3播放器开发实例(3)之进度条和歌词更新的实现
上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这 ...
- 【Android】利用安卓的数据接口、多媒体处理编写内存卡Mp3播放器app
通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...
- MP3播放器团队项目
一.设计思路 程序要求能播放MP3文件,因此需调用库中的播放方法:右键工具箱选择项,添加com组件,选择window media player后工具箱就会多一个控件,然后拖到窗体中就OK了.另在窗体中 ...
- 你也可以用java的swing可以做出这么炫的mp3播放器_源码下载
I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this M ...
- 你用java的swing可以做出这么炫的mp3播放器吗?
这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...
随机推荐
- C++ 部分STL
map map可以理解为一个数组(但实质上并不是,只是方便理解),我们一般的数组不管定义成什么类型他的下标都是整型(int),map和这些数组的区别是他的下标可以是其他类型,由自己定义.map的创建. ...
- vue项目实例-常用标签
感谢:https://www.jianshu.com/p/5d9b341d650f 总结: 1.<router-link to=''>主要实现跳转链接功能,属性to='/'即是跳转到pat ...
- <BZOJ3032>七夕祭
水 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> ...
- 将js进行到底:node学习3
node重要API之NET--TCP编程之旅 废话:最近去了一趟上海会了会一个程序员朋友,途径SNH48握手会,说好我就去看看,没想到握手了王诗蒙,掉入巨坑:塞纳河.回来后边听着<春夏秋冬> ...
- 用shell脚本新建文件并自动生成头说明信息
目标: 新建文件后,直接给文件写入下图信息 代码实现: [root@localhost test]# vi AutoHead.sh #!/bin/bash #此程序的功能是新建shell文件并自动生成 ...
- Promethues配置
# my global config global: scrape_interval: 10s # Set the scrape interval to every 15 seconds. Defau ...
- 差旅日志i·长安&北京(更新于8.21_夜)
大学之时,看到zealer王自如的差旅日志系列欲罢不能,扁平化的管理理念以及轻松的工作氛围,耳目一新的出差体验,抵消了部分不曾走入职场的紧张感甚至是恐惧感.如今初入职场也进入了职业生涯,特记录此次的差 ...
- Intellij IDEA创建 Web 项目
快速构建 Web 项目 打开IDEA,新建Project,左边菜单栏选择 Maven,直接点 Next 选择GroupId和ArtifactId 选择项目名称,默认会填上工程位置.模块姓名等,直接点F ...
- 「NOIP 2017」列队
题目大意:给定一个 $n times m$ 的方阵,初始时第 $i$ 行第 $j$ 列的人的编号为 $(i-1) times m + j$,$q$ 次给出 $x,y$,让第 $x$ 行 $y$ 列的人 ...
- LSTM 句子相似度分析
使用句子中出现单词的Vector加权平均进行文本相似度分析虽然简单,但也有比较明显的缺点:没有考虑词序且词向量区别不明确.如下面两个句子: "北京的首都是中国"与"中国的 ...