使用 TagLib 为 Apple .m4a 文件设置显式标签#
Setting Explicit tag for Apple .m4a file with TagLib#
我正在使用此方法添加 ITUNESADVISORY
标签:
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
TagLib.Mpeg4.AppleTag customTag = (TagLib.Mpeg4.AppleTag)f.GetTag(TagLib.TagTypes.Apple, true);
var vector = new TagLib.ByteVector();
vector.Add((byte)1);
customTag.SetData("ITUNESADVISORY", vector, (int)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData);
f.Save();
}
除非它不起作用。它在 SetData(type, vector, flags)
行抛出异常(type
不能是 null
)。我是否需要先以某种方式添加 DataBox 或其他内容?
谢谢!
customTag.SetData()
的 type 参数必须恰好是 4 个字节,因为它被用作 BoxType
属性 14=] 保存标签数据的对象。 ITUNESADVISORY 标签实际上是使用包含 {114, 116, 110, 103}
的 BoxType
来标识的,它转换为字符串值 rtng.
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
TagLib.Mpeg4.AppleTag customTag = (TagLib.Mpeg4.AppleTag)f.GetTag(TagLib.TagTypes.Apple, true);
var vector = new TagLib.ByteVector();
vector.Add((byte)1);
customTag.SetData("rtng", vector, (int)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData);
f.Save();
}
注意: 默认情况下, Taglib.ByteVector
方法创建一个 4 字节数组,但是, rtng 标签的数据值必须只包含一个字节值。
rtng 标签的有效值为:
0
- 无评级(内容从一开始就不明确)。
1
- 露骨(内容包含攻击性语言)。
2
- 干净(内容已清除冒犯性语言)。
备用代码示例
我以一种更容易一目了然的方式重写了您的示例代码。我是初级程序员,所以我可能违反了一些事实上的标准。我还更改了大部分变量的名称,以更好地反映它们实际包含的内容。例如,您称为 customTag
的 tags
变量包含几乎所有的标签和歌曲数据;它不仅仅是您要创建或编辑的单个标签。希望这对像我这样的新手有所帮助。
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
var tags = (TagLib.Mpeg4.AppleTag) f.GetTag(TagLib.TagTypes.Apple);
TagLib.ByteVector customTagName = "rtng";
TagLib.ByteVector customTagData = new byte[] { 1 };
var customTagFlag = (UInt32)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData;
tags.SetData(customTagName, customTagData, customTagFlag);
f.Save();
}
我正在使用此方法添加 ITUNESADVISORY
标签:
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
TagLib.Mpeg4.AppleTag customTag = (TagLib.Mpeg4.AppleTag)f.GetTag(TagLib.TagTypes.Apple, true);
var vector = new TagLib.ByteVector();
vector.Add((byte)1);
customTag.SetData("ITUNESADVISORY", vector, (int)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData);
f.Save();
}
除非它不起作用。它在 SetData(type, vector, flags)
行抛出异常(type
不能是 null
)。我是否需要先以某种方式添加 DataBox 或其他内容?
谢谢!
customTag.SetData()
的 type 参数必须恰好是 4 个字节,因为它被用作 BoxType
属性 14=] 保存标签数据的对象。 ITUNESADVISORY 标签实际上是使用包含 {114, 116, 110, 103}
的 BoxType
来标识的,它转换为字符串值 rtng.
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
TagLib.Mpeg4.AppleTag customTag = (TagLib.Mpeg4.AppleTag)f.GetTag(TagLib.TagTypes.Apple, true);
var vector = new TagLib.ByteVector();
vector.Add((byte)1);
customTag.SetData("rtng", vector, (int)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData);
f.Save();
}
注意: 默认情况下, Taglib.ByteVector
方法创建一个 4 字节数组,但是, rtng 标签的数据值必须只包含一个字节值。
rtng 标签的有效值为:
0
- 无评级(内容从一开始就不明确)。1
- 露骨(内容包含攻击性语言)。2
- 干净(内容已清除冒犯性语言)。
备用代码示例
我以一种更容易一目了然的方式重写了您的示例代码。我是初级程序员,所以我可能违反了一些事实上的标准。我还更改了大部分变量的名称,以更好地反映它们实际包含的内容。例如,您称为 customTag
的 tags
变量包含几乎所有的标签和歌曲数据;它不仅仅是您要创建或编辑的单个标签。希望这对像我这样的新手有所帮助。
static void SetExplicit(string file)
{
var f = TagLib.File.Create(file);
var tags = (TagLib.Mpeg4.AppleTag) f.GetTag(TagLib.TagTypes.Apple);
TagLib.ByteVector customTagName = "rtng";
TagLib.ByteVector customTagData = new byte[] { 1 };
var customTagFlag = (UInt32)TagLib.Mpeg4.AppleDataBox.FlagType.ContainsData;
tags.SetData(customTagName, customTagData, customTagFlag);
f.Save();
}