C# 一款属于自己的音乐播放器
本文利用C# 调用Windows自带的Windows Media Player 打造一款属于自己的音乐播放器,以供学习分享使用,如有不足之处,还请指正。
概述
Windows Media Player是微软公司出品的一款免费的播放器,属于Microsoft Windows的一个组件,通常简称"WMP",支持通过插件增强功能。版本Windows Media Player 12 随 Windows 7及以上提供。可以播放MP3,WMA,WAV等音频文件。本文音乐播放器,主要是MP3文件。
涉及知识点
- 加载COM组件Windows Media Player控件到Winform窗体中。
- AxWindowsMediaPlayer控件的常见用法
- BackgroundWorker 在单独的线程上执行操作。异步操作界面上的内容。
- IrisSkin 皮肤控件,主要利用SkinEngine来美化界面,达到风格统一的效果。
设计思路
- 通过AxWindowsMediaPlayer实现音乐的播放。
- 通过PictureBox实现歌曲背景图的显示。
- 通过BackgroundWorker 实现背景图的切换更新,以及歌词的实时显示。
- 通过Label显示歌词,以及播放时间。
- 通过DataGridView实现歌曲列表。
- 通过IrisSkin来美化界面。
添加Windows Media Player组件
工具--》选择工具箱项--》COM组件--》Windows Media Player,如下图所示:
音乐播放器效果图
音乐播放器效果图如下图所示
核心代码
加载皮肤
/// <summary>
/// 初始化皮肤
/// </summary>
private void InitInfo()
{
this.skinEngine = new SkinEngine();
this.skinEngine.SkinFile = AppDomain.CurrentDomain.BaseDirectory + @"Skins\mp10.ssk";
this.skinEngine.DisableTag = ;
ReadSkinFile();
}
切换背景图
/// <summary>
/// 背景图切换
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void BgWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (isRunning) {
if (bgUrls != null && bgUrls.Length > ) {
this.curIndex = (this.curIndex % bgUrls.Length);
this.pbImage.Image = Image.FromStream(HttpWebRequest.Create(bgUrls[this.curIndex]).GetResponse().GetResponseStream());
this.pbImage.SizeMode = PictureBoxSizeMode.StretchImage;
this.curIndex++;
//
this.lblTime.Invoke(new Action(() =>
{
this.lblTime.Text = string.Format("{0}/{1}", this.axWindowsMediaPlayer1.Ctlcontrols.currentPositionString, this.axWindowsMediaPlayer1.currentMedia.durationString);
//this.lblTime.ForeColor = Color.White;
})); }
Thread.Sleep();
}
}
AxWindowsMediaPlayer相关属性方法
[基本属性]
URL:String; 指定媒体位置,本机或网络地址
uiMode:String; 播放器界面模式,可为Full, Mini, None, Invisible
playState:integer; 播放状态,=停止,=暂停,=播放,=正在缓冲,=正在连接,=准备就绪
enableContextMenu:Boolean; 启用/禁用右键菜单
fullScreen:boolean; 是否全屏显示
//播放器基本控制
Ctlcontrols.play; 播放
Ctlcontrols.pause; 暂停
Ctlcontrols.stop; 停止
Ctlcontrols.currentPosition:double; 当前进度
Ctlcontrols.currentPositionString:string; 当前进度,字符串格式。如“:”
Ctlcontrols.fastForward; 快进
Ctlcontrols.fastReverse; 快退
Ctlcontrols.next; 下一曲
Ctlcontrols.previous; 上一曲
[settings] wmp.settings //播放器基本设置
settings.volume:integer; 音量,-
settings.autoStart:Boolean; 是否自动播放
settings.mute:Boolean; 是否静音
settings.playCount:integer; 播放次数
[currentMedia] wmp.currentMedia //当前媒体属性
currentMedia.duration:double; 媒体总长度
currentMedia.durationString:string; 媒体总长度,字符串格式。如“:”
currentMedia.getItemInfo(const string); 获取当前媒体信息"Title"=媒体标题,"Author"=艺术家,"Copyright"=版权信息,"Description"=媒体内容描述, "Duration"=持续时间(秒),"FileSize"=文件大小,"FileType"=文件类型,"sourceURL"=原始地址
currentMedia.setItemInfo(const string); 通过属性名设置媒体信息
currentMedia.name:string; 同 currentMedia.getItemInfo("Title")
[currentPlaylist] wmp.currentPlaylist //当前播放列表属性
currentPlaylist.count:integer; 当前播放列表所包含媒体数
currentPlaylist.Item[integer]; 获取或设置指定项目媒体信息,其子属性同wmp.currentMedia
axWindowsMediaPlayer1.currentMedia.sourceURL; //获取正在播放的媒体文件的路径
axWindowsMediaPlayer1.currentMedia.name; //获取正在播放的媒体文件的名称
axWindowsMediaPlayer1.Ctlcontrols.Play 播放
axWindowsMediaPlayer1.Ctlcontrols.Stop 停止
axWindowsMediaPlayer1.Ctlcontrols.Pause 暂停
axWindowsMediaPlayer1.Ctlcontrols.PlayCount 文件播放次数
axWindowsMediaPlayer1.Ctlcontrols.AutoRewind 是否循环播放
axWindowsMediaPlayer1.Ctlcontrols.Balance 声道
axWindowsMediaPlayer1.Ctlcontrols.Volume 音量
axWindowsMediaPlayer1.Ctlcontrols.Mute 静音
axWindowsMediaPlayer1.Ctlcontrols.EnableContextMenu 是否允许在控件上点击鼠标右键时弹出快捷菜单
axWindowsMediaPlayer1.Ctlcontrols.AnimationAtStart 是否在播放前先播放动画
axWindowsMediaPlayer1.Ctlcontrols.ShowControls 是否显示控件工具栏
axWindowsMediaPlayer1.Ctlcontrols.ShowAudioControls 是否显示声音控制按钮
axWindowsMediaPlayer1.Ctlcontrols.ShowDisplay 是否显示数据文件的相关信息
axWindowsMediaPlayer1.Ctlcontrols.ShowGotoBar 是否显示Goto栏
axWindowsMediaPlayer1.Ctlcontrols.ShowPositionControls 是否显示位置调节按钮
axWindowsMediaPlayer1.Ctlcontrols.ShowStatusBar 是否显示状态栏
axWindowsMediaPlayer1.Ctlcontrols.ShowTracker 是否显示进度条
axWindowsMediaPlayer1.Ctlcontrols.FastForward 快进
axWindowsMediaPlayer1.Ctlcontrols.FastReverse 快退
axWindowsMediaPlayer1.Ctlcontrols.Rate 快进/快退速率
axWindowsMediaPlayer1.AllowChangeDisplaySize 是否允许自由设置播放图象大小
axWindowsMediaPlayer1.DisplaySize 设置播放图象大小
-MpDefaultSize 原始大小
-MpHalfSize 原始大小的一半
-MpDoubleSize 原始大小的两倍
-MpFullScreen 全屏
-MpOneSixteenthScreen 屏幕大小的1/
-MpOneFourthScreen 屏幕大小的1/
-MpOneHalfScreen 屏幕大小的1/
axWindowsMediaPlayer1.ClickToPlay 是否允许单击播放窗口启动Media Player
备注
关于AxWindowsMediaPlayer的属性方法,也可以参考豆丁文档。
源码下载链接
C# 一款属于自己的音乐播放器的更多相关文章
- 基于Qt的开源音乐播放器(CZPlayer)
CZPlayer CZPlayer是基于Qt开发的一款功能强大的音乐播放器,该播放器的论坛地址请点击here,目前CZPlayer已经是第四个版本了,历史版本也分别在我的github上, github ...
- 酷狗、QQ、天天动听——手机音乐播放器竞品对比
如果说什么艺术与人们生活最贴近,那应该属音乐了,因此当代人不离身的手机里必然会有自己喜欢的音乐播放器APP存在. 在当今无论PC端还是手机端音乐播放器都越来越同质化,我们应该选择哪款手机音乐播放器?它 ...
- 基于jQuery虾米音乐播放器样式代码
分享一款基于jQuery虾米音乐播放器样式代码.这是一款基于jquery+html5实现的虾米音乐播放器源码下载.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div c ...
- Linux终端音乐播放器cmus攻略: 操作歌单
目录 1. 安装 2. 操作说明 2.1. *PlayList歌单 2.2. 其他 3. 视图切换 4. 使响应Media/play按键 4.1. 编译安装 cmus是一款开源的终端音乐播放器.它小巧 ...
- 一款非常简单的android音乐播放器源码分享给大家
一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...
- 使用react native制作的一款网络音乐播放器
使用react native制作的一款网络音乐播放器 基于第三方库 react-native-video设计"react-native-video": "^1.0.0&q ...
- ubuntu下一款有点感觉的 linux音乐播放器 clementine(小橘子))
https://www.clementine-player.org/ 在linux听音乐的感觉确实不是很好,音乐播放器很多.但是仅仅只是数量上的优势,在确实不是很好用.自带的rhythmbox确实很占 ...
- 使用python打造一款音乐播放器
作者qq:64761294 编程/考试交流群:834531270 欢迎交流 核心播放模块(pygame内核) import time import pygame import easygui as g ...
- SE Springer小组之《Spring音乐播放器》可行性研究报告三、四
3 对现有系统的分析 由于本次可行性分析主要是建立在团队自行实现一个音乐软件的目标上,并不是在一个现有系统的基础上开发改进的新系统.因此这里将分析一款市面上已经存在的音乐软件(以下称为W音乐),并为之 ...
随机推荐
- .NET Core实战项目之CMS 第十五章 各层联动工作实现增删改查业务
连着两天更新叙述性的文章大家可别以为我转行了!哈哈!今天就继续讲讲我们的.NET Core实战项目之CMS系统的教程吧!这个系列教程拖得太久了,所以今天我就以菜单部分的增删改查为例来讲述下我的项目分层 ...
- Zabbix系列之八——安装agent监控windows
一.下载zabbix-agent客户端 被监控的主机装在windows server 2012 64位操作系统,被监控端需要安装: http://www.zabbix.com/downloads/3. ...
- H5本地存储sessionStorage和localStorage的区别
sessionStorage用于本地存储一个会话(session)中的数据,这些数据只有在同一个会话中的页面才能访问并且当会话结束后数据也随之销毁.因此sessionStorage不是一种持久化的本地 ...
- Flask 启动报错 error: [Errno 10053]
首先这不是 Flask 库的异常,该报错经常出现在 Python2 中. 问题所在:Python2 中 SocketServer 模块的问题. 解决办法: 不要用自带的 Server,通过 gunic ...
- 通俗易懂讲解TCP流量控制机制,了解一下
上篇文章讲了TCP拥塞控制机制的原理,没看过的不妨看下:5分钟读懂拥塞控制,这篇文章讲讲TCP流量控制机制. 一.为什么需要流量控制? 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发 ...
- [解决方案]SystemError: Parent module '' not loaded, cannot perform relative import的解决方案
缺陷:__mian__不能使用相对导入 PEP 328 Relative Imports and __name__ 中说明: Relative imports use a module's __nam ...
- [三] java虚拟机 JVM字节码 指令集 bytecode 操作码 指令分类用法 助记符
说明,本文的目的在于从宏观逻辑上介绍清楚绝大多数的字节码指令的含义以及分类 只要认真阅读本文必然能够对字节码指令集有所了解 如果需要了解清楚每一个指令的具体详尽用法,请参阅虚拟机规范 指令简介 计算机 ...
- 图示Java类的初始化顺序
Java类的初始化顺序 在开发中,知道Java类的初始化顺序才能让我们更加清楚地掌握程序的执行流程.先把结论贴出来,Java里,从图里的1~6,分别按顺序执行. 以下为代码验证阶段,一共三个类 ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- 【Recorder.js+百度语音识别】全栈方案技术细节
项目中需要利用百度语音接口在Web端实现语音识别功能,采用了这样的技术方案,但实现时遇到了很多问题,发现网上大部分文章都只是在详解官方提供的example示例,对实际开发没有提供什么有价值的建议,而r ...