VoIP限制rendercallback中的帧数

时间:2015-06-16 04:29:07

标签: ios objective-c audio core-audio audiounit

我目前正在开发一个VoIP应用程序,我正在使用的其中一个库要求我在输入回调中发送帧。要求是我必须发送一个样本计数,该计数被定义为一个帧中的样本数。只要麦克风接收新样本,就会调用此回调。

有效数字是(采样率)*(音频长度)/ 1000.其中音频长度可以是2.5,5,10,20,40或60毫秒。

在使用kAudioUnitProperty_MaximumFramesPerSlice将我的inNumberFrames限制为960之前,它一直在1115 inNumberFrames中引入。所以我决定通过设置该属性来限制它。但是,当我这样做时,它会将inNumberFrames数减少到512 ???我是以错误的方式处理这个问题吗?

static OSStatus inputRenderCallBack(void *inRefCon,
                                    AudioUnitRenderActionFlags  *ioActionFlags,
                                    const AudioTimeStamp    *inTimeStamp,
                                    UInt32 inBusNumber,
                                    UInt32 inNumberFrames, //512
                                    AudioBufferList *ioData)
{
    AudioBufferList bufferList;
    bufferList.mNumberBuffers = 1;
    bufferList.mBuffers[0].mNumberChannels = kNumberOfChannels;
    bufferList.mBuffers[0].mData = NULL;
    bufferList.mBuffers[0].mDataByteSize = inNumberFrames * sizeof(SInt16) * kNumberOfChannels;

    OCTAudioEngine *engine = (__bridge OCTAudioEngine *)(inRefCon);
    OSStatus status = AudioUnitRender(engine.ioUnit,
                                       ioActionFlags,
                                       inTimeStamp,
                                       inBusNumber,
                                       inNumberFrames,
                                       &bufferList);
    NSError *error;
    [engine.toxav sendAudioFrame:bufferList.mBuffers[0].mData
                     sampleCount:kSampleCount //960
                        channels:kNumberOfChannels //2
                      sampleRate:[engine currentAudioSampleRate] //24000
                        toFriend:engine.friendNumber
                           error:&error];

    return status;
}

1 个答案:

答案 0 :(得分:1)

您可以(并且应该)使用kAudioUnitProperty_MaximumFramesPerSlice来指定每帧的最大样本数,而不是首选数字;请参阅Apple的技术问答QA1533QA1606。要设置每帧的首选样本数,请使用setPreferredIOBufferDuration:error:的{​​{1}}方法。例如,如果采样率为32,000,则可以使用:

AVAudioSession

将帧长度设置为256,因为32,000 * 0.008 = 256。

但请注意,NSError *error = nil; NSTimeInterval bufferDuration = 0.008; [session setPreferredIOBufferDuration:bufferDuration error:&error]; 方法设置首选号码,而不是完全号码。您可以建议操作系统的帧长度,但有时,由于硬件限制,您可能无法获得您想要的内容,而是接近它的内容。