音乐播放器后台之歌曲读取
1.引言
本篇将讲述我读取MP3文件时遇到的一些的坑,怎么说呢,C#中可以使用的第三方解决方案实在是不多,可以适用于UWP的解决方案就更少了。经过两天的不懈努力,我算是基本上完成了读取MP3文件中的标题、参与创作的艺术家、唱片集等信息,但是很遗憾,对MP3文件封面的读取没有实现。
2.读取安装包下的MP3文件
为了方便,我直接歌曲文件放在安装包下,如下图所示,其中Thumbnils文件夹中存放默认的封面:
安装包的文件数据是指Windows10应用程序编译之后生成的安装部署文件的内部数据,所以安装包下的文件数据其实就是在应用程序项目中添加的文件。可以在应用程序里面获取安装包下的文件,不过编译的文件源文件和资源类文件是获取不到的。安装包文件数据和应用文件应用设置所存储的位置是不一样的,如果是保存应用程序业务的相关信息并不建议保存到安装包的目录下,所以在实际编程中安装包的文件数据通常是用于内置一些固定的文件数据,如国家省份信息等。(引自林政的《深入浅出Windows10通用应用开发》)
2.1 创建Song类
首先新建Song类,封装MP3文件的基本信息:
namespace MusicPlayer.Models
{
/// <summary>
/// mp3歌曲
/// </summary>
public class Song
{
/// <summary>
/// 歌曲名
/// </summary>
private string _name;
/// <summary>
/// 标题
/// </summary>
private string _title;
/// <summary>
/// 参与创作的艺术家
/// </summary>
private string _artists;
/// <summary>
/// 唱片集
/// </summary>
private string _ablum;
/// <summary>
/// 封面
/// </summary>
private BitmapImage _thumbnail;
/// <summary>
/// 路径
/// </summary>
private string _path;
/// <summary>
/// 为MP3文件指定默认的封面
/// </summary>
private const string _thumbnailPath = "ms-appx:///MusicCollections/Thumbnails/NoThumbnail.PNG";
public string Name
{
get
{
return _name;
}
set
{
_name = value;
}
}
public string Title
{
get
{
if (string.IsNullOrEmpty(_title))
{
if (string.IsNullOrEmpty(_name))
{
return "无名音乐";
}
else
{
//return _name.Substring(0,_name.Length - 4);
return _name;
}
}
else
{
return _title;
}
}
set
{
_title = value;
}
}
public string Artists
{
get
{
return _artists;
}
set
{
_artists = value;
}
}
public string Ablum
{
get
{
return _ablum;
}
set
{
_ablum = value;
}
}
public BitmapImage Thumbnail
{
get
{
if (_thumbnail == null)
{
return new BitmapImage(new Uri(_thumbnailPath));
}
else
{
return _thumbnail;
}
}
set
{
_thumbnail = value;
}
}
public string Path
{
get
{
return _path;
}
set
{
_path = value;
}
}
}
}
其中,Name属性表示MP3文件的名字,Title表示MP3歌曲的名字,而Title属性是从MP3文件中读取出来的,可能不存在或者为"",因此在get的时候做了一些小处理,当 _name 不为空且不为""时,去除 _name 中的后缀名,然后返回,否则返回“无名音乐”。
- 2017-06-28更新:由于在实际给 _name 的赋值过程中,本身就不包含了扩展名,因此当 _title 为空或者""的时候,直接返回 _name 字段,而不对其进行截取处理。
2.2 创建用于读取Song的管理类SongManager
SongManger是一个静态工具类,有两个静态私有的字段:
-
- _songs:
IList类型集合,存在Song类型的对象
- _songs:
-
- __thumbnail:
BitmapImage类型,MP3歌曲指定默认的封面
- __thumbnail:
SongManger类还有几个方法:
-
- GetDefaultThumbnailAsync():
public static async Task<BitmapImage> GetDefaultThumbnailAsync()
{
if(_thumbnail == null)
{
_thumbnail = new BitmapImage();
StorageFolder localFolder = Package.Current.InstalledLocation;
StorageFolder musicFolder = await localFolder.GetFolderAsync("MusicCollections");
StorageFolder thumbnailFolder = await musicFolder.GetFolderAsync("Thumbnails");
StorageFile thumbnailFile = await thumbnailFolder.GetFileAsync("NoThumbnail.PNG");
_thumbnail.UriSource = new Uri(thumbnailFile.Path, UriKind.Absolute);
}
return _thumbnail;
}
该方法用于获取默认的MP3文件的封面。
-
- InitSongAsync():
private static async Task<Song> InitSongAsync(StorageFile songFile)
{
Song song = new Song();
song.Name = songFile.DisplayName;
song.Path = songFile.Path;
MusicProperties musicProperties = await songFile.Properties.GetMusicPropertiesAsync();
song.Title = musicProperties.Title;
song.Ablum = musicProperties.Album;
song.Artists = musicProperties.Artist;
return song;
}
该方法将获得到的MP3文件初始化成我们所需要的Song类型对象
-
- BuildSongsAsync()
public static async Task<IList<Song>> BuildSongsAsync()
{
if(_songs == null || _songs.Count <= 0)
{
_songs = new List<Song>();
StorageFolder localFolder = Package.Current.InstalledLocation;
StorageFolder musicFolder = await localFolder.GetFolderAsync("MusicCollections");
foreach(StorageFile file in await musicFolder.GetFilesAsync())
{
_songs.Add(await InitSongAsync(file));
}
}
return _songs;
}
该方法用于读取安装包下的MusicCllections文件夹下的MP3文件