TagLib是用于处理媒体文件,例如视频、音频和照片等等的开源库。详细介绍可以到官网或TagLib的Github上了解。
回到正文,以下是关于不同情况下使用音频封面的实现方法。也算是对网上一些旧的、无效的贴文的一次更新吧。
安装
由于使用的是C#,所以直接通过 Visual Studio 的 NuGet 安装:
1、使用WPF的Image组件展示封面图
string path = @"C:\audio.mp3";
TagLib.File audio = TagLib.File.Create(path);
if (audio.Tag.Pictures.Length > 0) {
BitmapImage bitmap = new BitmapImage();
bitmap.BeginInit();
bitmap.StreamSource = new MemoryStream(audio.Tag.Pictures[0].Data.Data);
bitmap.EndInit();
image.Source = bitmap;
} else {
image.Source = null;
}
变量 image 是在xaml中定义的System.Windows.Controls.Image组件名。实现原理是将封面图的byte数据封装到内存中,再将其转换为位图流。有了位图,组件就能够顺利加载音频中的封面。
2、保存封面图到本地
string audioPath = @"C:\test.mp3", picPath = @"C:\test.jpg";
TagLib.File audio = TagLib.File.Create(audioPath);
using (MemoryStream ms = new MemoryStream(audio.Tag.Pictures[0].Data.Data))
using (FileStream fs = new FileStream(picPath, FileMode.Create, FileAccess.Write)) {
ms.WriteTo(fs);
ms.Dispose();
}
audio.Dispose();
如果音频有多张封面图的话,可以通过改变 Tag.Pictures 数组的索引获得。函数 Dispose() 的作用是释放资源,避免程序一直占用文件。注意:构造函数 FileStream 中的参数意味着当图片存在时,将对其进行覆盖。不希望覆盖的话用 FileMode.CreateNew ,当文件存在时会抛出异常。
流程上跟组件展示封面差不多,这里是将内存中的数据输出到目标文件。
3、添加封面图到音频文件
这里分两种情况:一种是添加本地图片,另一种是添加网络图片(无需下载直接应用图片链接)。无论哪种情况最好使用 jpg 或 jpeg 格式的图片。
3.1、本地图片
TagLib.File audio = TagLib.File.Create(@"C:\test.mp3");
audio.Tag.Title = "标题";
audio.Tag.Performers = new[] { "歌手1", "歌手2" };
audio.Tag.Album = "专辑";
audio.Tag.Year = uint.Parse("2023"); // 年份
audio.Tag.Genres = new[] { "流派1", "流派2" };
audio.Tag.Comment = "备注";
// 引用本地图片
audio.Tag.Pictures = new TagLib.IPicture[] { new TagLib.Picture(@"C:\test.jpg") };
// 保存修改并释放资源
audio.Save();
audio.Dispose();
上述设置对应以下的文件属性:
3.2、网络图片
注意:添加网络图片后,系统可能无法预览,实际是成功写入的。追求完美的话可以先将图片作为临时文件下载下来,添加完成后删除图片。
string url = "http://www.xxx.com/test.jpg";
TagLib.File audio = TagLib.File.Create(@"C:\test.mp3");
audio.Tag.Pictures = new TagLib.IPicture[] { new TagLib.Picture() {
Type = TagLib.PictureType.FrontCover,
MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg,
Data = TagLib.ByteVector.FromStream(new MemoryStream(new WebClient().DownloadData(url)))
} };
audio.Save();
audio.Dispose();
关于 MimeType :有3个值供选择(Gif、Jpeg、Tiff)。每个值对应相应的图片格式,混用会报错。
对封面图的很多操作都是利用 MemoryStream 间接实现的。
使用网络图片就会出现这种无法正常显示封面的情况,正常读取显示是没问题的。
解决办法就是后台下载图片后通过本地方式添加封面图。