由播放音频后不能录音的原因-学习AudioSession设置
2013-08-01 13:14
381 查看
在项目中先录音后播放,第一次正常,第二次就不能正常录音了,经查是在播放音频没有正确设置AVAudioSessionCategory
解决办法:
[[AVAudioSession
sharedInstance]
setCategory:
AVAudioSessionCategoryPlayAndRecord
error:NULL];
//sharedxxxx,通常是单例,即整个程序只有一个实例,如sharedApplication
下面是一些AudioSession中的一些概念
选择一个Category
这个category为默认category。该Category无法在后台播放声音
注意:并不是一个应用只能使用一个category,程序应该根据实际需要来切换设置不同的category,举个例子,录音的时候,需要设置为AVAudioSessionCategoryRecord,当录音结束时,应根据程序需要更改category为为AVAudioSessionCategoryAmbient,AVAudioSessionCategorySoloAmbient或AVAudioSessionCategoryPlayback中的一种。
Property
kAudioSessionProperty_OverrideCategoryMixWithOthers 允许和其他app同时播放声音
kAudioSessionProperty_OtherMixableAudioShouldDuck 允许和其他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,否则会一直生效。
解决办法:
[[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_OverrideCategoryMixWithOthers 允许和其他app同时播放声音
kAudioSessionProperty_OtherMixableAudioShouldDuck 允许和其他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,否则会一直生效。
相关文章推荐
- 音频引擎IrrKlang学习笔记01:播放控制与音效设置
- AVAudioSession中 setCategory不正确导致不能正确录音或播放音频
- Domain=NSOSStatusErrorDomain Code=1937337955 关于iOS录音AVAudioRecorder与音频播放AVAudioPlayer真机调试录音不能播放的问题
- ffmpeg学习九:音频编码前奏-ubuntu下录音和播放
- 关于Sound Pool加载短小音频不能播放的原因
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- [DELPHI]idHTTP设置VContinue不能中断下载的原因
- 对于微信内置浏览器中不能小窗播放视频原因的分析以及解决
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- Android AlertDialog 设置setSingleChoiceItems不显示列表的原因【setMessage和setSingleChoiceItems不能同时使用】
- iOS 录音Wav 音频 转换 Amr ,Android 播放
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- 再次学习flash驱动——挖掘不能发现nand flash盘符的原因
- ios之使用录音功能和设置音效播放
- iOS从零开始学习直播之音频1.播放本地音频文件
- 接收一条音频(系统音频)彩信,点菜单键选择View slideshow,不能播放,提示是否导入vCard
- iOS音频播放 (二):AudioSession
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- WMP12拖放扩展名未关联文件不能播放的一种原因
- fedora 下音频系统设置整理(音频播放速度过快)