iOS。使用 USB 麦克风以 96kHz 录制

标签 ios objective-c iphone avfoundation core-audio

我正在尝试使用我的 RØDE iXY USB 麦克风以全 96kHz 的频率进行录音。
录音没有错误,当我在连接麦克风的情况下启动应用程序时,我看到 AVAudioSession 以 96kHz 采样率成功运行。
但是如果我看一下频谱,很明显除了 20kHz 以上的重新采样噪声之外什么都没有: enter image description here

为了比较,这是使用与 USB 麦克风 (RØDE Rec) 捆绑的应用程序进行的相同录音的频谱: enter image description here

要以原始 96kHz 录制,我还必须做些什么吗? 或者也许 RØDE Rec 应用程序通过 USB 使用一些专有协议(protocol)与麦克风通信,我在这里运气不好?

我包含了我使用的源代码:

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
}

最佳答案

在插入麦克风的情况下检查硬件采样率 Audio Session 属性。同时检查所有音频单元函数错误返回值。

RemoteIO 可能正在使用较低的输入采样率,然后重新采样为 96k 流。

关于iOS。使用 USB 麦克风以 96kHz 录制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376673/

相关文章:

ios - API 和数据存储 - 微软/服务器

php - 发布数据以从 IOS 中的 SQL 查询检索信息

c++ - 方法调用中的静态变量

iOS Sprite Kit 通过元素移动进行碰撞

iphone - 如何更新 iOS 应用程序(文件除外)

ios - self.navigationController 始终为零

iOS - 下载文件时的渐进式下载指示器

ios - sizeWithAttributes 不生效

ios - 如何让 UIAnimation 一次执行一个(迭代 for 循环),而不是一次执行全部?

nsstring 的 IOS 发布和分配消息差异