2015-06-16 21 views
1

我目前正在開發一個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; 
} 
+1

你試圖限制幀數的原因是什麼?使用循環緩衝區可以更好地解決大多數這些問題。看看這個[問題](http://stackoverflow.com/questions/30691684/whats-the-reason-of-using-circular-buffer-in-ios-audio-calling-app/30698791#30698791)。 – dave234

+0

我想看看是否可以避免循環緩衝區的情況。我已經在使用一個接收音頻了,因爲在播放音頻時需要使用它。 – cvu

+0

爲什麼要避免循環緩衝區?他們很便宜,並解決你的問題。 – dave234

回答

1

你可以(也應該)使用kAudioUnitProperty_MaximumFramesPerSlice指定最大數每幀的樣本,而不是優選號碼;請參閱Apple的技術Q & A QA1533QA1606。要設置每幀的首選採樣數,請使用AVAudioSessionsetPreferredIOBufferDuration:error:方法。例如,如果採樣率32000,您可以使用:

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

到您的長度可設置爲256,因爲32000 * 0.008 = 256

但是請注意,該setPreferredIOBufferDuration:error:方法設置首選號碼,而不是確切號碼。您可以向操作系統建議一個幀長度,但有時由於硬件限制,您可能無法完全達到您想要的效果,而是會接近它。