音频流处理

你们好。
目前小弟要作一个语音通话的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);
相关文章
相关标签/搜索