本文为原创文章如需转载请注明出处:
  /// <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播放帮助类的更多相关文章

  1. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

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

    学习安卓开发有一年了,想想这一年的努力,确实也收获了不少.也找到了比較如意的工作. 今天准备分享一个以前在初学阶段练习的一个项目.通过这个项目我真正的找到了开发安卓软件的感觉,从此逐渐步入安卓开发的正 ...

  3. 团队编程--MP3播放器

    设计思路: 这次的作业是一个MP3播放器,它是一个团队项目.由于我们都没接触过这类的编程.刚开始的时候我们是不知道从什么地方着手的.经过我们的商量我们决定从现在市场主流的音乐播放器上找到几个主要的功能 ...

  4. android开发之MediaPlayer+Service MP3播放器

    import java.io.File; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Lis ...

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

    上一次谈了音乐播放的实现,这次说下最复杂的进度条和歌词更新.因为须要在播放的Activity和播放的Service间进行交互,所以就涉及了Activity对Service的绑定以及绑定后数据的传输,这 ...

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

    通过调用安卓的MediaPlayer能够直接完毕Mp3等主流音频的播放,同一时候利用ContentResolver与Cursor能够直接读取安卓内在数据库的信息.直接获取当前sdcard中全部音频的列 ...

  7. MP3播放器团队项目

    一.设计思路 程序要求能播放MP3文件,因此需调用库中的播放方法:右键工具箱选择项,添加com组件,选择window media player后工具箱就会多一个控件,然后拖到窗体中就OK了.另在窗体中 ...

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

    I had published the blog : 你用java的swing可以做出这么炫的mp3播放器吗? and to display some screenshots about this M ...

  9. 你用java的swing可以做出这么炫的mp3播放器吗?

    这个mp3播放器是基于java的swing编写的,我认为界面还是可以拿出来和大家看一看评一评. 先说说创作的初衷,由于前段时间工作不是很忙,与其闲着,还不如找一些东西来给自己捣腾捣腾,在 之前写的 j ...

随机推荐

  1. Linux上部署Tomcat+Nginx负载均衡

    前提:配置好了JDK. 我这里是vm上的linux虚拟机,可能不适用于所有情况. 一.Linux上配置Tomcat 1.下载地址:https://tomcat.apache.org/download- ...

  2. MyBatis基本使用步骤

    MyBatis是一个数据持久层(ORM)框架.把实体 类和SQL语句之间建立了映射关系,是一种半自 动化的ORM实现.MyBATIS需要开发人员自己来写sql语句,这可以增加了程序的灵活性,在一定程度 ...

  3. 吴裕雄--天生自然python编程:turtle模块绘图(3)

    turtle(海龟)是Python重要的标准库之一,它能够进行基本的图形绘制.turtle图形绘制的概念诞生于1969年,成功应用于LOGO编程语言. turtle库绘制图形有一个基本框架:一个小海龟 ...

  4. Python---11模块

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很 ...

  5. python基础函数、方法

    python的函数和方法,通过def 定义: 函数的特性: 减少重复代码 使程序变的可扩展 使程序变得易维护 函数和方法的区别:函数有返回值.方法没有 语法定义: def sayhi():#函数名 p ...

  6. cookie和session实现登录验证

    回话技术,比如在做登录功能的时候,需要配合是用存储在客户端的cookie信息,以及存储在服务端的session来实现登录功能.在cookie中保存了用户的信息,特别是一个特殊的令牌信息,当用户拿着这个 ...

  7. C++全排列函数next_permutation()和prev_permutation()

    头文件:#include<algorithm> * * * 1. next_permutation(): next_permutation()函数的返回类型是bool类型. 即:如果有一个 ...

  8. MySQL增、删、改、查基础操作(C++)

    系统平台:Centos7 MySQL版本:5.7.19 连接MySQL数据库 MySQL::MySQL(string host, string user, string passwd, string ...

  9. 读书笔记——《在线》

    * 2017年10月24日 星期二 晴* ## "在线"是未来世界发展的关键.一个事物是不是符合未来发展的趋势,就是要看它是否在线. 插图 **在线** 正文 作者是王坚,阿里巴巴 ...

  10. vue项目实战

    本篇文章主要介绍了vue的环境配置,vue项目的目录结构以及在开发vue项目中问题的一些解决方案. 环境配置及目录结构 1.安装node.js(http://www.runoob.com/nodejs ...