Swift 中的实时录音
Posted
技术标签:
【中文标题】Swift 中的实时录音【英文标题】:Real time audio recording in Swift 【发布时间】:2016-09-20 09:29:02 【问题描述】:我正在构建一个需要进行实时录音的应用程序。我在项目中使用 Swift - 所以无法使用 Novocaine 库(因为它有一些 Obj-C++ 代码)。
我需要的是获取可以处理或发送到我的 websocket 的一小段录音(实时)。有没有我可以使用的 Swift 库来实现这一点?
除了从麦克风获取实时音频外,我还需要显示实时波形。
开始录制 每隔几个字节的记录数据获取一个事件,我可以将这些字节发送到我的 websocket。 显示音频的波形。告诉我。
【问题讨论】:
我尝试过,但由于 class 关键字,无法包含 .h 文件。您对此有解决方案吗?提到的链接没有提供解决方案。 我之前确实检查过。您能否指出使用 AudioKit 进行实时录音的确切示例?谢谢! 【参考方案1】:您不需要任何 3 方工具即可从麦克风获取音频。它可以使用 AVAudioEngine 轻松设置。但是,为了尽量减少网络流量,我建议使用 lame 将原始 PCM 音频流压缩成 mp3。
Here 您可以找到具有最小功能的项目,用于获取麦克风输入和压缩成 mp3。在此示例项目中,mp3 存储到 Documents 文件夹中,因此您可以尝试并听以确保它可以正常工作。
从这里您可以获取 mp3 缓冲区并通过套接字发送。您还可以使用蹩脚的设置来改变质量等。
还有另一个名为no-lame
的分支,其中实现了相同的功能,但没有蹩脚的编码。 Look here
【讨论】:
我尝试运行您的代码,但最终出现了很多错误。我尝试使用 XCode 7.3 和 XCode 8。老实说,我现在不是在寻找压缩机制——只是想从麦克风中获取实时音频。你能给我剪断吗? 这很奇怪,因为我使用 Xcode 8 运行这个项目没有任何问题。请在此处发布您遇到的确切错误,以便我们进行调查。无论如何,如果您不需要压缩 - 在单独的分支中,您可能会发现没有压缩部分的相同项目:github.com/vlider/Mic-recording-minimal-example/tree/no-lame 谢谢,我终于可以让你的分支正常工作了。我得到一个工作 wav 文件。但是,当我将 AVAudioPCMBuffer 转换为 NSData 并使用套接字连接发送到我的服务器时 - 服务器没有得到工作的 wav 文件。这里有什么问题? 谢谢@ValeriiLider,你的 GitHub 项目对我帮助很大。只是给其他使用此功能的人的注意事项,不要忘记在 deinit 方法中调用 lame_close(lame),否则会导致内存泄漏。 @julien_c,我刚刚发现 AVAudioEngine API 比老式的方式更容易设置和使用以上是关于Swift 中的实时录音的主要内容,如果未能解决你的问题,请参考以下文章