与Ogg Vorbis合作

我有一个ogg vorbis文件,我必须用它做两个操作:

  1. 将文件的一部分从一个位置切换到另一个位置
  2. 将另一个文件与现有文件合并

如何在C#中实现这两个操作?

我将查看libogg的c文档,并弄清楚如何使用c执行此操作。 然后使用libogg上的包装器在C#中编写几乎相同的代码。

我使用interop助手在libogg和libvorbis上创建了一个低级包装器: https : //github.com/CodesInChaos/Xiph/blob/master/LowLevel.cs

该项目还包含一些更高级别的结构,但我不认为它们对您正在做的事情有用。

顺便说一句,如果文件之间的流ID不同,您可以简单地将文件附加到另一个文件,创建一个按顺序播放两个流的有效文件。

您可能需要使用解码API以数据包方式读取输入文件,然后将数据组合输出。 可能会替换之间的流ID和granulepos。

StreamID是一个整数,用于标识ogg文件中的子流。 要附加多个这样的子流,您可以简单地确保它们具有不同的ID,然后写入数据。

拆分有点烦人,因为granulepos是编解码器相关的时间戳,我不记得它是如何为vorbis定义的。 这里的另一个问题是,如果不重新编码,您不能简单地在数据包中间拆分。

您可以使用libzplay执行此操作http://libzplay.sourceforge.net/执行以下操作所需的步骤:

  1. 打开文件
  2. 寻求
  3. SetWaveOutFile(这支持.ogg导出以及其他格式)
  4. StartPlayback
  5. StopPlayback(需要时间)

链接网站上的所有内容都有很好的文档记录,包括c#。
这个答案适用于花费数小时搜索并且之前答案没有帮助的所有其他人。 这不是解决这个问题的一个非常有效的解决方案,但是在搜索这个问题的过程中出现了很多次,这可能对其他人有所帮助。 🙂