C# TagLib 为 Mp3 设置专辑封面
Posted
技术标签:
【中文标题】C# TagLib 为 Mp3 设置专辑封面【英文标题】:C# TagLib Set Album Cover for Mp3 【发布时间】:2018-05-20 17:03:52 【问题描述】:我有一个 mp3 文件,我想将专辑封面添加到其中。艺术作品已保存到一个临时文件夹中,我检查了它,它在那里并且是一个 jpeg。 这是我给的代码:
public void AddMp3Tags()
TagLib.File file = TagLib.File.Create(OutputPath + OutputName + "." + Format);
SetAlbumArt(Art, file);
file.Tag.Title = SongTitle;
file.Tag.Performers = Artists.Split(',');
file.Tag.Album = Album;
file.Tag.Track = (uint)TrackNumber;
file.Tag.Year = (uint)Convert.ToInt32(Regex.Match(Year, @"(\d)(\d)(\d)(\d)").Value);
file.Save();
public void SetAlbumArt(string url, TagLib.File file)
string path = string.Format(@"0temp\1.jpg", OutputPath, Guid.NewGuid().ToString());
using (WebClient client = new WebClient())
client.DownloadFile(new Uri(url), path);
TagLib.Picture pic = new TagLib.Picture
Type = TagLib.PictureType.FrontCover,
Description = "Cover",
MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg
;
MemoryStream ms = new MemoryStream();
Image image = Image.FromFile(path);
image.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
ms.Position = 0;
pic.Data = TagLib.ByteVector.FromStream(ms);
file.Tag.Pictures = new TagLib.IPicture[] pic ;
file.Save();
ms.Close();
所有标签都设置正确,除了只显示黑框的艺术作品: Black box cover art in windows media player.
我尝试了很多东西,我做错了什么?
【问题讨论】:
只是一个注释,不会是这里的问题。可能没有理由将 JPEG 读入图像并再次保存,因为它会导致质量损失。只需打开文件并将该流提供给 TagLib。 【参考方案1】:所以我做了更多的研究,结果发现默认情况下 WMP 尝试使用网络服务来获取专辑插图,我在 VLC 中打开了歌曲并显示了插图。专辑代码写得正确,如下所示:Mp3Tag Viewer/Editor
我发现的另一件事是我的标签使用的是 Id3v2.4 和 Id3v1。 WMP 出于某种原因不喜欢这个,所以我强迫 TagLib 使用 Id3v2.3。我还将文本编码更改为 UFT16,因为 UFT8 不起作用。专辑封面现在显示在 WMP 和 Windows 资源管理器中。
我还找到了一种不将图像写入磁盘的方法,方法是从网页下载数据并将其保存到内存中。
这是我的最终代码:
public void AddMp3Tags()
TagLib.Id3v2.Tag.DefaultVersion = 3;
TagLib.Id3v2.Tag.ForceDefaultVersion = true;
TagLib.File file = TagLib.File.Create(OutputPath + OutputName + ".mp3");
SetAlbumArt(Art, file);
file.Tag.Title = SongTitle;
file.Tag.Performers = Artists.Split(',');
file.Tag.Album = Album;
file.Tag.Track = (uint)TrackNumber;
file.Tag.Year = (uint)Convert.ToInt32(Regex.Match(Year, @"(\d)(\d)(\d)(\d)").Value);
file.RemoveTags(file.TagTypes & ~file.TagTypesOnDisk);
file.Save();
public void SetAlbumArt(string url, TagLib.File file)
string path = string.Format(@"0temp\1.jpg", OutputPath, Guid.NewGuid().ToString());
byte[] imageBytes;
using (WebClient client = new WebClient())
imageBytes = client.DownloadData(url);
TagLib.Id3v2.AttachedPictureFrame cover = new TagLib.Id3v2.AttachedPictureFrame
Type = TagLib.PictureType.FrontCover,
Description = "Cover",
MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg,
Data = imageBytes,
TextEncoding = TagLib.StringType.UTF16
;
file.Tag.Pictures = new TagLib.IPicture[] cover ;
我希望这可以帮助任何和我有同样问题的人,并且不需要像我那样花太多时间来解决这个问题。
【讨论】:
不确定为什么需要所有这些代码。我在 1 行中添加了图片,它在 WMP 和 VLC 中运行良好,没有问题(不更改标签版本)>>>>> file.Tag.Pictures = new TagLib.IPicture[] new TagLib.Picture(@"c :\temp\mycover.png") ;【参考方案2】:确保您的文件已成功下载并尝试以下操作:
public void SetAlbumArt(string url, TagLib.File file)
string path = string.Format(@"0temp\1.jpg", OutputPath, Guid.NewGuid().ToString());
using (WebClient client = new WebClient())
client.DownloadFile(new Uri(url), path);
file.Tag.Pictures = new TagLib.IPicture[]
new TagLib.Picture(new TagLib.ByteVector((byte[])new System.Drawing.ImageConverter().ConvertTo(System.Drawing.Image.FromFile(path), typeof(byte[]))))
Type = TagLib.PictureType.FrontCover,
Description = "Cover",
MimeType = System.Net.Mime.MediaTypeNames.Image.Jpeg
;
file.Save();
【讨论】:
不幸的是这仍然不起作用,并且图像文件肯定是下载的,我可以在文件夹中看到它。 确保 jpeg 文件格式正确。可能是带有“.jpg”扩展名的位图图像。用paint打开你的jpeg文件并用不同的名字保存(用于测试)。 这不是问题。不过还是谢谢。我现在已经解决了我的问题。以上是关于C# TagLib 为 Mp3 设置专辑封面的主要内容,如果未能解决你的问题,请参考以下文章