音頻流處理

你們好。
目前小弟要作一個語音通話的app. 如今分析了sdk自帶的speakHere的demo.它裏面是使用AudioQueue實現先錄製成一個文件。而後再播放這個文件。沒有達到同時錄音和播放。
  我想達到的目的是同時錄音和播放。因而我修改demo以下。加入一個ringbuffer, 首先,我把錄音出來的數據寫入一個ringbuffer.如寫入10秒鐘數據後中止錄音,其次,啓動播放聲音的過程,它的回調函數voidAQPlayer::AQBufferCallback(void *inUserData,AudioQueueRef inAQ,AudioQueueBufferRef inCompleteAQBuffer)從ringbuffer裏面讀出數據。這種狀況是能夠播放的。可是一樣還不是同時錄音和播放。
上面的實驗只能說明我從ringbuffer中讀數據出來播放沒有問題;接下來我同時啓動錄音和播放的過程,這時候問題來啦。錄音的回調函數能夠正常寫數據到ringbuffer中。但是播放的回調函數只回調三次,大概讀了三秒數據以後就不回調啦。不知道爲何?奇怪的是,當我中止錄影以後,播放的回調函數開始工做啦。把ringbuffer中的數據一幀幀地播放完畢。難道不支持同時錄音和播放?
因而goolge了很久,發現也有人遇到這種狀況,但是都沒有解決方案。一些方法是這樣:UInt32 category = kAudioSessionCategory_PlayAndRecord

error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);
但是個人程序裏面已經有這句啦。就是不能同時播放。那一些通訊軟件是如何作的呢?如skype等等。請高人指點迷津。


zhangchao 2011-09-28 15:44
找到緣由啦。原來要這樣: UInt32 category = kAudioSessionCategory_PlayAndRecord;             error = AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(category), &category);         if (error) printf("couldn't set audio category!");                  UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;         AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (audioRouteOverride),&audioRouteOverride);
相關文章
相關標籤/搜索