C#-WinForm-简单的音频播放器(基于WindowsMediaPlayer控件)(二)

本文介绍了如何使用C#和WinForm结合WindowsMediaPlayer控件开发一款功能丰富的音频播放器,包括播放列表、播放模式、音量控制、进度同步、开机自启和系统托盘等功能。文章详细讲解了代码结构、窗体事件处理、添加音乐、播放控制、播放模式实现、音量与进度条事件,以及播放列表的搜索和管理。此外,还提到了使用TagLib库处理音频文件封面和播放历史的保存与读取。
摘要由CSDN通过智能技术生成

C#-WinForm-简单的音频播放器(基于WindowsMediaPlayer控件)(二)

【上一篇】简单的音频播放器(一)

这次为播放器填加了很多更好用的功能,把第一篇文章中的很多坑给填上了,比较大的提升在于播放列表的功能更充足(查看歌曲详情、歌曲搜索、歌曲删除等),同时也加上了Windows7任务栏的控制按钮,加入了播放模式的选择,专辑封面的显示等,主界面如下图:

 

一、代码结构

引用】:Microsoft.VisualBasicMicrosoft.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
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值