2015-12-19 12 views
7

Sto provando a registrare a 96kHz con il mio microfono USB RØDE iXY.
La registrazione continua senza errori e quando avvio l'app con il microfono collegato, vedo che AVAudioSession è in esecuzione con una frequenza di campionamento di 96 kHz.
Ma se guardo lo spettro è chiaro che non v'è nulla, ma il rumore resample sopra 20kHz: enter image description hereiOS. Registrare a 96kHz con microfono USB

Per confronto questo è uno spettro della stessa registrazione utilizzando l'applicazione in bundle con il microfono USB (RØDE Rec) : enter image description here

C'è qualcos'altro che devo fare per registrare a 96kHz nativi? O forse l'app RØDE Rec comunica con il microfono con un protocollo proprietario via USB e sono sfortunato qui?

ho inserito il codice sorgente che uso:.

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

imposta il formato stream di audioUnità ha effetto? Hai provato a registrare il formato del flusso dopo averlo impostato? – lixing123

+0

Ho già impostato kAudioUnitProperty_StreamFormat sulla mia 96k audioDescription. Ho provato a impostarlo su kAudioUnitScope_Input, senza alcun effetto. Ottenere il formato del flusso restituisce ciò che ho passato in esso, cioè restituisce 96kHz sul simulatore (che supporta solo fino a 48kHz). –

+1

AFAIK, Rode iXY utilizza il proprio formato ignorando CoreAudio durante la registrazione, o così lo pubblicizzano, se ho capito bene. – user3078414

risposta

2

controllare la proprietà sessione audio frequenza di campionamento hardware con il microfono collegato Controllare anche tutti i valori di ritorno delle funzioni errore unità audio.

RemoteIO può utilizzare una frequenza di campionamento in ingresso inferiore e quindi ricampionare su un flusso a 96k.

Problemi correlati