【问题标题】:Recording audio in an audio callback在音频回调中录制音频
【发布时间】:2013-04-23 00:26:06
【问题描述】:

我有一个音频回调,用于访问 bufferList 并分析音频。

我也需要录制这段音频。首先,在同一个回调中进行录音是否明智?

例如memcpy(void *dest, ioData->mBuffers[0].mData, int byteCount);

或者录音应该有自己的回调?

无论哪种方式,这个 memcpy 是正确的方法吗?我如何将这个音频写入文件?

音频输入完成并将数据传递给文件写入器后,是否应将 totalByteCount 与 void * dest 上的指针运算一起使用?

在核心音频渲染回调中录制音频的最佳方式是什么?

【问题讨论】:

  • 您的意思是要同时播放和录制吗?在这种情况下,有两个独立的回调。如果您想录制正在播放的内容 - 您可以安全地使用 ExtAudioFileWrite API 将音频缓冲区写入文件。
  • 研究了一下,发现了异步写入的方法。 :)

标签: ios core-audio


【解决方案1】:

我认为您可以为输入和输出音频流分别设置两个不同的回调。通常,当您打开特定流时,它可以是输入或输出,您也可以指定回调。在回调中,您可以完成所有音频处理,前提是您可以满足回调截止日期,否则您可能最终会丢失音频样本。更好的方法是使用某种循环缓冲区,它是您只需填充缓冲区的回调。您可以在主线程中进行所有其他处理(以及录制)。 我不确定您使用的是哪个音频框架。我在我的项目中使用了portaudio,它工作得很好。 Portaudio 还提供了一个无锁循环缓冲区,可以在回调内部使用,而无需线程锁定机制。 以下链接可能会对您有所帮助。

http://portaudio.com/docs/v19-doxydocs/paex__record_8c.html.

http://portaudio.com/docs/v19-doxydocs/paex_ocean_shore_8c.html

【讨论】:

  • 设法设置一个 ExtAudioFile 并从回调异步写入它,在输入停止后处理 ref。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-30
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多