使用 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 - 干净(内容已清除冒犯性语言)。

备用代码示例

我以一种更容易一目了然的方式重写了您的示例代码。我是初级程序员,所以我可能违反了一些事实上的标准。我还更改了大部分变量的名称,以更好地反映它们实际包含的内容。例如,您称为 customTagtags 变量包含几乎所有的标签和歌曲数据;它不仅仅是您要创建或编辑的单个标签。希望这对像我这样的新手有所帮助。

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