【发布时间】:2014-03-19 11:11:54
【问题描述】:
所需功能:1) 插入时通过耳机播放音频,2) 未插入耳机时通过扬声器播放音频,以及 3) 通过耳机或内置麦克风录制音频。
为了让它在扬声器和耳机上播放音频,我使用以下音频会话类型:
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error: &setCategoryError];
然后创建一个音频播放器的实例。这非常适合在插入时通过耳机播放音频,在未插入时通过扬声器播放音频,直到我尝试录制为止。
录制时,我先将音频会话设置为AVAudioSessionCategoryPlayAndRecord,然后尝试使用 Novicane 进行录制。有时这会成功,但有时应用程序崩溃,没有堆栈跟踪或调试器指示,并给出 AUIOClient_StartIO 错误。
我对这个错误的谷歌搜索表明我需要始终保持会话AVAudioSessionCategoryPlayAndRecord。这似乎确实避免了AUIOClient_StartIO 错误的发生。
但每当我使用AVAudioSessionCategoryPlayAndRecord 播放时,它都会从内置听筒而不是扬声器开始播放。
我知道我可以将音频输出通道覆盖到扬声器(例如https://stackoverflow.com/a/1064941/895876),但插入耳机后不会自动切换到耳机音频。
如何获得所有三个功能?
【问题讨论】:
-
我认为您不需要始终设置 AVAudioSessionCategoryPlayAndRecord。我认为你应该观察 AVAudioSessionRouteChangeNotification 并在它触发时重新创建你的 AU。虽然你已经把这份工作交给了 Novicane。