您的位置:首页 > 移动开发 > IOS开发

由播放音频后不能录音的原因-学习AudioSession设置

2013-08-01 13:14 381 查看
在项目中先录音后播放,第一次正常,第二次就不能正常录音了,经查是在播放音频没有正确设置AVAudioSessionCategory

解决办法:

[[AVAudioSession
sharedInstance]
setCategory:
AVAudioSessionCategoryPlayAndRecord
error:NULL];

//sharedxxxx,通常是单例,即整个程序只有一个实例,如sharedApplication

下面是一些AudioSession中的一些概念

选择一个Category

AVAudioSessionCategoryAmbient
kAudioSessionCategory_AmbientSound
——用于非以语音为主的应用,使用这个category的应用会随着静音键和屏幕关闭而静音。并且不会中止其它应用播放声音,可以和其它自带应用如iPod,safari等同时播放声音。注意:该Category无法在后台播放声音

AVAudioSessionCategorySoloAmbient
kAudioSessionCategory_SoloAmbientSound
——类似于AVAudioSessionCategoryAmbient 不同之处在于它会中止其它应用播放声音。
这个category为默认category。该Category无法在后台播放声音

AVAudioSessionCategoryPlayback
kAudioSessionCategory_MediaPlayback
——用于以语音为主的应用,使用这个category的应用不会随着静音键和屏幕关闭而静音。

AVAudioSessionCategoryRecord
kAudioSessionCategory_RecordAudio———
用于需要录音的应用,设置该category后,除了来电铃声,闹钟或日历提醒之外的其它系统声音都不会被播放。该Category只提供单纯录音功能。

AVAudioSessionCategoryPlayAndRecord
kAudioSessionCategory_PlayAndRecord
——用于既需要播放声音又需要录音的应用,语音聊天应用(如微信)应该使用这个category。该Category提供录音和播放功能。

AVAudioSessionCategoryAudioProcessing
kAudioSessionCategory_AudioProcessing————
当需要进行离线语音处理时使用这个category,这里我也不太明白离线语音处理是什么概念,希望有知道的可以解释下。

注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。

Property

​kAudioSessionProperty_OverrideCategory​MixWithOthers 允许和其他app同时播放声音

​kAudioSessionProperty_OtherMixableAudio​ShouldDuck 允许和其他app同时播放声音,但会将其他app的声音变小

如果想实现既能在后台播放声音,又能随着静音键而静音的功能,可以这么做:

[html] view
plaincopy

setCategory(AVAudioSessionCategoryPlayBack);

playSound();

setCategory(AVAudioSessionCategoryAmbient);

设置Category

[cpp] view
plaincopy

<span style="font-size: 14px;">NSError *setCategoryError = nil;

BOOL success = [[AVAudioSession sharedInstance]

setCategory: AVAudioSessionCategoryAmbient

error: &setCategoryError];

if (!success) { /* handle the error in setCategoryError */ }</span>

切换到扬声器

按照苹果官方文档的说法,只有在category设置为AVAudioSessionCategoryPlayAndRecord时才能从扬声器播放声音,这一点我还未证实。

总之,按照官方文档的说法,先设置category为AVAudioSessionCategoryPlayAndRecord,然后通过重写audio route属性来重定向音频。

audio route属性有以下两个,一个是默认的听筒,另一个则是扬声器。

[cpp] view
plaincopy

enum {

kAudioSessionOverrideAudioRoute_None = 0,

kAudioSessionOverrideAudioRoute_Speaker = 'spkr'

};

Override audio route的方法有如下两种:

[cpp] view
plaincopy

UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty (

kAudioSessionProperty_OverrideAudioRoute

sizeof (audioRouteOverride),

&audioRouteOverride

);

[cpp] view
plaincopy

UInt32 doChangeDefaultRoute = 1;

AudioSessionSetProperty (

kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,

sizeof (doChangeDefaultRoute),

&doChangeDefaultRoute

);

这两种方法区别在于:

使用kAudioSessionProperty_OverrideAudioRoute时,当发生任何中断如插拔耳机时,audio route就会重置回听筒,你必须再设置一次。

使用kAudioSessionProperty_OverrideCategoryDefaultToSpeaker则除非你更改category,否则会一直生效。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐