我目前正在开发一个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;
}
答案 0 :(得分:1)
您可以(并且应该)使用kAudioUnitProperty_MaximumFramesPerSlice
来指定每帧的最大样本数,而不是首选数字;请参阅Apple的技术问答QA1533和QA1606。要设置每帧的首选样本数,请使用setPreferredIOBufferDuration:error:
的{{1}}方法。例如,如果采样率为32,000,则可以使用:
AVAudioSession
将帧长度设置为256,因为32,000 * 0.008 = 256。
但请注意,NSError *error = nil;
NSTimeInterval bufferDuration = 0.008;
[session setPreferredIOBufferDuration:bufferDuration error:&error];
方法设置首选号码,而不是完全号码。您可以建议操作系统的帧长度,但有时,由于硬件限制,您可能无法获得您想要的内容,而是接近它的内容。