RØDEiXY USBマイクで96kHzで録音しようとしています。
録音がエラーなく行われ、マイクを接続してアプリを起動すると、AVAudioSession
が96kHzのサンプリングレートで正常に動作していることがわかります。
しかし、私は、スペクトルを見れば、20kHzの上記リサンプリングノイズが、何もないことは明らかである: USBマイクで96kHzで録音する
比較のために、これはUSBマイク(RØDEREC)にバンドルされてアプリを使用して、同じ記録のスペクトルであります:
ネイティブ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
}
audioUnitのストリームフォーマットを設定しますか?それを設定した後にログフォーマットを取得しようとしましたか? – lixing123
すでにkAudioUnitProperty_StreamFormatを96k audioDescriptionに設定しました。 kAudioUnitScope_Inputに設定してみましたが、何の効果もありませんでした。ストリーム形式を取得すると、私はそれに渡ったものを返します。つまり、シミュレータ(これは最大48kHzまでしかサポートしません)で96kHzを返します。 –
AFAIK、Rode iXYは、録音時にCoreAudioをバイパスする独自のフォーマットを使用しています。 – user3078414