代码之家  ›  专栏  ›  技术社区  ›  Rogare

使用哪种方法实时读取音频样本

  •  0
  • Rogare  · 技术社区  · 8 年前

    对于特定项目,我需要:

    1. 从麦克风或音频文件访问单个音频样本,
    2. 每隔250毫秒左右从这些值中提取一个属性,然后
    3. 在屏幕上实时显示该属性(延迟100毫秒即可)。

    我研究了各种方法Audio Units、Audio Graphs、AVAudioEngine、AudioTapProcessor,但不确定哪一种方法适合仅针对iOS8和iOS9的Swift项目。这个 AudioTapProcessor 很适合从音频文件访问音频样本,但不确定麦克风输入或Swift支持。

    哪种方法最适合这些要求?谢谢你的阅读。

    更新:我选择了AVAudioEngine,到目前为止它非常适合。

    2 回复  |  直到 8 年前
        1
  •  1
  •   user3078414    8 年前

    我认为,一种极简主义的低级方法,具有单一的音频组件 k音频单元子类型_远程IO 在低延迟和 敏捷的 支持假设 界面 (为方便起见,在此命名) 我的音频控制器 已正确声明和初始化,以下代码 在…内 注册的 渲染回调 应该进行实时I/O映射 C ,尽管如此):

    myAudioController *myController = (myAudioController *)inRefCon;
    
    //this would render inNumberFrames of data from audio input...
    AudioUnitRender(myController->audioUnit,
                                ioActionFlags,
                                inTimeStamp,
                                bus1,
                                inNumberFrames,
                                ioData);
    
    //from here on, individual samples can be monitored and processed...                           
    AudioBuffer buffer = ioData->mBuffers[0]; 
    

    中的等效代码段 敏捷的 可能看起来像这样:

    let myController = UnsafeMutablePointer<myAudioController>(inRefCon).memory
    AudioUnitRender(myController.audioUnit, 
                                ioActionFlags, 
                                inTimeStamp, 
                                bus1, 
                                inNumberFrames, 
                                ioData)
    
    for buffer in UnsafeMutableAudioBufferListPointer(ioData) { ... }
    

    有关详细信息,请随时查阅苹果的参考页面-它有很好的文档记录: https://developer.apple.com/library/ios/documentation/AudioUnit/Reference/AUComponentServicesReference/#//apple_ref/c/func/AudioUnitRender

    这可能也是一个有价值的网站 C 必读课本中的例子 敏捷的 : https://github.com/AlesTsurko/LearningCoreAudioWithSwift2.0

    重要的是了解你在做什么。其他的一切都应该是不言而喻的,不应该涉及太多的工作。希望这能有所帮助

        2
  •  1
  •   jaybers    8 年前

    音频单元和图表将齐头并进。音频单元是组件,图形是将它们连接在一起的机制。使用单位和图形将为您提供最佳的实时(低延迟)性能和选项。我发现Objective C更适合核心音频,因为核心音频最初是一个api。

    我最近回答了一个关于环形缓冲区的问题,并使用了 this project 作为演示。该项目在从麦克风录制时播放音调,并允许您通过读取铃声中的最新样本进行处理。这可能是一个很好的起点。如果需要,您可以删除播放的音调。