【问题标题】:Is there any high level Audio Queue Record Service Library for iOS?是否有适用于 iOS 的高级音频队列记录服务库?
【发布时间】:2012-11-05 20:52:43
【问题描述】:

我正在尝试开发一个关于 VOIP 的应用程序,

是否有适用于 iOS 的高级音频队列服务库?

因为我不太擅长处理扩展文件名“.mm”,

使用开源会是更好的选择。

或者有人可以给我一些关于如何从 AudioQueueBufferRef 获取缓冲区的提示?

理想的方式就像一个委托:

- (void)audioRecorderDidReceivedBuffer:(Buffer) {
    do something for other operations
}

总览

  1. 识别音频组件(kAudioUnitType_Output/ kAudioUnitSubType_RemoteIO/ kAudioUnitManufacturerApple)
  2. 使用AudioComponentFindNext(NULL, &descriptionOfAudioComponent)获取AudioComponent,就像你使用的工厂 获取音频单元
  3. 使用 AudioComponentInstanceNew(ourComponent, &audioUnit) 创建音频单元的实例
  4. 启用 IO 以使用 AudioUnitSetProperty 进行录制和播放
  5. 在 AudioStreamBasicDescription 结构中描述音频格式,并使用 AudioUnitSetProperty 应用该格式
  6. 再次使用 AudioUnitSetProperty 为录制和可能的播放提供回调
  7. 分配一些缓冲区
  8. 初始化音频单元
  9. 启动音频单元
  10. 欢喜
// Enable IO for recording
UInt32 flag = 1;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_EnableIO, 
                              kAudioUnitScope_Input, 
                              kInputBus,
                              &flag, 
                              sizeof(flag));



// Set input callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = self;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_SetInputCallback, 
                              kAudioUnitScope_Global, 
                              kInputBus, 
                              &callbackStruct, 
                              sizeof(callbackStruct));



//recordingCallback
static OSStatus recordingCallback(void *inRefCon, 
                              AudioUnitRenderActionFlags *ioActionFlags, 
                              const AudioTimeStamp *inTimeStamp, 
                              UInt32 inBusNumber, 
                              UInt32 inNumberFrames, 
                              AudioBufferList *ioData) {

// TODO: Use inRefCon to access our interface object to do stuff
// Then, use inNumberFrames to figure out how much data is available, and make
// that much space available in buffers in an AudioBufferList.

AudioBufferList *bufferList; // <- Fill this up with buffers (you will want to malloc it, as it's a dynamic-length list)

// Then:
// Obtain recorded samples

OSStatus status;

status = AudioUnitRender([audioInterface audioUnit], 
                         ioActionFlags, 
                         inTimeStamp, 
                         inBusNumber, 
                         inNumberFrames, 
                         bufferList);
checkStatus(status);

// Now, we have the samples we just read sitting in buffers in bufferList
DoStuffWithTheRecordedAudio(bufferList);
return noErr;
}

【问题讨论】:

    标签: c++ objective-c ios xcode macos


    【解决方案1】:

    这里是如何从录音中获取音频缓冲区的方法

    (参考自:http://atastypixel.com/blog/using-remoteio-audio-unit/

    static OSStatus recordingCallback(void *inRefCon, 
                                      AudioUnitRenderActionFlags *ioActionFlags, 
                                      const AudioTimeStamp *inTimeStamp, 
                                      UInt32 inBusNumber, 
                                      UInt32 inNumberFrames, 
                                      AudioBufferList *ioData) {
    
        // TODO: Use inRefCon to access our interface object to do stuff
        // Then, use inNumberFrames to figure out how much data is available, and make
        // that much space available in buffers in an AudioBufferList.
    
        AudioBufferList *bufferList; // <- Fill this up with buffers (you will want to malloc it, as it's a dynamic-length list)
    
        // Then:
        // Obtain recorded samples
    
        OSStatus status;
    
        status = AudioUnitRender([audioInterface audioUnit], 
                                 ioActionFlags, 
                                 inTimeStamp, 
                                 inBusNumber, 
                                 inNumberFrames, 
                                 bufferList);
        checkStatus(status);
    
        // Now, we have the samples we just read sitting in buffers in bufferList
        DoStuffWithTheRecordedAudio(bufferList);
        return noErr;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      相关资源
      最近更新 更多