与Ogg Vorbis合作

时间:2011-11-16 14:00:53

标签: c# .net audio ogg

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

  1. 将文件的一部分从一个位置切割到另一个位置
  2. 将另一个文件与现有文件合并
  3. 如何在C#中实现这两项操作?

2 个答案:

答案 0 :(得分:5)

我会查看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定义的。这里的另一个问题是,如果不重新编码,就不能简单地在数据包的中间进行拆分。

答案 1 :(得分:5)

您可以使用libzplay http://libzplay.sourceforge.net/执行此操作 要做的事情需要做的步骤:

  1. 的OpenFile
  2. SetWaveOutFile(这支持.ogg导出以及其他 格式)
  3. StartPlayback
  4. StopPlayback(需要时间)
  5. 链接网站上的所有内容都有很好的文档记录,包括c# 这个答案适用于花费数小时搜索并且之前答案没有帮助的所有其他人。这对于这个问题来说不是一个非常有效的解决方案,但是在搜索这个问题的过程中出现了很多次,这可能对其他人有所帮助。 :)