【问题标题】:How to cut, edit and merge OGG files in C#?如何在 C# 中剪切、编辑和合并 OGG 文件?
【发布时间】:2011-11-16 14:00:52
【问题描述】:

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

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

如何在 C# 中进行这两个操作?

【问题讨论】:

  • 我尝试阅读 Xiph.org 官方文档,但没有找到任何有用的方法。
  • “合并”是什么意思?简单串联?
  • 是的,我只想将新文件附加到现有文件中

标签: c# .net audio ogg


【解决方案1】:

您可以使用 libzplay http://libzplay.sourceforge.net/ 做到这一点 执行所询问的操作所需的步骤:

  1. 打开文件
  2. 寻找
  3. SetWaveOutFile(这支持.ogg导出以及其他 格式)
  4. 开始播放
  5. 停止播放(在需要的时候)

链接站点上的所有内容都非常详细地记录了多种语言,包括 c#。
这个答案适用于所有其他花费数小时搜索并且没有得到先前答案帮助的人。这不是这里问题的非常有效的解决方案,但是在搜索这个问题时出现了很多次,这可能对其他人有帮助。 :)

【讨论】:

  • 上帝保佑你 ntw1103。这正是我所需要的。我不知道当我花了大约一周的时间在谷歌上搜索 .NET 和 ogg vorbis 时,它怎么没有出现。
  • 许可证 (GNU GPL) 如何影响分发和销售?
【解决方案2】:

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

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

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

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

您可能需要使用解码 API 逐包读取输入文件,然后逐包写入组合数据。可能在两者之间替换流 ID 和 granulepos。

StreamID 是一个整数,用于标识 ogg 文件中的子流。要附加多个此类子流,您只需确保它们具有不同的 ID,然后写入数据。

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

【讨论】:

猜你喜欢
  • 2014-01-19
  • 1970-01-01
  • 2016-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 2012-10-20
  • 2015-06-21
相关资源
最近更新 更多