我有一个 ogg vorbis 文件,我必须用它做两个操作:
- 将文件的一部分从一个位置剪切到另一个位置
- 将另一个文件与现有文件合并
如何在 C# 中执行这两个操作?
您可以使用 libzplay http://libzplay.sourceforge.net/执行此 操作。执行所要求的操作所需的步骤:
链接站点上的所有内容都非常详细地记录了多种语言,包括 c#。
这个答案适用于所有其他花费数小时搜索并且没有得到先前答案帮助的人。这不是解决问题的非常有效的方法,但是在搜索这个问题时出现了很多次,这可能对其他人有帮助。:)
我会查看 libogg 的 c 文档,并弄清楚如何使用 c 来执行此操作。然后使用 libogg 上的包装器在 C# 中编写几乎相同的代码。
我使用互操作助手在 libogg 和 libvorbis 上创建了一个低级包装器: https ://github.com/CodesInChaos/Xiph/blob/master/LowLevel.cs
该项目还包含一些更高级别的构造,但我认为它们对您正在做的事情没有用。
顺便说一句,如果文件之间的流 ID 不同,您可以简单地将一个文件附加到另一个文件,创建一个按顺序播放两个流的有效文件。
您可能需要使用解码 API 逐包读取输入文件,然后逐包写入组合数据。可能在两者之间替换流 ID 和颗粒。
StreamID 是一个整数,用于标识 ogg 文件中的子流。要附加多个这样的子流,您可以简单地确保它们具有不同的 ID,然后写入数据。
拆分有点烦人,因为 granulepos 是一个依赖于编解码器的时间戳,我不记得它是如何为 vorbis 定义的。这里的另一个问题是你不能简单地在一个数据包的中间拆分而不重新编码。