4

そのため、AudioUnit が iOS のマイク/ライン入力からデータを取り込む際に問題が発生しています。大丈夫だと思うものまですべてを設定でき、recordingCallback を呼び出していますが、バッファから取得しているデータは正しくありません。常にまったく同じものを返します。これは、ほとんどゼロとランダムな大きな数字です。誰がこれを引き起こしているのか知っていますか。私のコードは次のとおりです。

オーディオユニットのセットアップ

OSStatus status;

// Describe audio component
AudioComponentDescription desc;
desc.componentType = kAudioUnitType_Output;
desc.componentSubType = kAudioUnitSubType_RemoteIO;
desc.componentFlags = 0;
desc.componentFlagsMask = 0;
desc.componentManufacturer = kAudioUnitManufacturer_Apple;

// Get component
AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
status = AudioComponentInstanceNew(inputComponent, &audioUnit);

// Enable IO for recording
UInt32 flag = 1;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_EnableIO, 
                              kAudioUnitScope_Input, 
                              kInputBusNumber,
                              &flag, 
                              sizeof(flag));
// Disable playback IO
flag = 0;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_EnableIO, 
                              kAudioUnitScope_Output, 
                              kOutputBusNumber,
                              &flag, 
                              sizeof(flag));

// Describe format
AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate         = 44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagsNativeFloatPacked |kAudioFormatFlagIsNonInterleaved;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 32;
audioFormat.mBytesPerPacket     = 4;
audioFormat.mBytesPerFrame      = 4;

// Apply format
status = AudioUnitSetProperty(audioUnit, 
                              kAudioUnitProperty_StreamFormat, 
                              kAudioUnitScope_Output, 
                              kInputBusNumber, 
                              &audioFormat, 
                              sizeof(audioFormat));

// Set input callback
AURenderCallbackStruct callbackStruct;
callbackStruct.inputProc = recordingCallback;
callbackStruct.inputProcRefCon = (__bridge void*)self;
status = AudioUnitSetProperty(audioUnit, 
                              kAudioOutputUnitProperty_SetInputCallback, 
                              kAudioUnitScope_Global, 
                              kInputBusNumber, 
                              &callbackStruct, 
                              sizeof(callbackStruct));
status = AudioUnitInitialize(audioUnit);

入力コールバック

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

    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0].mDataByteSize = 4;
    bufferList.mBuffers[0].mNumberChannels = 1;
    bufferList.mBuffers[0].mData = malloc(sizeof(float)*inNumberFrames); //
    InputAudio *input = (__bridge InputAudio*)inRefCon;

    OSStatus status;

    status = AudioUnitRender([input audioUnit], 
                             ioActionFlags, 
                             inTimeStamp, 
                             inBusNumber, 
                             inNumberFrames, 
                             &bufferList);

    float* result = (float*)&bufferList.mBuffers[0].mData;

    if (input->counter == 5) {
        for (int i = 0;i<inNumberFrames;i++) {
            printf("%f ",result[i]);
        }
    }
    input->counter++;
    return noErr;
}

誰もが同様の問題に遭遇したり、私のコードで明らかに間違っていることを見たりします。助けてくれてありがとう!

私はそれをすべてMichael Tysons Core Audio RemoteIOコードに基づいています

4

2 に答える 2

2

私の記憶が正しければ、コールバックでオーディオ バッファから取得するサンプルはフロートではなく、SInt16 です。次のようにサンプルをキャストしてみてください。

SInt16 *sn16AudioData= (SInt16 *)(bufferList.mBuffers[0].mData);

そして、これらは最大値と最小値でなければなりません:

#define sn16_MAX_SAMPLE_VALUE 32767
#define sn16_MIN_SAMPLE_VALUE -32768
于 2012-06-26T21:25:06.983 に答える
0

私は基本的に、非常によく似たコードで同じことをしようとしていましたが、AudioGraph(). 同じ問題があり、マイクからの出力データにゼロがあり、行を追加するまで機能しませんでした

Status = AUGraphConnectNodeInput(graph, ioNode, 1, ioNode, 0);

グラフを使用していないため、 n を指定して呼び出し、完全な AudioUnitConnection 構造体を渡して渡す必要がありAudioUnitSetProperty()ますkAudioUnitProperty_MakeConnectio

于 2012-06-29T16:23:21.443 に答える