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 或其他)上播放蓝牙立体声的主要内容,如果未能解决你的问题,请参考以下文章
同时使用 AVAudioPlayer 和 MPMoviePlayerController
AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音
AVPlayer 和 AVAudioPlayer 在功能方面有啥区别?