我正在尝试开发一个关于VOIP的应用程序,
是否有适用于iOS的高级音频队列服务库?
因为我不擅长处理扩展文件名" .mm",
使用开源是一个更好的选择。
或有人可以给我一些关于如何从AudioQueueBufferRef获取缓冲区的提示?
理想的方式就像代表一样:
- (void)audioRecorderDidReceivedBuffer:(Buffer) {
do something for other operations
}
更新 我发现了一篇关于Using RemoteIO audio unit
的文章也许输入回调就是我需要的。
Overvier
- 识别音频组件(kAudioUnitType_Output / kAudioUnitSubType_RemoteIO / kAudioUnitManufacturerApple)
- 使用AudioComponentFindNext(NULL,& descriptionOfAudioComponent)获取AudioComponent,就像您与之工厂一样 获取音频单元
- 使用AudioComponentInstanceNew(ourComponent,& audioUnit)制作音频单元的实例
- 启用IO进行录制,并可能使用AudioUnitSetProperty
进行播放- 描述AudioStreamBasicDescription结构中的音频格式,并使用AudioUnitSetProperty
应用格式- 使用AudioUnitSetProperty
再次提供录制和可能播放的回调- 分配一些缓冲区
- 初始化音频设备
- 启动音频设备
- 飘柔
醇>
// 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;
}
答案 0 :(得分: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;
}