1

我正在使用这种方法来添加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();
}

除非它不起作用。它抛出异常(type不能是null)就SetData(type, vector, flags)行了。我需要先以某种方式添加 DataBox,还是什么?

谢谢!

4

1 回答 1

0

类型参数customTag.SetData()必须正好是 4 个字节,因为它被用作保存标签数据的对象的BoxType属性。TagLib.Mpeg4.AppleTagITUNESADVISORY标签实际上是使用包含标识的,它转换为 rtng 的字符串BoxType{114, 116, 110, 103}

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- 干净(内容已清除攻击性语言)。

备用代码示例

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

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();
}
于 2017-03-12T23:56:29.927 回答