ios - VoIP 限制 rendercallback 中的帧数

标签 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;
}

最佳答案

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

NSError *error = nil;
NSTimeInterval bufferDuration = 0.008;
[session setPreferredIOBufferDuration:bufferDuration error:&error];

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

但是请注意,setPreferredIOBufferDuration:error: 方法设置的是preferred 编号,而不是exact 编号。您可以向操作系统建议一个帧长度,但有时,由于硬件限制,您可能无法准确获得所需的长度,而是接近它的长度。

关于ios - VoIP 限制 rendercallback 中的帧数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30858814/

相关文章:

ios - Swift 2.0 fatal error : unexpectedly found nil while unwrapping an Optional value (lldb)

iphone - Xib 文件位于另一个 xib 中

java - 如何在 Java 中获取声音文件的总时间?

javascript - Javascript如何从CLI发出噪音

ios - 出现键盘时调整 UITextView 的大小

iphone - 使用 NSURLRequestReturnCacheDataDontLoad 时离线模式不起作用

android - 如何避免向已经使用过应用程序内订阅的用户提供免费试用?

ios - 即使应用程序关闭也运行时钟或计时器

objective-c - 如何以编程方式将 NSTableColumn 绑定(bind)到 NSArrayControllerarrangedObjects?

actionscript-3 - 如何在ActionScript中播放WAV?