2

一段时间后,使用音频单元进行开发,我知道有一些错误是开发人员所熟知的,他们使用低级别的音频缓冲区。

错误是mac上的缓冲区大小错误并显示 512 而不是 1024 ,其中 iDevice 上的相同软件显示 1024 。

问题是,有一种方法可以解决这个问题,这样我就可以在 mac 上也有 1024 位缓冲区?那样工作有点困难,因为模拟与设备不同。

这是我从麦克风输入检查缓冲区的回调函数:

static OSStatus recordingCallback(void *inRefCon,
                                  AudioUnitRenderActionFlags *ioActionFlags,
                                  const AudioTimeStamp *inTimeStamp,
                                  UInt32 inBusNumber,
                                  UInt32 inNumberFrames,
                                  AudioBufferList *ioData)
{

    AudioBuffer buffer;
    buffer.mNumberChannels = 1;
    buffer.mDataByteSize = inNumberFrames * 2;  
    buffer.mData = NULL; 

    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0] = buffer;
    OSStatus status;
    status = AudioUnitRender(audioUnit,
                             ioActionFlags,
                             inTimeStamp,
                             inBusNumber,
                             inNumberFrames,
                             &bufferList);


     int16_t *q = (int16_t *)(&bufferList)->mBuffers[0].mData;


//  inNumberFrames, is 512 on a mac ,and 1024 on a device 

(顺便说一下,扬声器输出回调是相同的=512 位)。

音频单元设置的一部分:

AudioStreamBasicDescription audioFormat;
audioFormat.mSampleRate         = 44100.00;//44100.00;
audioFormat.mFormatID           = kAudioFormatLinearPCM;
audioFormat.mFormatFlags        = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
audioFormat.mFramesPerPacket    = 1;
audioFormat.mChannelsPerFrame   = 1;
audioFormat.mBitsPerChannel     = 16;
audioFormat.mBytesPerPacket     = 2;
audioFormat.mBytesPerFrame      = 2;

好吧,我在这里发现有人说你必须在 mac(视网膜是我的)上设置 midi 工具中的采样率,我检查了一下,但它的 44100 在那里。香奈儿是 24 位的,我尝试使用 16 位但没有好的结果。我的 Mac 上的缓冲区大小仍然为 512 位。我有一个 mac 视网膜显示器 2012。

4

1 回答 1

2

有几点需要考虑:1) 音频单元的缓冲区大小由主机设置 2) 您可以通过覆盖 AUBase::SetMaxFramesPerSlice(nFrames) 来设置最大缓冲区边 3) 没有函数可以设置最小缓冲区大小。

话虽如此,您可以通过覆盖 AUBase 类中越来越多的函数来自定义您认为合适的代码。据我所知,没有办法设置最小缓冲区大小。您可以做的是将帧存储到缓冲区中,直到达到您想要的数量,然后发送帧。就像延迟效果上的循环缓冲区一样。

你想要一定数量的帧有什么原因吗?

于 2013-09-27T07:24:13.363 回答