音频会话“闪避”在 iOS 4 中中断...?

2023-12-28

我有一个应用程序,它使用 MPAudioPlayerController 来访问 iPod 音乐库,并使用 AVAudioPlayer 将音频覆盖在音乐之上。我用过本文档 http://developer.apple.com/iphone/library/DOCUMENTATION/Audio/Conceptual/AudioSessionProgrammingGuide/Configuration/Configuration.html#//apple_ref/doc/uid/TP40007875-CH3-SW2作为指导。具体来说:

最后,您可以增强一个类别,以在播放您的音频时自动降低其他音频的音量。例如,这可以用于锻炼应用程序。假设用户正在边听着 iPod 边锻炼,您的应用程序想要叠加一条口头消息,例如“您已经划船 10 分钟了”。为了确保应用程序中的消息易于理解,请将 kAudioSessionProperty_OtherMixableAudioShouldDuck 属性应用于音频会话。发生闪避时,设备上的所有其他音频(电话音频除外)的音量都会降低。

但我没有看到这种行为。事实上,我看到(或听到)的是,如果我将 AudioSession 设置为 kAudioSessionProperty_OtherMixableAudioShouldDuck 设置为 true,则 MPAudioPlayerController 初始音量会减小,如果我随后在 MPAudioPlayerController 上调用暂停(然后再次播放)音量级别增加到“正常”水平。播放 AVAudioPlayer 对音频电平没有任何影响...

所以我设置了一个简单的测试用例来重现这一点。

在 ViewController 标头中:

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AVFoundation/AVFoundation.h>

@interface MusicPlayerVolumeTestViewController : UIViewController <AVAudioPlayerDelegate>
{
    UIButton *musicButton;
    UIButton *soundButton;
    AVAudioPlayer *audioPlayer;
    MPMusicPlayerController *musicPlayerController;
}
@property (nonatomic, retain) IBOutlet UIButton *musicButton;
@property (nonatomic, retain) IBOutlet UIButton *soundButton;
@property (nonatomic, retain) MPMusicPlayerController *musicPlayerController;

- (IBAction)musicAction;
- (IBAction)soundAction;

@end

并在实施中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    //Setup our Audio Session
    OSStatus status = AudioSessionInitialize(NULL, NULL, NULL, NULL);    
    //We want our audio to play if the screen is locked or the mute switch is on
    UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
    status = AudioSessionSetProperty (kAudioSessionProperty_AudioCategory, sizeof (sessionCategory), &sessionCategory);
    //We want our audio to mix with other app's audio
    UInt32 shouldMix = true;
    status = AudioSessionSetProperty (kAudioSessionProperty_OverrideCategoryMixWithOthers, sizeof (shouldMix), &shouldMix);
    //Enable "ducking" of the iPod volume level while our sounds are playing
    UInt32 shouldDuck = true;
    AudioSessionSetProperty(kAudioSessionProperty_OtherMixableAudioShouldDuck, sizeof(shouldDuck), &shouldDuck);
    //Activate our audio session
    AudioSessionSetActive(YES);

    //Setup the Music Player to access the iPod music library
    self.musicPlayerController = [MPMusicPlayerController applicationMusicPlayer];
    [self.musicPlayerController setShuffleMode: MPMusicShuffleModeSongs];
    [self.musicPlayerController setRepeatMode: MPMusicRepeatModeNone];
    [self.musicPlayerController setQueueWithQuery:[MPMediaQuery songsQuery]];

    //Setup a AVAudioPlayer sound to overlay against the Music Player audio
    NSURL *soundURL = [NSURL URLWithString:[[NSBundle mainBundle] pathForResource:@"overlay" ofType:@"mp3"]];
    NSError *error = nil;
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error: &error];
    if (!audioPlayer)
    {
        NSLog(@"Could not create audio effect player: %@", [error localizedDescription]);
    }
    [audioPlayer prepareToPlay];
}

- (IBAction)musicAction
{
    if (self.musicPlayerController.playbackState == MPMusicPlaybackStatePlaying)
    {
        [self.musicPlayerController pause];
    }
    else if (self.musicPlayerController.playbackState == MPMusicPlaybackStateStopped
          || self.musicPlayerController.playbackState == MPMusicPlaybackStatePaused)
    {
        [self.musicPlayerController play];
    }
}

- (IBAction)soundAction
{
    if (audioPlayer.playing)
    {
        [audioPlayer pause];
    }
    else
    {
        [audioPlayer play];
    }
}

我已经连接了几个 UIButton。一种用于 musicAction(用于播放/暂停 MPMusicPlayerController),另一种用于 soundAction(用于播放/暂停 AVAudioPlayer)。

如前所述,如果我点击 musicAction 按钮,则会播放音乐,但音量会降低;如果我点击 soundAction 按钮,则会播放叠加层,但不会影响 MPMusicPlayerController 的音量。而且,更类似错误的是,当我暂停然后播放 MPMusicPlayerController 时,音乐的音量会增加到我没有设置 AudioSession 时的水平。

我很想知道其他人是否有过这种经历,如果有的话,您是否找到了解决方法(或者可以告诉我我做错了什么)。否则,我想我要去雷达了。

非常感谢,

Levi


当我遇到类似问题并且无法使其一致工作时,我使用了这篇文章。它会工作一段时间,然后就会陷入“隐藏”状态。我花了很多时间研究和调试这个问题,最后才给苹果打电话。他们告诉我查看面包屑示例代码。我按照这个例子进行操作,一切正常。

这是苹果的示例代码:

http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html http://developer.apple.com/library/ios/#samplecode/Breadcrumb/Introduction/Intro.html

苹果的支持/开发人员还表示要注意他们设置会话属性的方式和时间的顺序。这显然就是其中的伎俩。在阅读了这里和其他地方的很多帖子后,我的设置相互冲突。从头开始并遵循面包屑示例使其发挥作用。从那以后我再也没有遇到过问题。

我在这里发布了相同的答案:

如何取消 AVAudioSession https://stackoverflow.com/questions/6489630/how-to-unduck-avaudiosession/7617670#7617670

对我来说,这个答案几乎是商业秘密,因为它很难工作,而且市场上有可用的应用程序。对我来说,看到一个工作示例(几乎只是声音闪避和取消闪避)是值得的。

另外,我向苹果提到这是一个已知问题,但他们不同意。他们不知道这里有任何问题。果然,如果您按照面包屑示例进行操作,它就可以正常工作,不会出现任何奇怪的会话停用和反应等情况。

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

音频会话“闪避”在 iOS 4 中中断...? 的相关文章

  • 如何在 iOS 4 上获取更新 NSUserDefault?

    我正在开发一个iPhone应用程序 由于多任务 我在iOS4上遇到了问题 此应用程序具有在 Settings bundle 中定义的默认设置 如果我运行我的应用程序 那么我就会离开它 所以它会进入后台 我将更改设置并重新启动应用程序 它退出
  • iOS 在没有应用商店的情况下安装应用程序 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有没有合法的方法 无需越狱 将iOS应用程序安装到iOS设备 ipad iphone ipod 而无需发布到应用程序商店 例如 封闭用户组
  • 即使类不可用, NSClassFromString() 也会返回一个类

    我目前正在运行 iOS 4 0 的 iPhone 3G 上测试一个应用程序 我有以下代码来检查该类是否可用 if NSClassFromString CLGeocoder 在文档中 它指出 CLGeocoder 可用于 iOs 5 0 及更
  • 如何使用 NSAttributedString?

    多种颜色在一个NSString or NSMutableStrings是不可能的 所以我听说过一些关于NSAttributedString http developer apple com mac library documentation
  • AudioConverterNew 返回 -50

    我有一个关于使用 AudioQueue 服务的小问题 我已按照 Apple 网站上提供的指南进行操作 但是当我启动并运行音频队列时 我收到消息告诉我 AudioConverterNew 返回 50 现在 我知道 50 错误代码意味着存在错误
  • 在 UITextview 中加载巨大的文本文件会崩溃

    我想更新 UITextView 中的一个巨大的文本文件 但设备有时会挂起或崩溃 文本文件大小为 4MB UITextView 是从 Interface Builder 添加的 我正在从文档目录加载文件 以下是加载文本文件的代码 NSErro
  • AVAudioSinkNode 具有非默认但仍然是设备本机采样率

    我已经配置了AVAudioSinkNode附于AVAudioEngine s inputNode像这样 let sinkNode AVAudioSinkNode timestamp frames audioBufferList gt OSS
  • 启动时在 iOS 中启动位置感知后台服务

    应用程序可以注册重大位置变化 推荐 重大变化的定位服务提供了 低功耗方式接收位置数据 强烈推荐用于 不需要高精度位置数据的应用 有了这个 服务 仅当用户位置时才会生成位置更新 发生显着变化 因此 它非常适合社交应用或 为用户提供非关键的 位
  • 核心音频指导/入门

    我一直在阅读 ios 4 的核心音频 目的是构建一个小测试应用程序 目前我对所有 api 的研究感到非常困惑 理想情况下 我想知道如何从两个 mp3 中提取多个样本到数组中 然后在回调循环中 我想将这些样本混合在一起并将它们发送到扬声器 苹
  • iOS-示例中的协议和委托

    好吧 我正在寻找 但没有任何方法对我有用 以下代码基于许多教程和苹果文档 但我无法让它工作 有人可以帮忙吗 代码崩溃于 obj delegatee self 在 B h 类中 respondsToSelector 和 PerformSele
  • 帮助修复内存泄漏版本

    import VTM AViPodReaderViewController h import
  • 第一次播放声音时 AVAudioPlayer 启动缓慢

    我试图消除通过 iPhone 上的 AVAudioPlayer 播放 非常短 不到 2 秒 音频文件时的启动延迟 首先 代码 NSString audioFile NSString stringWithFormat caf NSBundle
  • 将自定义值存储在 EKEvent(iPhone 日历)中

    我的应用程序与设备日历集成 当新项目添加到我的应用程序时 我们会为此项目创建一个日历条目 如果项目被编辑 我们需要更新日历项目 我现在所做的是将 GUID 放入 EKEvent Notes 中 但显然这对用户是可见的 因此我们添加文本 请勿
  • 为什么我无法更改 AU 多通道混音器输入范围中的元件/总线数量?

    UPDATE 我正在更改我的代码以更简化的方式说明问题 我还有一个小错误 虽然没有阻止问题的发生 但确实增加了一些混乱 我正在 iOS 中实例化多通道混音器 AU kAudioUnitSubType MultiChannelMixer 并执
  • 从 CMSampleBuffer 播放音频

    我在 iOS 中为群组创建了一个视频聊天应用程序 我一直在寻找一些方法来分别控制不同参与者的音频音量 我找到了使用静音和取消静音的方法isPlaybackEnabled in RemoteAudioTrack 但不控制音量 我还想我们是否可
  • 重用cocos2d动作

    是否可以 并且是一个好的实践 为使用相同操作的多个 CCSprite 重用相同的操作 因为如果我有 10 个 CCSprite 所有这些都需要缩放 我创建了一个名为scaleAction 的缩放操作 是否可以对精灵重复使用相同的动作 当我尝
  • 一种简单、干净的方式来切换/交换视图?

    我已经看了几个来源 但我仍然很困惑 我想创建一个具有多个视图的应用程序 只有标准视图 没有表视图或其他任何内容 我可以在其中单击每个视图上的按钮来访问其他视图 我已经看到了多种方法来做到这一点 但对我来说唯一有意义的方法是让应用程序委托负责
  • 锁定时 AVAudioPlayer 在 iPhone 5 中不播放音频

    使用 AVAudioPlayer 我尝试在 iphone 播放器播放时播放声音 当设备锁定时也是如此 问题是 在 iPhone 4s ios 7 中 效果很好 但在带有 6 和 7 ios 的 iPhone 5 上没有任何反应 In the
  • 替换核心数据模型,无需迁移

    我已经相当广泛地改变了我的核心数据模型 关于如何将旧数据迁移到新模型中存在很多问题 但是我不需要迁移任何内容 我只想替换当前的 Core Data 实例 如何才能做到这一点 我假设您正在使用持久存储协调器NSSQLiteStoreType
  • 有 ALAssetsLibrary 的示例吗

    对于iPhone 4来说 很多API都不能再使用了 我正在寻找 UIImageWriteToSavedPhotosAlbum 的替代解决方案 ALAssetsLibrary 是 Apple 在新 iOS 4 中提供的当前解决方案 任何人都有

随机推荐

  • 使用 ISO V2 Coated 等颜色配置文件将 CMYK 颜色转换为 RGB?

    我知道这个问题之前已经以多种不同的方式提出过 但似乎没有一个与我的问题相关 我想转换一个CMYK准确地着色RGB使用颜色配置文件 例如ISO Coated V2 我想这样做 因为简单的数学转换会导致明亮的颜色无法在CMYK色彩空间 理想情况
  • 在 JSON 请求中发送图像

    我在用着JSON with REST用于使用 Web 服务的 api 现在我还需要根据请求发送图像 是否可以 如果是 我需要在客户端 服务器端进行哪些更改 在我的Java代码中 我应该如何发送图像内容 是否需要单独设置内容类型 执行此操作的
  • Python:无需 OpenCV 即可访问相机

    同志们 我想用 Python 从笔记本电脑摄像头捕获图像 目前所有迹象都指向 OpenCV 问题是 OpenCV 的安装是一场噩梦 而且每次您在新系统上重新安装代码时 这个噩梦都会再次发生 有没有更轻量级的方法在Python中捕获相机数据
  • Rails Paperclip S3 重命名数千个文件?

    我正在尝试重命名 s3 中的许多文件 更改当前的回形针has attached file path from stuff id updated at style extension to stuff id counter style ext
  • 为什么我的工具输出会覆盖自身以及如何修复它?

    这个问题的目的是要成为一个典范 https meta stackoverflow com questions 291992它涵盖了各种各样的问题 其答案归结为 你有 DOS 行结尾被输入到 Unix 工具中 任何有相关问题的人都应该清楚地解
  • 有没有办法将 gmpxx.h 与 c++98 一起使用?

    由于我的项目 我需要使用 c 98 和 gmpxx h 但即使对于一个简单的项目 它也不起作用 include
  • Chrome DevTools:SASS 源文件未保存在磁盘上

    我按照 Google 提供的说明设置源映射 https developers google com chrome developer tools docs css preprocessors https developers google
  • Unity错误:UnityEngine.Component'不包含“velocity”的定义

    我对 C 很陌生 所以如果这是显而易见的 请原谅我 我正在按照中的步骤操作本教程 http www instructables com id Make A 2D Infinite Runner with Unity step6 The Ro
  • 折叠表达式和函数名称查找

    我正在学习 C 17 中的折叠表达式 我有以下代码 include
  • 是否可以设置当CPU写入特定地址时中断的中断?

    当写入特定地址时是否可以使x86 cpu中断 我想要一个硬件机制来监视某些地址的变化 我想知道在写入特定地址时是否可以使x86 cpu中断 有可能的 您可以设置调试寄存器之一 DR0 to DR4 到你想要监控的地址 然后在中配置相应的标志
  • 使用 NSSortDescriptor 通过 Core Data 对内部版本号进行排序

    我正在尝试使用NSSortDescriptor使用 Core Data 对内部版本号 软件版本 NSStrings 进行排序 内部版本号实际上只是 NSString 但似乎很难做到这一点 我猜测是因为小数点有多个且不规则 例如 我想对以下内
  • scipy 优化最小化——并行化选项

    当使用 L BFGS B 方法运行 scipy Optimizeminimum 时 我发现在某些计算机上 它使用全部 8 个 cpu 核心 参见照片 1 在其他计算机上它使用 8 个核心中的 4 个 参见照片 2 而在其他计算机上 它使用
  • 如何对哈希引用切片进行求和?

    我正在尝试获取哈希引用切片的总和 但失败了 usr bin env perl use strict use warnings FATAL gt all use feature say use autodie all use List Uti
  • help() 在 Python 中哪里可以找到信息?

    我发现内置help 最近它打印了模块 函数 方法 类等的一些信息 但是它到底在哪里找到它显示的信息呢 Python 文档 https docs python org 2 library functions html help不要对此给出任何
  • 使用 guid 主键忽略 LINQ to SQL 实体列名称属性

    我正在使用 LINQ to SQL SQL Server 2005 SP3 x64 处理一个简单的实体类 Table Name TBL REGISTRATION public sealed class Registration IDataE
  • scala 范围与大型集合上的列表性能

    我对 10 000 000 个元素运行了一组性能基准测试 我发现每次实现的结果都有很大差异 任何人都可以解释为什么创建 Range ByOne 会产生比简单的基元数组更好的性能 但将相同的范围转换为列表会导致比最坏情况场景更差的性能 创建
  • Windows CE 上的 C# .NET 3.5 CF,更改 DataGrid 中的行背景颜色

    我正在使用 C NET 3 5 CF 为 Windows CE 进行开发 我正在处理数据网格 需要知道如何更改数据网格上行的背景颜色 提前致谢 你必须手动绘制它 这是一篇博客文章 http blogs msdn com b priozers
  • Redis 数据结构空间要求

    redis中排序集和列表的空间有什么区别 我的猜测是 排序集是某种平衡二叉树 列表是链表 这意味着除了我为每个值编码的三个值 键 分数 值 之外 尽管我会将链表的分数和值混合在一起 但开销是链表需要跟踪一个另一个节点 二叉树需要跟踪两个 因
  • 如何通过管道传输到 Next.js 13 api 响应?

    早些时候 我能够将另一个 api 调用的响应通过管道传输到 Next js api 响应 如下所示 export default async function req res prevent same site obfuscate orig
  • 音频会话“闪避”在 iOS 4 中中断...?

    我有一个应用程序 它使用 MPAudioPlayerController 来访问 iPod 音乐库 并使用 AVAudioPlayer 将音频覆盖在音乐之上 我用过本文档 http developer apple com iphone li