使用Aubio实时采样音频,无需停止录制音频和视频iPhone / iPad

时间:2016-07-25 02:23:12

标签: ios objective-c swift audio aubio

  • Swift 2.2
  • Xcode 7.3
  • Aubio 0.4.3(aubio-0.4.3~const.iosuniversal_framework)
  • iOS 9.3目标
  • 测试设备 - iPad Air
  • bufferSize:2048
  • numSamplesInBuffer:1024
  • 采样率:44100

注意事项:

  • 我故意在我即将发布的代码示例中留下了AVCaptureVideo代码,以便任何人更简单地阅读我的问题都不会忘记我尝试使用相同的录制AvCaptureSession捕获音频和视频并实时采样音频
  • 我已经对Aubio进行了全面测试 - > Onset,特别是sample.caf(核心音频格式)声音文件以及录音,使用AvAudioRecorder保存到文件(也是.caf),它可以在真实设备(iPad Air)上正常工作。 Aubio在测试中工作的一个非常重要的考虑因素是我使用new_aubio_source创建了一个基于URI或文件的样本。在我的真实"我试图在不将音频数据保存到文件的情况下对声音缓冲区进行采样。
  • 使用Aubio的可能替代方法。如果我可以开始将AudioBuffers存储为有效的核心音频格式(.caf)文件,Aubio会工作,不确定采样基于文件的解决方案是否足够快,但经过数天的研究后我还没想出如何存储{ {1}} CmSampleBufferRefs要归档。这包括使用NSData,它永远不会将有效的.caf存储到文件中。
  • 与之前的警告相关,我还没有找到一种方法来使用AvFoundation超级有用的对象,例如AVAudioRecorder(它会将一个很好的.caf存储到文件中),因为它取决于你停止录制/捕获会话。
  • 如果您删除所有视频捕获代码,您可以在模拟器上运行,请在下面评论,如果您希望您没有Apple设备,我将准备一个模拟器版本的代码。必须在实时设备上测试相机功能。

以下代码成功启动音频和视频AVCaptureSession,AVCaptureSession代理func captureOutput(captureOutput: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection)正在为音频和视频调用。当一个。提供音频CMSampleBufferRef示例我试图将该示例转换为AudioBuffer并传递给Aubio方法aubio_onset_do。我正在使用单例aubio_onset COpaquePointer。

在这段代码中,我尝试用两种不同的方式用音频缓冲区数据调用aubio_onset_do。

  1. 方法1 - 以下代码的当前方式是func captureOutput(captureOutput: AVCaptureOutput, didOutputSampleBuffer sampleBuffer: CMSampleBufferRef, fromConnection connection: AVCaptureConnection)。这意味着在我的let useTimerAndNSMutableData = false函数中,我将audioBuffer.mData传递给prepareAudioBuffer此方法永远不会失败,但也没有检测到任何启动,我怀疑因为样本量不够大
  2. 方法2 如果sampleAudioForOnsets我最近每隔1秒调用let useTimerAndNSMutableData = true,则允许有时间使用AudioBuffer.mDatas构建NSMutableData。使用这种方法,我试图给aubio_onset_do一个足够大的样本来检测onsets,使用一个计时器和NSMutableData这个方法导致aubio_onset_do很快崩溃:

      

    (EXC_BAD_ACCESS(code = 1))

    sampleAudioForOnsets

0 个答案:

没有答案