C # TagLib Set Обложка альбома для MP3 - PullRequest
0 голосов
/ 20 мая 2018

У меня есть 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 ]

0 голосов
/ 20 мая 2018

Итак, я провел еще несколько исследований, и оказалось, что по умолчанию 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(@"{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 };
}

Я надеюсь, что это поможет любому, кто сталкивается с той же проблемой, что и я, и ему не нужно тратить столько времени на выяснение этого, как я.

0 голосов
/ 20 мая 2018

Убедитесь, что ваш файл успешно загружен, и попробуйте это:

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();
}
...