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 设置专辑封面的主要内容,如果未能解决你的问题,请参考以下文章

使用 TagLib 从 MP3 文件中提取专辑封面 - 有没有更好的方法编写此代码?

如何在 Win8 C# 应用程序中设置专辑封面?

如何使用千千静听为MP3添加专辑封面和文字信息

taglib : 如何编辑专辑艺术家?

从 mp3 文件中获取专辑封面?

是否可以从 Android 中的远程 mp3 文件中检索专辑封面?