我应该使用线程编程来混合 2 个音频流吗?

Posted

技术标签:

【中文标题】我应该使用线程编程来混合 2 个音频流吗?【英文标题】:Should I use threading programming for mixing 2 audio stream? 【发布时间】:2011-06-24 12:15:16 【问题描述】:

我想编写一个程序,从麦克风捕获音频流,同时将此流与正在播放的音频文件混合。

我正在寻找库、api 等......但我关心的是实现,我应该使用线程编程吗?我还不知道怎么用线程。

操作系统是windows,语言是c++或者python。

谢谢

【问题讨论】:

考虑使用 OpenAL 或 SDL。两者都应该能够做你想做的事。他们都使用线程,但你不必在你的层。 【参考方案1】:

我认为您将需要某种线程,以使捕获和回放顺利并行运行。

请注意,Python 中的多线程受到GIL 的限制。在 C++ 中,您可以使用 Boost.Thread 之类的内容。

一般来说,正确使用多线程很难,您应该花时间熟悉它。您最好的选择可能是寻找一本好书。

【讨论】:

【参考方案2】:

py2.6 还带有基于处理的线程,因此您不必只做绿色线程

【讨论】:

【参考方案3】:

您可以使用SDL mixer。它启动一个线程,所以你不必这样做。 有很好的教程和参考页面。

【讨论】:

【参考方案4】:

您可以查看使用 portmixer 的 audacity source AudioIO.cpp(也值得一看)。

您可以在 portmixer 中查看如何在 windows 中启动音频 io 流。网上也有很多不错的教程,比如this one。

虽然 Windows Wave API 会为您启动音频线程,但最佳做法是让另一个线程读取/解析/解码您想要混合的音频文件并填充音频线程回调可访问的缓冲区。 Portaudio/SDL/Open AL 只是 windows 声音主机 (MME/Direct Sound) 之上的一层,因此如果您使用其中之一,这仍然是正确的。

但是如果你真的很懒或者只是想要一个快速的概念证明,可以在主线程中从音频文件中填充缓冲区。

关于麦克风输入,当您指定流详细信息时,您可以说出您想要的设备输入,这些输入作为整数/浮点数组提供给您,您可以将其直接发送到输出数组。在您的情况下,您想混合(添加)音频文件。

【讨论】:

以上是关于我应该使用线程编程来混合 2 个音频流吗?的主要内容,如果未能解决你的问题,请参考以下文章

Linux 多线程编程 实例 2

Java并发编程-如何终止线程

函数中的四个线程

java并发编程--一道经典多线程题的2种解法

Java 并发编程一文读懂线程协程守护线程

Java常见编程错误:线程池