iOS版.使用USB麦克风录制96kHz

前端之家收集整理的这篇文章主要介绍了iOS版.使用USB麦克风录制96kHz前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用我的RØDEiXYUSB麦克风以96kHz的速度录制.
录音没有错误,当我启动连接麦克风的应用程序时,我看到AVAudioSession以96kHz的采样率成功运行.
但是,如果我看一下光谱,很明显除了20kHz以上的重采样噪声之外什么都没有:

为了进行比较,这是使用与USB麦克风捆绑的应用程序(RØDERec)进行相同录制的频谱:

还有什么我必须做的,以原生96kHz录制?
或者也许RØDERec应用程序通过USB通过一些专有协议与麦克风通信,我在这里运气不好?

我包含了我使用的源代码

  1. static AudioStreamBasicDescription AudioDescription24BitStereo96000 = (AudioStreamBasicDescription) {
  2. .mFormatID = kAudioFormatLinearPCM,.mFormatFlags = kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger,.mChannelsPerFrame = 2,.mBytesPerPacket = 6,.mFramesPerPacket = 1,.mBytesPerFrame = 6,.mBitsPerChannel = 24,.mSampleRate = 96000.0
  3. };
  4.  
  5. - (void)setupAudioSession
  6. {
  7. AVAudioSession *session = [AVAudioSession sharedInstance];
  8. [session setCategory:AVAudioSessionCategoryRecord error:&error];
  9. [session setActive:YES error:&error];
  10. [session setPreferredSampleRate:96000.0f error:&error];
  11.  
  12. //I got my 96000Hz with the USB mic plugged in!
  13. NSLog(@"sampleRate = %lf",session.sampleRate);
  14. }
  15.  
  16. - (void)startRecording
  17. {
  18. AudioComponentDescription desc;
  19. desc.componentType = kAudioUnitType_Output;
  20. desc.componentSubType = kAudioUnitSubType_RemoteIO;
  21. desc.componentFlags = 0;
  22. desc.componentFlagsMask = 0;
  23. desc.componentManufacturer = kAudioUnitManufacturer_Apple;
  24.  
  25. AudioComponent inputComponent = AudioComponentFindNext(NULL,&desc);
  26. AudioComponentInstanceNew(inputComponent,&audioUnit);
  27.  
  28. AudioUnitScope inputBus = 1;
  29.  
  30. UInt32 flag = 1;
  31. AudioUnitSetProperty(audioUnit,kAudioOutputUnitProperty_EnableIO,kAudioUnitScope_Input,inputBus,&flag,sizeof(flag));
  32.  
  33. audioDescription = AudioDescription24BitStereo96000;
  34.  
  35. AudioUnitSetProperty(audioUnit,kAudioUnitProperty_StreamFormat,kAudioUnitScope_Output,&audioDescription,sizeof(audioDescription));
  36.  
  37. AURenderCallbackStruct callbackStruct;
  38. callbackStruct.inputProc = recordingCallback;
  39. callbackStruct.inputProcRefCon = (__bridge void *)(self);
  40. AudioUnitSetProperty(audioUnit,kAudioOutputUnitProperty_SetInputCallback,kAudioUnitScope_Global,&callbackStruct,sizeof(callbackStruct));
  41.  
  42. AudioOutputUnitStart(audioUnit);
  43. }
  44.  
  45. static OSStatus recordingCallback(void *inRefCon,AudioUnitRenderActionFlags *ioActionFlags,const AudioTimeStamp *inTimeStamp,UInt32 inBusNumber,UInt32 inNumberFrames,AudioBufferList *ioData)
  46. {
  47. AudioBuffer audioBuffer;
  48. audioBuffer.mNumberChannels = 1;
  49. audioBuffer.mDataByteSize = inNumberFrames * audioDescription.mBytesPerFrame;
  50. audioBuffer.mData = malloc( inNumberFrames * audioDescription.mBytesPerFrame );
  51.  
  52. // Put buffer in a AudioBufferList
  53. AudioBufferList bufferList;
  54. bufferList.mNumberBuffers = 1;
  55. bufferList.mBuffers[0] = audioBuffer;
  56.  
  57. AudioUnitRender(audioUnit,ioActionFlags,inTimeStamp,inBusNumber,inNumberFrames,&bufferList);
  58.  
  59. //I then take the samples and write them to WAV file
  60. }

解决方法

在插入麦克风的情况下检查硬件采样率音频会话属性.还要检查所有音频单元功能错误返回值.

RemoteIO可能使用较低的输入采样率,然后重新采样到96k流.

猜你在找的iOS相关文章