【问题标题】:deleteing id3 tag删除 id3 标签
【发布时间】:2013-04-10 19:41:01
【问题描述】:

我需要从 mp3 文件中删除所有 id3 标签。我试过这个:

byte[] a = System.IO.File.ReadAllBytes("X.mp3");
int x = 0;
int b=3;
for (int i = 6; i <= 9; i++)
{
   x += (a[i] << (b * 7));
   b--;
}
byte[] r = new byte[a.Length-x];
for (int i = x; i < a.Length; i++)
{
   r[i-x] = a[i];
}
System.IO.File.WriteAllBytes("X.mp3", r);

但它不会删除所有的 id3 标签。 我认为在计算标签大小时有问题,但我不知道出了什么问题?

【问题讨论】:

    标签: c# id3


    【解决方案1】:

    您的代码仅处理文件开头的 ID3v2 标记。如果您的 MP3 文件同时具有 ID3 类型 - ID3v1 和 ID3v2 - 您需要将两者都删除。

    ID3v1 标签放置在文件的末尾并且是固定长度的。它们实际上更容易剥离 - 它们始终是文件的最后 128 个字节,并以文本“TAG”开头。

    使用预先存在的库来处理 MP3 文件可能会为您提供更好的服务;其中之一是开源库taglib-sharp。它可以操作这两种类型的 ID3 标签,以及执行各种其他任务。

    【讨论】:

    • a[0] 是文件结尾还是文件开头?
    • @Sina 我刚刚更正了我的答案,最后你还需要删除 ID3v1 标签 - 我尝试了你的代码,它确实在开头正确删除了 ID3v2 标签,只是没有最后的 ID3v1 标签。许多 MP3 文件两者都有。
    【解决方案2】:

    我最近不得不这样做并且不想使用库。这是一个sn-p:

    var mp3 = File.ReadAllBytes("x.mp3");
    
    int skip = 0;
    if (Encoding.ASCII.GetString(mp3, 0, 3) == "ID3")
        skip = 7 + BitConverter.ToInt32(mp3.Skip(6).Take(4).Reverse().ToArray(), 0);
    
    int take = mp3.Length - skip;
    if (Encoding.ASCII.GetString(mp3, mp3.Length - 128, 3) == "TAG")
        take -= 128;
    
    File.WriteAllBytes("stripped.mp3", mp3.Skip(skip).Take(take).ToArray());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多