查看/编辑MP3文件的ID3数据

160

有什么快捷简便的方法可以使用C#查看和编辑ID3标签(艺术家、专辑等)?

7个回答

196

强烈推荐使用TagLib Sharp

TagLib.File f = TagLib.File.Create(path);
f.Tag.Album = "New Album Title";
f.Save();

1
有谁能告诉我如何设置艺术家属性?有很多相关的属性(FirstArtist,Artist,JointedArtists,FirstPerformer),几乎所有这些属性都是只读或已弃用的... - Laserson
3
虽然有些晚,但您可以按照以下方式添加表演者/艺术家:mp3.Tag.Performers = new string[] { "表演者1", "表演者2", "表演者3" }; - nokturnal
很棒的库。我用它来复制ID3标签。 - Ronnie Overby
这个库是否支持现代的ID3v2标签?Simucal的片段暗示不支持(除非他只是取了其中的一部分)。 - James
TagLib是GPL。这并不是一个适当的回答。 - Sean O'Neil

67

TagLib Sharp 很受欢迎。

顺便说一下,如果您想自己快速浏览如何进行操作... 这是我发现的一个读取mp3标签信息的C#片段。

class MusicID3Tag

{

    public byte[] TAGID = new byte[3];      //  3
    public byte[] Title = new byte[30];     //  30
    public byte[] Artist = new byte[30];    //  30 
    public byte[] Album = new byte[30];     //  30 
    public byte[] Year = new byte[4];       //  4 
    public byte[] Comment = new byte[30];   //  30 
    public byte[] Genre = new byte[1];      //  1

}

string filePath = @"C:\Documents and Settings\All Users\Documents\My Music\Sample Music\041105.mp3";

        using (FileStream fs = File.OpenRead(filePath))
        {
            if (fs.Length >= 128)
            {
                MusicID3Tag tag = new MusicID3Tag();
                fs.Seek(-128, SeekOrigin.End);
                fs.Read(tag.TAGID, 0, tag.TAGID.Length);
                fs.Read(tag.Title, 0, tag.Title.Length);
                fs.Read(tag.Artist, 0, tag.Artist.Length);
                fs.Read(tag.Album, 0, tag.Album.Length);
                fs.Read(tag.Year, 0, tag.Year.Length);
                fs.Read(tag.Comment, 0, tag.Comment.Length);
                fs.Read(tag.Genre, 0, tag.Genre.Length);
                string theTAGID = Encoding.Default.GetString(tag.TAGID);

                if (theTAGID.Equals("TAG"))
                {
                    string Title = Encoding.Default.GetString(tag.Title);
                    string Artist = Encoding.Default.GetString(tag.Artist);
                    string Album = Encoding.Default.GetString(tag.Album);
                    string Year = Encoding.Default.GetString(tag.Year);
                    string Comment = Encoding.Default.GetString(tag.Comment);
                    string Genre = Encoding.Default.GetString(tag.Genre);

                    Console.WriteLine(Title);
                    Console.WriteLine(Artist);
                    Console.WriteLine(Album);
                    Console.WriteLine(Year);
                    Console.WriteLine(Comment);
                    Console.WriteLine(Genre);
                    Console.WriteLine();
                }
            }
        }

12
这只适用于ID3v1。v2有另一种结构,它位于文件开头(与在文件末尾的v1相反),并且长度可变(v1始终为128字节)。 - jishi
这个解决方案非常冗长且未经优化。 - Amin Ghaderi
Encoding.Default 可以替换为 Encoding.UTF8。欲了解更多信息,请访问:http://www.gigamonkeys.com/book/practical-an-id3-parser.html - Mirjalal

26

UltraID3Lib...

请注意,UltraID3Lib已不再官方可用,因此也不再得到维护。请查看下面的评论以获取包含此库的Github项目链接。

//using HundredMilesSoftware.UltraID3Lib;
UltraID3 u = new UltraID3();
u.Read(@"C:\mp3\song.mp3");
//view
Console.WriteLine(u.Artist);
//edit
u.Artist = "New Artist";
u.Write();

+1 这是目前为止最好的库 - 因为 'UltraID3Lib 支持 ID3 v2.3 中规定的大部分 74 种帧类型,以及早期的 ID3v1 标签。最佳答案。 - James
+1 这是处理 mp3 元数据更简单易用的方法。 - amrswalha
1
我最近使用了这个工具,它非常好用,不会拖慢进程。它快速易用,支持 ID3 版本 1 和 2 中几乎所有的标签(你可以同时使用两个版本或只使用其中一个)。它的功能远远超出了我的需求,并且还有非常全面的帮助文件。我会向每个人推荐这个工具。 - user1934286
问候;链接无法访问。UltraID3Lib是否已停止支持? - user2225495
我在这个GitHub项目中找到了UltraID3Lib的一个版本。https://github.com/clementboone/MyWindowsMediaPlayer 该项目包含一个UltraID3Lib文件夹,其中包含以前可用的zip文件的完整内容。 - Matt
毋庸置疑,依赖于不再公开可用或维护的库可能并不是大多数情况下的理想解决方案。 - arkon

15

我根据这里的建议开始使用TagLib sharp,对于我的应用程序(仅读取MP3信息)它非常有效。 - greg7gkb
请查看hewins的回答以获取新的链接位置。 - Conrad Frix

2

ID3.NET 实现了 ID3v1.x 和 ID3v2.3,并支持对 MP3 文件中的 ID3 部分进行读写操作。此外,还有一个NuGet 包可用。


2

0

音频工具库(ATL)是最好的选择。不要使用TagLib sharp,它的支持有限且无法处理章节。ATL的NuGet包可以在这里找到。我尝试了很多东西,但只有ATL能够满足我所有的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接