我目前正在開發一個VoIP應用程序,並且我正在使用的一個庫要求我在輸入回調中發送幀。要求是我必須發送一個樣本計數,它被定義爲一個幀中的樣本數量。這個回調將在麥克風接收新樣本時被調用。VoIP限制rendercallback中的幀數
有效數字是(採樣率)*(音頻長度)/ 1000。音頻長度可以是2.5,5,10,20,40或60毫秒。
在使用kAudioUnitProperty_MaximumFramesPerSlice將我的inNumberFrames限制爲960之前,它在NumberFrames中一直引入1115左右。所以我決定通過設置該屬性來限制它。但是,當我這樣做時,它將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;
}
你試圖限制幀數的原因是什麼?使用循環緩衝區可以更好地解決大多數這些問題。看看這個[問題](http://stackoverflow.com/questions/30691684/whats-the-reason-of-using-circular-buffer-in-ios-audio-calling-app/30698791#30698791)。 – dave234
我想看看是否可以避免循環緩衝區的情況。我已經在使用一個接收音頻了,因爲在播放音頻時需要使用它。 – cvu
爲什麼要避免循環緩衝區?他們很便宜,並解決你的問題。 – dave234