iOS. Record at 96kHz with USB microphone

♀尐吖头ヾ 提交于 2019-12-08 19:21:20

问题


I am trying to record at full 96kHz with my RØDE iXY USB microphone.
Recording goes without error and when I launch the app with the mic connected, I see that AVAudioSession is running successfully at 96kHz sample rate.
But if I look at the spectrum it is clear that there is nothing but resample noise above 20kHz:

For comparison this is a spectrum of the same recording using the app bundled with the USB mic (RØDE Rec):

Is there anything else I must do to record at native 96kHz? Or maybe the RØDE Rec app communicates with the mic with some proprietary protocol over USB and I'm out of luck here?

I included the source code that I use:

static AudioStreamBasicDescription AudioDescription24BitStereo96000 = (AudioStreamBasicDescription) {
    .mFormatID          = kAudioFormatLinearPCM,
    .mFormatFlags       = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger,
    .mChannelsPerFrame  = 2,
    .mBytesPerPacket    = 6,
    .mFramesPerPacket   = 1,
    .mBytesPerFrame     = 6,
    .mBitsPerChannel    = 24,
    .mSampleRate        = 96000.0
};

- (void)setupAudioSession
{
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryRecord error:&error];
    [session setActive:YES error:&error];
    [session setPreferredSampleRate:96000.0f error:&error];

    //I got my 96000Hz with the USB mic plugged in!
    NSLog(@"sampleRate = %lf", session.sampleRate);
}

- (void)startRecording
{
    AudioComponentDescription desc;
    desc.componentType = kAudioUnitType_Output;
    desc.componentSubType = kAudioUnitSubType_RemoteIO;
    desc.componentFlags = 0;
    desc.componentFlagsMask = 0;
    desc.componentManufacturer = kAudioUnitManufacturer_Apple;

    AudioComponent inputComponent = AudioComponentFindNext(NULL, &desc);
    AudioComponentInstanceNew(inputComponent, &audioUnit);

    AudioUnitScope inputBus = 1;

    UInt32 flag = 1;
    AudioUnitSetProperty(audioUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Input, inputBus, &flag, sizeof(flag));

    audioDescription = AudioDescription24BitStereo96000;

    AudioUnitSetProperty(audioUnit,
                         kAudioUnitProperty_StreamFormat,
                         kAudioUnitScope_Output,
                         inputBus,
                         &audioDescription,
                         sizeof(audioDescription));

    AURenderCallbackStruct callbackStruct;
    callbackStruct.inputProc = recordingCallback;
    callbackStruct.inputProcRefCon = (__bridge void *)(self);
    AudioUnitSetProperty(audioUnit,
                         kAudioOutputUnitProperty_SetInputCallback,
                         kAudioUnitScope_Global,
                         inputBus, &callbackStruct,
                         sizeof(callbackStruct));

    AudioOutputUnitStart(audioUnit);
}

static OSStatus recordingCallback(void *inRefCon,
                                  AudioUnitRenderActionFlags *ioActionFlags,
                                  const AudioTimeStamp *inTimeStamp,
                                  UInt32 inBusNumber,
                                  UInt32 inNumberFrames,
                                  AudioBufferList *ioData)
{
    AudioBuffer audioBuffer;
    audioBuffer.mNumberChannels = 1;
    audioBuffer.mDataByteSize = inNumberFrames * audioDescription.mBytesPerFrame;
    audioBuffer.mData = malloc( inNumberFrames * audioDescription.mBytesPerFrame );

    // Put buffer in a AudioBufferList
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = audioBuffer;

    AudioUnitRender(audioUnit, ioActionFlags, inTimeStamp, inBusNumber, inNumberFrames, &bufferList);

    //I then take the samples and write them to WAV file
}

回答1:


Check the hardware sample rate audio session property with your microphone plugged in. Also check all audio unit function error return values.

RemoteIO may be using a lower input sample rate and then resampling to a 96k stream.



来源:https://stackoverflow.com/questions/34376673/ios-record-at-96khz-with-usb-microphone

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!