如何让我的应用程序音频在说话时很好地中断 iPhone 音频

2024-03-25

我的 iOS 7 应用程序会在必要时发出文本声音。

我想做的是让用户在我的应用程序运行时收听他的音乐或播客(或任何其他使用音频的应用程序)。

预期的行为是,当我的应用程序说话时,其他音频会混合或闪避,然后其他音频会立即恢复到初始级别。

我尝试了很多方法来实现这个目标,但没有什么足够好,因为我在代码后面列出了我面临的问题。

我当前的实现基于在播放或文本转语音之前创建会话,如下所示:

+ (void)setAudioActive {

    [[self class] setSessionActiveWithMixing:YES];
}

播放/演讲后,我将 i 设置为空闲,如下所示:

+ (void)setAudioIdle {
    [[self class] setSessionActiveWithMixing:NO];
}

根据活动参数处理会话设置的核心函数,如下:

+ (void)setSessionActiveWithMixing:(BOOL)active
{
    NSError *error = NULL;
    BOOL     success;

    AVAudioSession *session = [AVAudioSession sharedInstance];

    static NSInteger counter = 0;

    success = [session setActive:NO error:&error];
    if (error) {
        DDLogError(@"startAudioMixAndBackground: session setActive:NO, %@", error.description);
    }
    else {
        counter--; if (counter<0) counter = 0;
    }

    if (active) {
        AVAudioSessionCategoryOptions options = AVAudioSessionCategoryOptionAllowBluetooth
            //|AVAudioSessionCategoryOptionDefaultToSpeaker
            |AVAudioSessionCategoryOptionDuckOthers
        ;


        success = [session setCategory://AVAudioSessionCategoryPlayback
                   AVAudioSessionCategoryPlayAndRecord
                           withOptions: options
                                 error: &error];
        if (error) {
            // Do some error handling
            DDLogError(@"startAudioMixAndBackground: setCategory:AVAudioSessionCategoryPlayback, %@", error.description);
        }
        else {
            //activate the audio session
            success = [session setActive:YES error:&error];
            if (error) {
                DDLogError(@"startAudioMixAndBackground: session setActive:YES, %@", error.description);
            }
            else {
                counter++;
            }
        }
    }

    DDLogInfo(@"Audio session counter is: %ld",counter);
}

我目前的问题是:

1)当我的应用程序开始说话时,我听到声音中有一些毛刺,这使得它不太好听;

2)当我将路由连接到蓝牙时,底层音频(例如Podcast或ipod音乐)变得非常低并且听起来很吵,这使得我的解决方案根本无法使用,我的用户将拒绝这个级别的质量差。

3)当其他蓝牙连接设备尝试发出声音(例如汽车或实例中的GPS)时,我的应用程序没有收到任何中断(或者我处理错误),请参阅我的代码如下:

- (void)startAudioMixAndBackground {

    // initialize our AudioSession -
    // this function has to be called once before calling any other AudioSession functions
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionDidChangeInterruptionType:)
                                                 name:AVAudioSessionInterruptionNotification object:[AVAudioSession sharedInstance]];

    // set our default audio session state
    [[self class] setAudioIdle];

    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

    if ([self canBecomeFirstResponder]) {
        [self becomeFirstResponder];
    }

    @synchronized(self) {
        self.okToPlaySound = YES;
    }

    //MPVolumeSettingsAlertShow();
}
//  want remote control events (via Control Center, headphones, bluetooth, AirPlay, etc.)
- (void)remoteControlReceivedWithEvent:(UIEvent *)event
{
    if (event.type == UIEventTypeRemoteControl)
    {
        switch(event.subtype)
        {
            case UIEventSubtypeRemoteControlPause:
            case UIEventSubtypeRemoteControlStop:
                [[self class] setAudioIdle];
                break;
            case UIEventSubtypeRemoteControlPlay:
                [[self class] setAudioActive];
                break;
            default:
                break;
        }
    }
}

#pragma mark - Audio Support

- (void)audioSessionDidChangeInterruptionType:(NSNotification *)notification
{
    AVAudioSessionInterruptionType interruptionType = [[[notification userInfo]
                                                        objectForKey:AVAudioSessionInterruptionTypeKey] unsignedIntegerValue];

    if (AVAudioSessionInterruptionTypeBegan == interruptionType)
    {
       DDLogVerbose(@"Session interrupted: --- Begin Interruption ---");
    }
    else if (AVAudioSessionInterruptionTypeEnded == interruptionType)
    {
        DDLogVerbose(@"Session interrupted: --- End Interruption ---");
    }
}

您的问题很可能是由于您设置的类别造成的:AVAudioSessionCategoryPlayAndRecord。 PlayAndRecord 类别不允许您的应用程序与其他应用程序混合/闪避音频。您应该在此处再次参考有关音频会话类别的文档:https://developer.apple.com/library/ios/documentation/avfoundation/reference/AVAudioSession_ClassReference/Reference/Reference.html https://developer.apple.com/library/ios/documentation/avfoundation/reference/AVAudioSession_ClassReference/Reference/Reference.html。看来 AVAudioSessionCategoryAmbient 可能更符合您的需求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何让我的应用程序音频在说话时很好地中断 iPhone 音频 的相关文章

  • Swift 每 5 天重复一次 LocalNotification

    如何每 5 天上午 10 00 重复一次 LocalNotification 我尝试这个 但它不起作用 let content UNMutableNotificationContent content title Hello content
  • Xcode 8.2 更新后二进制文件无效

    我今天尝试在更新到 Xcode 8 2 后向我的应用程序推送更新 但收到无效的二进制错误 我以前从未见过这个 我的应用程序的 iOS 部署目标是 iOS 9 0 有谁见过这个错误或知道如何修复它 这是电子邮件的内容 解释了二进制文件的无效内
  • 在 iOS 中获取 Facebook 好友时出错

    我正在尝试获取登录用户的 Facebook 好友列表 它在我的帐户中工作正常 但是当我将应用程序详细信息迁移到新帐户并更改应用程序 ID 和应用程序密码时 我收到以下错误 Error Domain com facebook sdk Code
  • iOS 应用程序崩溃 com.apple.root.background-qos

    在应用程序中发现应用程序崩溃 我怀疑这可能是由于 firebase 观察者的代码而发生的 由于在用户案例中 用户可以从一个事件转到用户配置文件 参与此事件 然后从用户配置文件可以返回到此事件 我需要一个 ref 句柄来删除特定的观察者 因此
  • 如何在 Swift 中更改 UIButton 图像

    我正在尝试使用 Swift 更改 UIButton 的图像 我应该怎么办 这是 OBJ C 代码 但我不知道 Swift 的情况 playButton setImage UIImage imageNamed play png forStat
  • 使用 popToRootViewController 时我丢失了导航栏

    我有一个 iOS 应用程序 其中主屏幕是 UICollectionViewController 从集合视图中选择项目时 视图将推送到该项目的详细信息视图 在细节视图中 我构建了一个从侧面移出的抽屉 滑块 为了让视图看起来像我想要的那样 我隐
  • dequeueReusableCellWithIdentifier: 如何工作?

    我想要一些精确的信息dequeueReusableCellWithIdentifier kCellIdentifier 如果我理解得很好 下面的 NSLOG 应该只打印一次 但事实并非如此 那么 dequeueReusableCell 的意
  • 如何在 iOS 中通过 wifi 传输大文件

    我下载了WiTap http developer apple com library ios samplecode WiTap Introduction Intro html代码来自苹果网站 它用于通过本地 WiFi 网络传输数据 我正在从
  • 如何使用基于HM-10蓝牙模块的BLE Shield?

    我是 arduino 项目的新手 我想请你帮忙 我从 http imall iteadstudio com development platform arduino shields im130704001 html http imall i
  • ios - ARKit - 如何创建旋转对象手势功能?

    我是 ARKit 新手 我想创建一个旋转对象的函数 这是我关于拖动和旋转对象的代码 Rotate object objc func rotateRecognized sender UIPanGestureRecognizer let sce
  • 尝试了解CMTime

    我见过一些examples https stackoverflow com questions 5808557 avassetwriterinputpixelbufferadaptor and cmtime of https stackov
  • Android 和 IOS 是否可以在后台发送短信?

    我想制作一个应用程序 其主要功能取决于发送短信 在我开发 android native 之前 但现在我使用 React Native 来为 IOS 和 Android 制作它 在 Android 中 如果获得用户许可 可以在后台发送短信 但
  • 工作表关闭后 SwiftUI 导航栏项目框架未对齐

    在 SwiftUI 中关闭工作表后 导航栏按钮不可点击 以下是重现该问题的步骤 出示一张单子 将应用程序移至后台一小段时间 2 秒 恢复应用程序并向下滑动关闭工作表 现在导航栏按钮框架未对齐 点击的工作框架与按钮的可见框架不同 这在 iOS
  • XCODE:如何从设备获取/验证准确的时间戳

    在没有互联网连接的情况下是否可以获得 NTP 或准确的时间戳 我不能接受 不信任带有 NSDate date 的设备时间戳 因为它可以由用户修改 并且我的应用程序将通过修改系统日期和时间而被黑客攻击 除此之外 是否有任何方法可以检查系统日期
  • 为什么这会破坏 UILabel adjustmentFontSizeToFitWidth?

    iOS 7 Xcode 5 使用 UILabel 此代码可以工作 自动调整文本大小以适应 self testLabel numberOfLines 0 self testLabel lineBreakMode NSLineBreakByWo
  • 使用 QuartzCore 为 UITextView 创建阴影 [重复]

    这个问题在这里已经有答案了 我使用创建了一个阴影QuartzCore for my UITextView使用以下代码 myTextView layer masksToBounds NO myTextView layer shadowColo
  • 将 NSData 视频文件合并为一个视频文件

    我有一堆视频文件想要合并成一个视频文件 我正在使用 NSMutableData 来完成该任务 NSMutableData concatenatedData NSMutableData alloc init for int i 0 i lt
  • 推送通知需要很长时间才能到达

    我在适用于 iOS 和 Android 的 Adob e Air 应用程序中遇到推送通知的奇怪问题 我正在使用 Milkman Games 的 Easy Push ANE 以及 One Signal 服务 问题是通知确实会到达 但有时 随机
  • 如何在 Swift 编程中获得基于导航的模板功能

    我的项目需要一个导航控制器 并且我的应用程序最初有一个社交登录 一旦验证通过 用户将被推送到另一个视图 我在其中显示一个具有 2 个选项卡的选项卡控制器 我不知道如何在 Swift 编程中做到这一点 我已将视图控制器嵌入到导航控制器中 一旦
  • 从 iOS 中的 App Delegate 调用当前视图控制器中的方法

    我有两个视图控制器 BuildingsViewController 和 RoomsViewController 它们都使用应用程序委托中名为上传的函数 上传函数基本上执行一个 HTTP 请求 如果成功或不成功 都会触发 uialertvie

随机推荐

  • jsonschema2pojo 中的 JSR-303 激活

    有一个地方在jsonschema2pojo描述启用可能性的文档JSR 303注释生成 https github com joelittlejohn jsonschema2pojo wiki Reference minimummaximum
  • Android中加载数据到TextView

    我有一个像 Yes No Dontknow 这样的 XML 标签 我正在解析 XML 文件并获取数据 现在我需要在单独的 TextView 中显示每个选项 即 是 应显示在一个 TextView 中 否 应显示在另一个 TextView 中
  • C# 构造函数之外的对象构造

    当涉及到设计类以及它们之间的 通信 时 我总是尝试以所有对象构造和组合都在对象构造函数中进行的方式进行设计 我不喜欢从外部进行对象构造和组合的想法 就像其他对象设置属性并调用我的对象上的方法来初始化它一样 当多个对象尝试对您的对象执行此操作
  • 通过javascript选择特定打印机

    我的计算机连接了两台打印机 我可以通过 JavaScript 代码选择特定的打印机吗 无法绕过打印选项 默认打印机由访问者操作系统决定 使用普通的旧 JavaScript 对此无能为力 使用 Flash 或 Java 或许可以实现这一点 但
  • css/ html 帮助制作像容器一样的圆桌

    任何人都可以提供如何创建基于 css 的气泡容器以便 html 进入其中的见解或示例吗 我想做一张圆桌 也就是说 我希望结果看起来像一张桌子 但边缘是圆角的 如果内部也有轻微的梯度就太好了 我在这个网站上找到了一个样本 http www s
  • 使用R中的geom_smooth()在ggplot2图例中混合填充颜色

    使用绘制两条回归曲线时geom smooth in ggplot2 为了fill颜色 图例选择置信区间相交的颜色 我确实认为当重叠区域按比例大于另一个区域时就会出现这种行为 但是我发现这是非常不受欢迎的 因为读者能够推断出 变暗 区域是 C
  • 有条件地填充 voronoi 段/颜色

    我正在尝试根据 d lon 值有条件地为这些 voronoi 段着色 如果是正数 我希望它是绿色的 如果是负数 我希望它是红色的 然而目前它正在将每个段返回为绿色 即使我将 它仍然返回绿色 活生生的例子在这里 https allaffect
  • Visual Studio 2010 是否支持 Sharepoint 2007 开发?

    我注意到在 VS2010 beta 2 中 所有模板仅适用于 Sharepoint 2010 这是真的 如果是这样 VIeWS 1 3 至少可以与 VS2010 一起使用吗 据我记得在 SharePoint 拉斯维加斯会议上的会议 新的 很
  • 如何在 C# 中使用 itextsharp 创建带有泰米尔字体的 PDF 文件?

    我们正在 C 应用程序中通过传递泰米尔语文本 印度语言之一 来创建 pdf 文件 因此 我已经为我的泰米尔语字体安装了 AVVAIYAR TTF 泰米尔语字体之一 字体 但是当我运行下面提到的命令时pgm 创建的pdf文件不包含任何泰米尔字
  • 第一个承诺完成后,Angular $q.all 被调用

    我试图使用 q all 等待所有承诺都得到解决 但它是在第一个承诺完成后调用的 我做错了什么 function sendAudits audits var promises scope sendAudits progress 0 angul
  • 使用 jquery 将列表拆分为大小相等的子列表的最有效方法

    使用 jQuery 分割列表最有效的方法是什么 ul class columnar li li li li ul 分成几个子列表 ul class column1 li li li li ul ul class column2 li li
  • Java 上的 JSON 与 MultiValueMap

    我想构建一个像这样的 JSON Id 33396 Actions Key 5 Value Test Key 6 Value Test 2 我正在使用 MultiValueMap 这是我的代码 MultiValueMap
  • iOS swift 删除 UITableView 单元格分隔符空间

    我正在尝试删除 tableView 分隔符 我通过将分隔符样式设置为 none 来做到这一点 这会删除分隔符 但会在单元格之间留下空间 我的问题是如何消除单元格之间的空间 任何帮助 将不胜感激 In awakeFromNib功能设定UITa
  • 仅使用 C++ 编写的 Android 应用程序

    是否可以仅使用 C 来制作 Android 应用程序 我不懂Java 我尝试过 Visual Studio 2019 方法 但我想我的计算机不足以模拟 Android 手机 如果您有适当的编程工具 您可以使用 C 为 Android 编写代
  • 尝试通过 jni 调用从 java 更改 Windows 鼠标光标图标

    在我的 java 应用程序中 我尝试使用具有透明度的 argb 32 位 bmp 文件更改鼠标光标 我想进行 jni 调用以从 Windows 更改它 因为在 java 中更改光标会给我一个非常糟糕的鼠标光标 所有透明度都是 0x00 或
  • 为什么无符号类型在arm cpu中效率更高?

    我正在阅读手臂手册并提出这个建议 但没有提到原因 为什么无符号类型更快 在 ARMv4 之前 ARM 没有对加载半字和有符号字节的本机支持 要加载有符号的字节 你必须LDRB然后对值进行符号扩展 LSL那就起来吧ASR它回落 这很痛苦所以c
  • 错误:在 docker 容器中导入 Postgres 数据库

    我正在 docker 容器中运行 ruby on Rails 应用程序 我想在 postgres 容器中创建并恢复数据库转储 但是我 以下是我到目前为止所做的事情 1 添加了 bash 脚本 docker entrypoint initdb
  • 登录会话超时后,Spring Security重定向到最后请求的页面

    我已经实现了 Spring Security 来登录我的门户网站 除了一个问题之外 它工作正常 我已将会话超时设置为 5 分钟 一旦发生超时 然后用户单击任何 URL 它将被重定向到注销页面 但是当用户重新认证时 用户直接登陆到最后访问的页
  • F# 基础知识:将 NameValueCollection 转换为漂亮的字符串

    学习 F 的同时尝试做一些有用的事情 所以这是一个基本问题 I have req 这是一个HttpListenerRequest 其中有QueryString属性 有类型System Collections Specialized Name
  • 如何让我的应用程序音频在说话时很好地中断 iPhone 音频

    我的 iOS 7 应用程序会在必要时发出文本声音 我想做的是让用户在我的应用程序运行时收听他的音乐或播客 或任何其他使用音频的应用程序 预期的行为是 当我的应用程序说话时 其他音频会混合或闪避 然后其他音频会立即恢复到初始级别 我尝试了很多