我应该使用线程编程来混合 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 个音频流吗?的主要内容,如果未能解决你的问题,请参考以下文章