C#使用TagLib处理音频文件封面图

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 间接实现的。

使用网络图片就会出现这种无法正常显示封面的情况,正常读取显示是没问题的。

解决办法就是后台下载图片后通过本地方式添加封面图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值