AVAudioPlayer 和 AVAudioSession 不会在 iPad(2 或其他)上播放蓝牙立体声

Posted

技术标签:

【中文标题】AVAudioPlayer 和 AVAudioSession 不会在 iPad(2 或其他)上播放蓝牙立体声【英文标题】:AVAudioPlayer and AVAudioSession won't play to BlueTooth stereo on iPad (2 or otherwise) 【发布时间】:2014-01-23 16:44:47 【问题描述】:

我有一个应用程序可以播放录制的音频以及重复的声音。声音通过板载 iPad 扬声器正确播放,如果我将耳机插孔的线插入立体声音频输入,它也能正常播放。当我将我的 iPad 与我的蓝牙立体声输入配对时,我的其他应用程序(为 iPhone 编写,在我的 iPad 上运行)的所有声音都可以正常工作,就像我设备中的所有其他声音一样。

问题是我为 iPad 编写的应用没有通过蓝牙路径播放,而是通过内置扬声器播放。

在我的应用程序委托中的 didFinishLaunchingWithOptions(...) 方法中,我放置了以下内容:

NSError *error = nil;
[[AVAudiosession sharedInstance] setMode:AVAudioSessionModeDefault error:&error];
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
[[AVAudioSession sharedInstance] setActive:YES error:&error];

正在调用此代码,没有返回错误。

在我的控制器代码中,我记录了我使用 AVAudioPlayer 播放的示例,如下所示:

audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:recordURL error:&error];
audioPlayer.numberOfLoops = 0;
[audioPlayer setDelegate:self];
[audioPlayer play];

在其他领域,我有无人机在线程控制循环中重复播放短 0.01 秒的声音,我使用 OpenAL 来做到这一点:

    alSourcePlay(sourceID);

这与我为 iPhone 编写的其他应用程序中的代码相同。

我意识到还有其他关于蓝牙输入的线程,但我的 iPad 应用程序的音频声音的蓝牙输出存在特定问题。

【问题讨论】:

除了你的问题 AVAudioSessionCategoryPlayAndRecord 会降低输出音量。如果您不使用 VOIP(或任何其他同时录制和播放),请避免将您的类别设置为此。 发现了更多信息。在配置我的 OpenAL 之前,我正在设置我的 AVAudioSession。通过之后设置 AVAudioSession 信息(全部在 viewDidLoad 中,现在才在最后),音频现在播放到蓝牙扬声器。现在,我无法记录。我发现蓝牙的输出和内置麦克风的输入之间可能存在冲突。有什么建议吗? 您好!如果您仍在 SO 上,您介意看一下我的类似问题吗?这是我 2018 年 4 月 9 日提出的问题。谢谢!! 【参考方案1】:

因为您的类别是播放和录制,您必须启用蓝牙作为输入才能支持它作为输出(默认情况下,相同的接收器用于播放和录制模式下的输入/输出)。为此,您必须在 AVAudioSession 上设置一个额外的属性:

UInt32 allowBluetoothInput = 1;
AudioSessionSetProperty (
                         kAudioSessionProperty_OverrideCategoryEnableBluetoothInput,
                         sizeof (allowBluetoothInput),
                         &allowBluetoothInput
                        );

您还需要通过在会话中设置kAudioSessionProperty_OverrideCategoryDefaultToSpeaker 属性来检查您是否没有在代码中的任何位置强制输出到内置扬声器。

【讨论】:

试过了,但没有改变。我在 setActive(...) 调用之前添加了覆盖启用蓝牙。我已经检查了所有代码,但我没有在哪里设置 DefaultToSpeaker。 我不知道你是否需要记录,但是为了这个测试的目的,你可以将会话设置为AVAudioSessionCategoryPlayback 看看是否有任何改变? 没有什么不同,是的,我确实需要能够在录制的同时播放输出。这是一个音乐应用程序,播放节拍器并记录用户。想要同时听到滴答声和现场音乐家的声音。在没有蓝牙的情况下工作正常......但蓝牙输出是最初的问题。现在看来,蓝牙音频输出和内置麦克风输入之间似乎确实存在冲突。一切都在 iPad 上......不是 iPhone(如果这有助于讨论的话)。【参考方案2】:

这是目前的解决方案,但已被弃用,任何人都知道新的解决方案,但现在将这部分代码添加到您的应用程序中,一切正常!!

 UInt32 sessionCategory = kAudioSessionCategory_MediaPlayback;
AudioSessionSetProperty(kAudioSessionProperty_AudioCategory, sizeof(sessionCategory), &sessionCategory);
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

希望对您有所帮助!

【讨论】:

【参考方案3】:

不可能。

来自非常有趣的 Apple 文档 AVAudioSession -- 选择麦克风 QA1799:

如果应用程序使用 setPreferredInput:error: 方法选择蓝牙 HFP 输入,则输出将自动更改为蓝牙 HFP 输出。此外,使用 MPVolumeView 的路由选择器选择蓝牙 HFP 输出将自动将输入更改为蓝牙 HFP 输入。因此,即使仅单独设置了输入或输出,输入和输出都将始终在蓝牙 HFP 设备上结束。

【讨论】:

谢谢安德鲁。这就是我害怕的。我希望在未来(不久的将来)的某个时候,Apple 能够对此进行更改,以允许输出到蓝牙,同时保留板载麦克风用于输入。会选择这个作为答案...甚至认为这不是我希望的答案(笑)。【参考方案4】:

你检查过 setCategory withOptions 吗?它从 iOS 6 开始

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionAllowBluetooth error:&error];

【讨论】:

是的,我做到了,但仍然没有工作。输入来自内置麦克风,而输出来自蓝牙,这似乎是一种混乱。

以上是关于AVAudioPlayer 和 AVAudioSession 不会在 iPad(2 或其他)上播放蓝牙立体声的主要内容,如果未能解决你的问题,请参考以下文章

一起播放 iPod 音乐和 avaudioplayer

同时使用 AVAudioPlayer 和 MPMoviePlayerController

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音

AVPlayer 和 AVAudioPlayer 在功能方面有啥区别?

SpriteKit 游戏中的 AVAudioPlayer 和性能问题

可以混合 AudioServicesPlaySystemSound 和 AVAudioPlayer 吗?