C#-WinForm-简单的音频播放器(基于WindowsMediaPlayer控件)(二)
【上一篇】简单的音频播放器(一)
这次为播放器填加了很多更好用的功能,把第一篇文章中的很多坑给填上了,比较大的提升在于播放列表的功能更充足(查看歌曲详情、歌曲搜索、歌曲删除等),同时也加上了Windows7任务栏的控制按钮,加入了播放模式的选择,专辑封面的显示等,主界面如下图:
一、代码结构
【引用】:Microsoft.VisualBasic、Microsoft.WindowsAPICodePack、Microsoft.WindowsAPICodePack.Shell、
PresentationCore、taglib-sharp(蓝色的引用需要自行下载进行添加,vs内不包含)
【窗体】:①主界面:
①歌曲详情窗体
②删除歌曲窗体
【歌曲信息类】:用于存储歌曲信息和封装与歌曲信息有关的方法,我一直比较喜欢这样的写法,能使得代码结
构更清晰。
using Shell32;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace SimpleMediaPlayer
{
public class SongsInfo
{
private string fileName; //1
private string filePath;
private string filesize; //2
private string artist; //13
private string album; //14
private Image albumImage;
private string year; //15
private string originName; //21
private string duration; //27
private string byteRate; //28
public string FileName { get => fileName; set => fileName = value; }
public string FilePath { get => filePath; set => filePath = value; }
public string Filesize { get => filesize; set => filesize = value; }
public string Artist { get => artist; set => artist = value; }
public string Album { get => album; set => album = value; }
public Image AlbumImage { get => albumImage; set => albumImage = value; }
public string Year { get => year; set => year = value; }
public string OriginName { get => originName; set => originName = value; }
public string Duration { get => duration; set => duration = value; }
public string ByteRate { get => byteRate; set => byteRate = value; }
public SongsInfo(string fPath)
{
SetSongInfo(fPath);
SetAlbumArt(fPath);
}
private void SetSongInfo(string strPath)
{
try
{
ShellClass sh = new ShellClass();
Folder dir = sh.NameSpace(Path.GetDirectoryName(strPath));
FolderItem item = dir.ParseName(Path.GetFileName(strPath));
fileName = dir.GetDetailsOf(item, 0);
if (fileName == string.Empty)
fileName = "未知";
FilePath = strPath;
filesize = dir.GetDetailsOf(item, 1);
if (filesize == string.Empty)
filesize = "未知";
artist = dir.GetDetailsOf(item, 13);
if (artist == string.Empty)
artist = "未知";
album = dir.GetDetailsOf(item, 14);
if (album == string.Empty)
album = "未知";
year = dir.GetDetailsOf(item, 15);
if (year == string.Empty)
year = "未知";
OriginName = dir.GetDetailsOf(item, 21);
if (OriginName == string.Empty)
OriginName = "未知";
duration = dir.GetDetailsOf(item, 27);
if (duration == string.Empty)
duration = "未知";
byteRate = dir.GetDetailsOf(item, 28);
if (byteRate == string.Empty)
byteRate = "未知";
//输出0-50位信息
//for (int i = -1; i < 50; i++)
//{
// string str = dir.GetDetailsOf(item, i);
// Console.WriteLine(i + " && " + str);
//}
}
catch(Exception ex)
{
Console.WriteLine(ex);
}
}
//获取歌曲封面
private void SetAlbumArt(string strPath)
{
if(strPath != "" && strPath != null)
{
TagLib.File file = TagLib.File.Create(strPath);
if (file.Tag.Pictures.Length > 0)
{
var bin = (byte[])(file.Tag.Pictures[0].Data.Data);
albumImage = Image.FromStream(new MemoryStream(bin)).GetThumbnailImage(100, 100, null, IntPtr.Zero);
}
else
{
albumImage = Properties.Resources.DefaultAlbum;
}
}
else
{
albumImage = Properties.Resources.DefaultAlbum;
}
}
}
}
TagLib库用于处理媒体文件,例如视频、音频和照片等,例如解析照片、从文件中加载图片、加载音频文件等。
在这里我们就是使用了它从文件中加载图片以获得音频文件的封面图片,如果没有封面图片,则设置为默认封面。
二、窗体的Load、Shown、Closed事件
Load事件:窗体加载时主要是设置一些程序状态(播放列表数据显示绑定,播放列表的歌单历史记录读取)
private void Form1_Load(object sender, EventArgs e)
{
this.odlgFile.Multiselect = true;
lstSongList.DisplayMember = "fileName";
lstSongList.ValueMember = "filePath";
ReloadStatus();
ReadHistory();
//设置开机自启
//StarUp("1");
}
Shown事件:设置windows7任务栏略缩图与按钮功能(详见另外一篇博客)
private ThumbnailToolbarButton ttbbtnPlayPause;
private ThumbnailToolbarButton ttbbtnPre;
private ThumbnailToolbarButton ttbbtnNext;
private void Form1_Shown(object sender, EventArg