如何在C#中将章节元数据嵌入mp3文件中?

时间:2017-04-24 13:46:56

标签: c# mp3 id3

我试图通过this规范创建一个工具来编辑和嵌入mp3文件中的章节标记(用于播客)。

到目前为止,我发现的所有库都不支持CHAP或CTOC帧,也无法找到使它们与自定义帧一起使用的方法。到目前为止,NTagLite似乎是我最喜欢的,但是我在VS2017上构建源代码时遇到了麻烦,尝试使用我自己的方法拼接不同的帧类型,并且在一天结束时我不是一个非常高级的程序员,所以使用手动的ByteStream有点过头了。

有谁知道实现这一目标的方法?有经验的人吗?我只是错过了这些库中的调用,而且功能已经存在吗?

2 个答案:

答案 0 :(得分:1)

最新版本的Audio Tools Library for .NET(https://github.com/Zeugma440/atldotnet)支持ID3v2章节(CTOC / CHAP帧)读写。

以下wiki的示例代码:

using System;
using ATL.AudioData;
using System.Collections.Generic;

AudioDataManager theFile = new AudioDataManager(AudioData.AudioDataIOFactory.GetInstance().GetDataReader(<fileLocation>));

Dictionary<uint, ChapterInfo> expectedChaps = new Dictionary<uint, ChapterInfo>();
TagData theTag = new TagData();
theTag.Chapters = new List<ChapterInfo>();
expectedChaps.Clear();

ChapterInfo ch = new ChapterInfo();
ch.StartTime = 123;
ch.StartOffset = 456;
ch.EndTime = 789;
ch.EndOffset = 101112;
ch.UniqueID = "";
ch.Title = "aaa";
ch.Subtitle = "bbb";
ch.Url = "ccc\0ddd";

theTag.Chapters.Add(ch);
expectedChaps.Add(ch.StartTime, ch);

ch = new ChapterInfo();
ch.StartTime = 1230;
ch.StartOffset = 4560;
ch.EndTime = 7890;
ch.EndOffset = 1011120;
ch.UniqueID = "002";
ch.Title = "aaa0";
ch.Subtitle = "bbb0";
ch.Url = "ccc\0ddd0";

theTag.Chapters.Add(ch);
expectedChaps.Add(ch.StartTime, ch);

// Persists the chapters
theFile.UpdateTagInFile(theTag, MetaDataIOFactory.TAG_ID3V2);

// Reads them
theFile.ReadFromFile(null, true);

foreach (ChapterInfo chap in theFile.ID3v2.Chapters)
{
    System.Console.WriteLine(chap.Title + "(" + chap.StartTime + ")");
}

答案 1 :(得分:0)

如果您找不到可以为您执行此操作的库,您可以自己完成。首先,定义一些封装ID3标签的章节相关元数据/帧的对象:

public class ChapterFrame : Frame
{
    private Header Header { get; set; }
    private string ElementId { get; set; }
    private TimeSpan StartTime { get; set; }
    private TimeSpan EndTime { get; set; }
    private TimeSpan StartOffset { get; set; }
    private TimeSpan EndOffset { get; set; }
    private List<ChapterFrame> Subframes = new List<ChapterFrame>();
}

然后编写一些方法(类似于ChapterFrame.ToByteArray()):

public byte[] ToByteArray(ChapterFrame frame) {
    return new byte[]; 
}

...接受每个ChapterFrame的字段并将它们展平为一个序列化的字节数组,符合ID3 v2.3 / 2.4章节框架附录标准:

from "ID3v2 Chapter Frame Addendum", C. Newell, 2 December 2005

现在您已经有了一个新框架,您可以浏览ID3标签以找出插入新框架的位置。

请注意,我绝对不是专家 - 这只是猜测。