私はVOIPについてのアプリケーションを開発しようとしています、
iOS用の高レベルのオーディオキューサービスライブラリはありますか?
拡張子ファイル名「.mm」の操作が苦手なので、
オープンソースを使用する方が良いオプションです。
または、誰かがAudioQueueBufferRefからバッファをフェッチする方法についていくつかのヒントを教えてくれますか?
理想的な方法は、代理人のようなものです。
- (void)audioRecorderDidReceivedBuffer:(Buffer) {
do something for other operations
}
更新RemoteIOオーディオユニットの使用 に関する記事を見つけました
多分入力コールバックは私が必要なものです。
Overvier
- オーディオコンポーネントを特定します(kAudioUnitType_Output / kAudioUnitSubType_RemoteIO / kAudioUnitManufacturerApple)
- AudioComponentFindNext(NULL、&descriptionOfAudioComponent)を使用して、AudioComponentを取得します。これは、AudioUnitを入手するファクトリのようなものです。
- AudioComponentInstanceNew(ourComponent、&audioUnit)を使用して、オーディオユニットのインスタンスを作成します
- AudioUnitSetPropertyを使用して、録音および場合によっては再生のためにIOを有効にします
- 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;
}