iPhone上面有两种播放外音的模式:听筒模式和话筒模式,听筒当然是打电话时用的,那个声音当然很小了,

但是开放中,ios默认的就是这种模式,所以在播放外应的时候要加代码重新设置下,如下:
     AVAudioPlayer * audioPlayer1 = [[AVAudioPlayer alloc]initWithContentsOfURL:soundUrl error:nil];

audioPlayer1.volume = 1.0;

[audioPlayer1 prepareToPlay];

UInt32 audioRoute = kAudioSessionOverrideAudioRoute_Speaker;

AudioSessionSetProperty(kAudioSessionProperty_OverrideAudioRoute, sizeof(audioRoute), &audioRoute);//这两行代码就是设置为话筒模式的

[audioPlayer1 play];

在转一个详细的:http://blog.csdn.net/xy5811/article/details/8563137

选择一个Category

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

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

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

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

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

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

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

设置Category

  1. <span style="font-size:14px;">NSError *setCategoryError = nil;
  2. BOOL success = [[AVAudioSession sharedInstance]
  3. setCategory: AVAudioSessionCategoryAmbient
  4. error: &setCategoryError];
  5. if (!success) { /* handle the error in setCategoryError */ }</span>

 

切换到扬声器

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

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

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

  1. enum {
  2. kAudioSessionOverrideAudioRoute_None    = 0,
  3. kAudioSessionOverrideAudioRoute_Speaker = 'spkr'
  4. };

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

  1. UInt32 audioRouteOverride = kAudioSessionOverrideAudioRoute_Speaker;
  2. AudioSessionSetProperty (
  3. kAudioSessionProperty_OverrideAudioRoute
  4. sizeof (audioRouteOverride),
  5. &audioRouteOverride
  6. );
  1. UInt32 doChangeDefaultRoute = 1;
  2. AudioSessionSetProperty (
  3. kAudioSessionProperty_OverrideCategoryDefaultToSpeaker,
  4. sizeof (doChangeDefaultRoute),
  5. &doChangeDefaultRoute
  6. );

这两种方法区别在于:

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

使用kAudioSessionProperty_OverrideCategoryDefaultToSpeaker则除非你更改category,否则会一直生效。

kAudioSessionProperty_AudioCategory 的设置的更多相关文章

  1. Linux命令总结大全,包含所有linux命令

    使用说明:此文档包含所有的Linux命令,只有你想不到的没有你看不到的,此文档共计10万余字,有8400多行,预计阅读时间差不多需要3个小时左右,所以要给大家说一说如何阅读此文档 为了方便大家阅读,我 ...

  2. IOS 关于扬声器和听话筒的设置 ----自己试验过的,可以达到扩音器和听筒播放的效果

    今下午项目中使用到了 扬声器和听筒的设置,我项目中是这样的,有一个聊天设置,聊天设置有一个使用扬声器 播放声音的设置. 这个设置是,当你打开那个开关的话,你在聊天中都可以根据你的使用来任意的播放声音, ...

  3. (iOS)确保设置话筒模式成功 AudioSessionSetProperty

    本人编写过一个应用,须要把实时音频播放出来,而且要从话筒播放声音,为此,作下面操作: //Step 1: 初始化 AudioSessionInitialize(NULL,NULL, NULL, sel ...

  4. 【.net 深呼吸】设置序列化中的最大数据量

    欢迎收看本期的<老周吹牛>节目,由于剧组严重缺钱,故本节目无视频无声音.好,先看下面一个类声明. [DataContract] public class DemoObject { [Dat ...

  5. LINUX篇,设置MYSQL远程访问实用版

    每次设置root和远程访问都容易出现问题, 总结了个通用方法, 关键在于实用 step1: # mysql -u root mysql mysql> Grant all privileges o ...

  6. Visual Studio Code 代理设置

    Visual Studio Code (简称 VS Code)是由微软研发的一款免费.开源的跨平台文本(代码)编辑器,在十多年的编程经历中,我使用过非常多的的代码编辑器(包括 IDE),例如 Fron ...

  7. myeclipse学习总结一(在MyEclipse中设置生成jsp页面时默认编码为utf-8编码)

    1.每次我们在MyEclispe中创建Jsp页面,生成的Jsp页面的默认编码是"ISO-8859-1".在这种情况下,当我们在页面中编写的内容存在中文的时候,就无法进行保存.如下图 ...

  8. Linux scp 设置nohup后台运行

    Linux scp 设置nohup后台运行 1.正常执行scp命令 2.输入ctrl + z 暂停任务 3.bg将其放入后台 4.disown -h 将这个作业忽略HUP信号 5.测试会话中断,任务继 ...

  9. 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置

    网站部署之~Windows Server | 本地部署 http://www.cnblogs.com/dunitian/p/4822808.html#iis DNS服务器部署不清楚的可以看上一篇:ht ...

随机推荐

  1. 【百度地图API】建立全国银行位置查询系统(二)——怎样为地图添加控件

    原文:[百度地图API]建立全国银行位置查询系统(二)--怎样为地图添加控件 <摘要>你将在第二章中学会以下知识: 使用手写代码的利器——notepad++: 如何为地图添加控件——鱼骨. ...

  2. 使用Vs2005打造简单分页浏览器(1)原创

    原文:使用Vs2005打造简单分页浏览器(1)原创 使用Vs2005打造简单分页浏览器(1)原创1引言2功能3实现过程以及关键点4总结5不足之处6其他7 代码下载 1    引言很早就有搞一个浏览器的 ...

  3. .net mvc mssql easyui treegrid

    效果图 数据图   可以看到 这里是根据 MenuNo 来 分级别的,支持 无限极,第一级是 01 ,第二级就是 01XX ,第三级 就是 01XXOO.类似 id.pid ,Ztree 里面 也是这 ...

  4. C#操作 Advantage Database Server 数据库

    相关下载 http://devzone.advantagedatabase.com/dz/content.aspx?key=31 1.安装数据库: Advantage Database Server ...

  5. IOS数组排序等

    一.UITextField的代理方法 #pragma mark 当文本框开始编辑的时候调用---开始聚焦 - (void)textFieldDidBeginEditing:(UITextField * ...

  6. 怎样使Android应用程序获得root权限

    Normal 0 7.8 磅 0 2 false false false MicrosoftInternetExplorer4 写这篇文章前,首先要感谢 Simon_fu ,他的两篇关于 root 权 ...

  7. 几个常用的CSS3样式代码以及不兼容的解决办法

    原文:几个常用的CSS3样式代码以及不兼容的解决办法 border-radius实现圆角效果 CSS3代码: -webkit-border-radius:10px; -moz-border-radiu ...

  8. javascirpt怎样模仿块级作用域(js高程笔记)

    因为javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包括函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i= ...

  9. 判断文件是否存在,不存在创建文件&&判断文件夹是否存在,不存在创建文件夹

    1.判断文件是否存在,不存在创建文件 File file=new File("C:\\Users\\QPING\\Desktop\\JavaScript\\2.htm"); if( ...

  10. 日积月累系列之分页控件(js源码)

    最近开发了一款分页控件,分享给大家. 主要功能和界面介绍 cform分页控件支持服务端分页.客户端分页.数据过滤.数据排序等功能. 源码介绍 cform-pager分页控件主要由三部分组成:css.s ...