C# TagLib Set Обложка альбома для Mp3
У меня есть 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(@"{0}temp\{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();
}
Все теги установлены правильно, за исключением рисунка, на котором просто показан черный ящик: обложка черного ящика в Windows Media Player.
Я перепробовал много вещей, что я делаю не так?
2 ответа
Поэтому я провел еще несколько исследований, и оказалось, что по умолчанию WMP пытается использовать веб-сервис для получения обложки альбома, я открыл песню в VLC, и обложка была показана. Код альбома был написан правильно, как показано здесь: Mp3Tag Viewer / Editor
Еще одна вещь, которую я узнал, состоит в том, что мои теги использовали Id3v2.4 и Id3v1. WMP почему-то не нравится, поэтому я заставил TagLib использовать Id3v2.3. Я также изменил кодировку текста на UFT16, потому что UFT8 не работал. Обложка альбома теперь отображается в WMP и Windows Explorer.
Я также нашел способ не записывать изображение на диск, загрузив данные с веб-страницы и сохранив их в памяти.
Это был мой последний код:
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(@"{0}temp\{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 };
}
Я надеюсь, что это поможет любому, у кого такая же проблема, как у меня, и ему не нужно тратить столько времени на выяснение этого, как я.
Убедитесь, что ваш файл успешно загружен и попробуйте это:
public void SetAlbumArt(string url, TagLib.File file)
{
string path = string.Format(@"{0}temp\{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();
}