音樂播放器後臺之歌曲讀取 1.引言 & 160;& 160;& 160;& 160;C 中可以使用的第三方解決方案實在是不多,可以適用於UWP的解決方案就更少了。經過兩天的不懈努力,我算是基本上完成了讀取MP3文件中的標題、參與創作的藝術家、唱片集等信息,但是很遺憾,對MP3文件封面的讀取沒有實現。 ...
音樂播放器後臺之歌曲讀取
1.引言
C#中可以使用的第三方解決方案實在是不多,可以適用於UWP的解決方案就更少了。經過兩天的不懈努力,我算是基本上完成了讀取MP3文件中的標題、參與創作的藝術家、唱片集等信息,但是很遺憾,對MP3文件封面的讀取沒有實現。
2.讀取安裝包下的MP3文件
為了方便,我直接歌曲文件放在安裝包下,如下圖所示,其中Thumbnils文件夾中存放預設的封面:
安裝包的文件數據是指Windows10應用程式編譯之後生成的安裝部署文件的內部數據,所以安裝包下的文件數據其實就是在應用程式項目中添加的文件。可以在應用程式裡面獲取安裝包下的文件,不過編譯的文件源文件和資源類文件是獲取不到的。安裝包文件數據和應用文件應用設置所存儲的位置是不一樣的,如果是保存應用程式業務的相關信息並不建議保存到安裝包的目錄下,所以在實際編程中安裝包的文件數據通常是用於內置一些固定的文件數據,如國家省份信息等。(引自林政的《深入淺出Windows10通用應用開發》)
通過Windows.ApplicationModel.Package類的InstalledLocation屬性可以獲取安裝包的文件,語法如下所示:
StorageFolder localFolder = Windows.ApplicationModel.Package.Current.InstalledLocation;
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);
}
}
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 中的尾碼名,然後返回,否則返回“無名音樂”。
2.2 創建用於讀取Song的管理類SongManager
SongManger是一個靜態工具類,有兩個靜態私有的欄位:
- _songs:
IList類型集合,存在Song類型的對象
- _songs:
- __thumbnail:
BitmapImage類型,MP3歌曲指定預設的封面
- __thumbnail:
SongManger類還有幾個方法:
GetDefaultThumbnailAsync():
該方法用於獲取預設的MP3文件的封面。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; }
InitSongAsync():
該方法將獲得到的MP3文件初始化成我們所需要的Song類型對象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; }
- 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文件
- BuildSongsAsync()