2015-12-19 15 views
7

RØDEiXY USBマイクで96kHzで録音しようとしています。
録音がエラーなく行われ、マイクを接続してアプリを起動すると、AVAudioSessionが96kHzのサンプリングレートで正常に動作していることがわかります。
しかし、私は、スペクトルを見れば、20kHzの上記リサンプリングノイズが、何もないことは明らかである: enter image description hereUSBマイクで96kHzで録音する

比較のために、これはUSBマイク(RØDEREC)にバンドルされてアプリを使用して、同じ記録のスペクトルであります: enter image description here

ネイティブ96kHzで録音する必要がありますか? または、RØDERecアプリがUSB経由で独自のプロトコルでマイクと通信していて、ここで不運なのですか?

私は、私が使用したソースコードが含まれていました。

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 
} 
+0

audioUnitのストリームフォーマットを設定しますか?それを設定した後にログフォーマットを取得しようとしましたか? – lixing123

+0

すでにkAudioUnitProperty_StreamFormatを96k audioDescriptionに設定しました。 kAudioUnitScope_Inputに設定してみましたが、何の効果もありませんでした。ストリーム形式を取得すると、私はそれに渡ったものを返します。つまり、シミュレータ(これは最大48kHzまでしかサポートしません)で96kHzを返します。 –

+1

AFAIK、Rode iXYは、録音時にCoreAudioをバイパスする独自のフォーマットを使用しています。 – user3078414

答えて

2

はプラグインマイクとハードウェアのサンプルレートのオーディオセッションプロパティを確認してください。また、すべてのオーディオユニットの機能のエラーの戻り値を確認してください。

リモートIOは、より低い入力サンプルレートを使用し、次に96kストリームにリサンプリングすることができます。

関連する問題