2

我需要一些能让我的程序同时播放多个音频文件(.wav 和/或 .mp3)的东西。如果我可以简单地将文件路径传递给某个方法,那将是理想的,它会播放该文件,而我不必担心任何细节。

其他要求:

1)我需要能够随时以编程方式开始和停止播放任何音频文件。

2)我需要知道每个音频文件何时完成播放(通过响应事件或通过某些属性知道声音文件的持续时间(样本、秒等))

3) 此工具必须能够播放任何长度/持续时间的 .wav(最好是 .mp3)文件。

4)此工具必须能够同时播放多个音频文件(最好同时播放至少5或6个音频文件)。

我已经尝试过使用 SlimDX 和 SharpDX,但我找不到任何以编程方式确定文件何时停止播放或找到文件的持续时间(长度)的方法。

编辑:

我相信我找到了我要找的东西!GStreamer 似乎可以满足我的所有要求。http://www.gstreamer.com/

4

2 回答 2

1

所有音频 API 都将允许同时播放多个文件(混合在幕后进行,您无需担心)。

原生 API:

  • waveOut*函数族,用于解压的 ACM
  • DirectSound(播放)
  • DirectShow(解码、播放)
  • WASAPI(回放)
  • 媒体基金会

或者,将NAudio用于上述 C# 包装器。当您需要某些详细信息和代码片段时,您会在 StackOverflow 上找到许多关于 NAudio 的帖子。

于 2013-01-26T19:24:20.097 回答
1

这个问题的通用答案(适用于我如何在框架/语言 X 问题中一次播放多个样本的大多数问题)是软件将文件混合在一起。

这样做的好处是让您可以完全控制各个音频流何时开始和停止以及同步——这在使用更高级别的媒体播放器组件时通常非常困难。

这样做的步骤是:

  1. 将所有要输出的音频加载(和格式转换/解码)到内存缓冲区
  2. 对于在给定时刻播放的每个音频文件,通过将它们加在一起来混合每个文件中的相应样本。
  3. [并非总是必要] 调整所得样本的增益 - 通常这是除以混合样本的数量
  4. 将结果存储到另一个内存缓冲区

您现在已将问题简化为要输出的单个音频流。您很可能使用您选择的框架的音频输出 API,它会定期请求输出样本缓冲区。

如果您的音频流很大,问题会变得有点复杂,因为您需要一次处理一些输入流。

于 2013-01-26T19:28:19.053 回答