监听耳机插拔设置语音播放重定向 & WebRTC & 音频播放路由初始化_Isaac143的博客-程序员宅基地

技术标签: iOS  

最近发现一种情况:当耳机插入的时候,如果启动使用音频设置播放路由模式为speaker的话不起作用。要监听耳机插拔,重新设置。

使用WebRTC音频功能,设置播放重定向的前提貌似是需要有语音在播放,所以在WebRTC设置时,收到有语音数据过来,然后设置播放路由(算是初始化)。然后在APP代码层做监听耳机插拔设置播放重定向解决由于耳机引起的一些问题。

//首先设置监听
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioRouteChangeListenerCallback:) name:AVAudioSessionRouteChangeNotification object:nil];


/**
 监听影响语音播放的状态变化
 @param isLoudSpeaker
 */
- (void)audioRouteChangeListenerCallback:(NSNotification*)notification
{
    NSDictionary *interuptionDict = notification.userInfo;
    NSInteger routeChangeReason = [[interuptionDict valueForKey:AVAudioSessionRouteChangeReasonKey] integerValue];
    switch (routeChangeReason) {
        case AVAudioSessionRouteChangeReasonNewDeviceAvailable:
//            NSLog(@"AVAudioSessionRouteChangeReasonNewDeviceAvailable");
            [self p_audioPropertySet:NO];
            NSLog(@"耳机插入");
            break;
        case AVAudioSessionRouteChangeReasonOldDeviceUnavailable:
//            NSLog(@"AVAudioSessionRouteChangeReasonOldDeviceUnavailable");
            NSLog(@"耳机拔出,停止播放操作");
            [self p_audioPropertySet:YES];
            break;
        case AVAudioSessionRouteChangeReasonCategoryChange:
            // called at start - also when other audio wants to play
            NSLog(@"AVAudioSessionRouteChangeReasonCategoryChange");
            break;
    }
}
- (void)p_audioPropertySet:(BOOL)isLoudSpeaker
{
    AVAudioSession *audioSession = [AVAudioSession sharedInstance];
    NSError *error = nil;

    if(isLoudSpeaker)
    {

        if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionMixWithOthers | AVAudioSessionCategoryOptionDefaultToSpeaker error:&error])
        {
            NSLog(@"AudioSession set mode error %@", error);
        }
        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:&error];
    }
    else
    {
        if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth | AVAudioSessionCategoryOptionAllowBluetoothA2DP | AVAudioSessionCategoryOptionMixWithOthers error:&error])
        {
            NSLog(@"AudioSession set mode error %@", error);
        }

        [audioSession overrideOutputAudioPort:AVAudioSessionPortOverrideNone error:&error];
    }

}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_36259863/article/details/77159710

智能推荐

关于在win10电脑开启移动热点,手机连上wifi显示无互联网连接的问题_电信布谷鸟的博客-程序员宅基地_手机连电脑热点显示无互联网连接

第一种方法∶你能够上网的设备没有和你开的热点进行共享,看看共享完的效果图这里要对你上网的「有线或者无线网络」进行共享,怎么看你是使用的什么网呢2就是你在用的的网络第二种情况,也是我之前的情况,看了无数的帖子,我也进行了第一种设置,仍然是显示无互联网连接。这种情况下,很有可能是你的设备网卡的驱动没有进行更新,更新完我的wifi也就可以用了刚刚更新的驱动,就能用了,感动!!总结一下1,没有共享2,没有更新驱动如果这篇分享帮助了你,可以赞我一下吗...

牛顿插值的简单matlab代码_暴杀汉堡的博客-程序员宅基地

备注:1.由于是敲实验报告自用,所以不能保证代码的通用性,具体问题还要具体分析2.这里只有函数文件,脚本文件还请读者自行建立function y=n1(x,y,n,x1)#参数说明,x为自变量矩阵,y为因变量矩阵,如x=[0.4,0.5,0.6,0.7,0.8];y=ln(x),y=[-0.916291,-0.693147,-0.510826,-0.356675,-0.223144];n为x矩阵的长度(这里是5),x1为预测值的自变量Y= zeros(n);b=zeros(n,1);% 差分表

Lidar based 3D object detection_Evil_Aaron的博客-程序员宅基地

M. Himmelsbach, A. M¨uller, T. L¨uttel and H.-J. W¨unsche. 2008摘要本文描述了基于激光雷达的感知地面机器人移动系统,包含了3D物体检测,分类和跟踪。 该系统被应用于我们的自动地面车辆MuCAR-3,使其能够安全地在城市交通以及野外场景种航行。 我们的方法的效率源于2D和3D数据处理技术的独特组合。 其中点云快速分割在2.5D网格...

以太网帧间隙_Anonymous2017的博客-程序员宅基地_最小帧间隔

以太网帧间隙1.什么是IFG? IFG(Interframe Gap),帧间距,以太网相邻两帧之间的时间断;以太网发送方式是一个帧一个帧发送的,帧与帧之间需要间隙,即帧间距IFG也可称其为IPG (Interpacket Gap)。IFG指的是一段时间,不是距离,单位通常用微秒(μs)或纳秒(ns)。如下图所示:2.为什么需要IFG?网络设备和组件在接收一个帧之后,需要一段短暂的时间来恢复并为接收下

性能压测与调优_CleverApe的博客-程序员宅基地_性能压测如何调优

性能压测是当服务上线前,或者之后重要需求发布流程中,需要做的必要测试;以模拟真实流量的方式,获取当前系统的性能指标、是否存着高并发隐患、瓶颈等信息的手段。性能压测处于什么位置?或者说什么时候去做呢?如何做?如何做好线上环境的性能压测、全链路压测,如何做到压测结果准确无误,不影响外部环境、不污染数据,需要深入思考。一、测试分类按照上线流程:单元测试 集成测试 ...

随便推点

Office365 - Outlook中account不显示status的解决方案_Kianteck的博客-程序员宅基地

在维护Office365过程中,遇到user report在使用Office365 outlook时候,email里面的user status没有显示,本文对如何解决此问题做介绍。

深入理解——字节、字符/字符串、Unicode 字符集_墨城之左的博客-程序员宅基地_字符串和字节串

1 字符编码1、字符内码:字符内码(charcter code)指的是用来代表字符的内码.读者在输入和存储文档时都要使用内码。ASCII 码(单字节内码): 能够支持256个字符编码.ANSI(双字节内码):能够支持65000个字符编码,中文简体编码 GB2312 实际上是 ANSI 的一个代码页,不同的代码页的内码无法再其他代码中正常显示,日中文/繁体中文/简体中文使用了不同的代码页...

php curl 保持 会话,使用Curl和PHP保持会话_weixin_39807896的博客-程序员宅基地

我尝试连接到api,验证用户,然后查看用户详细信息。这是通过首先访问登录端点来实现的http://api.example.com/login//登录,然后查看以下用户详细信息:http://api.example.com/user/这一切都在网络浏览器中工作。但是一旦我尝试使用Curl,登录工作正常,但是当尝试查看用户详细信息,我回来一个401,未经授权的错误。我相信这是因为Curl没有正确保存会...

如何用AndroidStudio编译jar并用cmd执行_fonx的博客-程序员宅基地

(1) 参考这个:AndroidStudio项目打包成jar  https://www.cnblogs.com/xxdh/p/6703746.html主要问题:gradlew makeJar 失败,解决办法:升级所有的 ADK,JDK补充细节select API  Android 4.0select template: no activityselect C++ suporte

Mysql 8.0.13配置远程用户连接信息_ccb1991的博客-程序员宅基地

一、前期准备1、虚拟机/物理机    mysql环境(非本机)2、本机 navicat软件(验证远程连接)二 、mysql配置1、在远程主机的本机   使用root用户连接mysqlmysql -u root -p备注 : mysql -u 最高权限用户名 -p   再输入密码进入2、设置用户配置项(1) 查看用户信息select host,user,plugin,...

神经网络--反向传播详细推导过程_love music.的博客-程序员宅基地_神经网络反向传播算法推导

概述以监督学习为例,假设我们有训练样本集  ,那么神经网络算法能够提供一种复杂且非线性的假设模型  ,它具有参数  ,可以以此参数来拟合我们的数据。为了描述神经网络,我们先从最简单的神经网络讲起,这个神经网络仅由一个“神经元”构成,以下即是这个“神经元”的图示:这个“神经元”是一个以  及截距  为输入值的运算单元,其输出为  ,其中函数  被称为“激活函数”。在本教程中,我们选用sigmoid函...

推荐文章

热门文章

相关标签