在C#中以字符串形式写入ID3v2曲目号的好方法?

在C#中以字符串形式写入ID3v2曲目号的好方法?,c#,id3,taglib-sharp,id3v2,C#,Id3,Taglib Sharp,Id3v2,如果这个问题已经在这个网站的某个地方得到了回答,请原谅,但我在搜索时没有找到任何东西。我使用taglib sharp为C#中的.mp3文件编写了一个ID3v1/2标记编辑器,taglib sharp将曲目编号视为uint编号。根据: “设置中的轨道编号/位置”框是一个数字字符串 包含原始音频文件的顺序号 记录。可使用“/”字符和数字进行扩展 包含原始磁盘上磁道/元素总数的字符串 记录。例如“4/9” 我个人不使用“/”,但我倾向于写“03”而不是“3”。有没有一种简单的方法可以直接将曲目号作为字

如果这个问题已经在这个网站的某个地方得到了回答,请原谅,但我在搜索时没有找到任何东西。我使用taglib sharp为C#中的.mp3文件编写了一个ID3v1/2标记编辑器,taglib sharp将曲目编号视为uint编号。根据:

“设置中的轨道编号/位置”框是一个数字字符串 包含原始音频文件的顺序号 记录。可使用“/”字符和数字进行扩展 包含原始磁盘上磁道/元素总数的字符串 记录。例如“4/9”

我个人不使用“/”,但我倾向于写“03”而不是“3”。有没有一种简单的方法可以直接将曲目号作为字符串写入标记,而不是通过uint


另外,附带问题:taglib似乎不支持某些标记,特别是URL、Orig。艺术家、出版商和编码者。你知道该怎么处理吗?

不,你不能先将
字符串
保存为
int
uint
。为什么不根据您正在使用的库将值3保存为
uint
,并使用类似以下内容:

uint track = 3;
string strTrack = track.ToString("00");
要展示它吗

如果许可证允许,您仍然可以修改库以满足您的需要


我在过去快速查看了taglib sharp,它远远不能支持标记中所有现有的帧。它仅支持最常见的帧。对于其他类,我认为可以使用某种默认类,但我不记得名称。否则,您仍然可以自己去扩展库,除非有其他类似的库可用,我不知道。

更新:由于这个答案最初是编写的,
gettextastring
被删除了。此答案已更新以反映这一点

TagLib#中的田径场是各种标签规范的通用近似和简化,用于标签场。对于ID3v2标记,这是假设TRCK字段由一个或两个数字字符串组成,用斜杠分隔,并根据规范将其转换为数字

也就是说,它是一个文本字段,你可以用它做任何你想做的事情。您只需访问文本框即可读取或写入它

通过
Id3v2.Tag.SetTextFrame
可以轻松编写:

var tag=(Id3v2.tag)file.GetTag(TagTypes.Id3v2,true);//获取或创建ID3v2标记。
tag.SetTextFrame(“TRCK”,“03”);//添加或更新TRCK帧。
由于TRCK是一个单字符串文本框,因此可以使用
Id3v2.Tag.GetTextAsString类似地读取它:

var tag=(Id3v2.tag)file.GetTag(TagTypes.Id3v2,false);
var trackNumber=tag?.GetTextAsString(“TRCK”);

我知道不能在字符串和int/uint之间进行隐式转换。问题是uint和string之间的转换是由taglib完成的,如果只使用taglib,则必须使用uint,这会在库将其转换回string之前破坏有关额外零、破折号等的任何信息。但是,我不知道如何修改库或如何直接使用标记。如果要使用“03”仅用于显示,可以使用我的解决方案。如果真的是为了存储,你会丢失信息。因此,如果这真的是一个问题,除非您设法扩展它,否则就不能使用taglib sharp。这个库不遵循ID3规范的事实确实是一个问题。检查他们的网站,看看你是否可以下载他们的源代码,以及是否允许修改它。GetTextAsString()方法是私有的。对不起,我刚刚下载了tagLib#。示例代码中的
文件
是什么类型的对象?@sab669此示例适用于任何支持Id3v2标记的标记文件(例如MP3)。如果进行适当的空检查,您可以在任何文件类型上尝试它。什么是FrameType?@Heisenberg,我必须查看源代码才能找到
FrameType
。它在FrameTypes.cs中,出于某种原因,作者决定它应该是私有的。他的话来自于代码:但是,外部用户没有必要使用这个类。TRCK被定义为
ReadOnlyByteVector TRCK=“TRCK”
我认为将前导零写入TRCK字段是很常见的。它适用于VLC和WinAmp等播放器,但Windows资源管理器中有一个错误,它将一些3位数字解释为八进制数字。我也喜欢前导零,但也许最好避免?