iOS 7 机器人/iPhone 5s 在扬声器模式下出现乱码
Posted
技术标签:
【中文标题】iOS 7 机器人/iPhone 5s 在扬声器模式下出现乱码【英文标题】:iOS7 robotic/garbled in speaker mode on iPhone5s 【发布时间】:2014-02-23 05:12:48 【问题描述】:我们有一个 VOIP 应用程序,可以录制和播放音频。因此,我们使用 PlayAndRecord (kAudiosessionCategory_PlayAndRecord) 音频会话类别。 到目前为止,我们已经成功地将它与 iOS 6 和 iOS 7 的 iPhone 4/4s/5 一起使用,通话音频和铃声播放清晰且可听。 然而,在 iPhone 5s 中,我们观察到通话音频和铃声在扬声器模式下听起来都是机器人/乱码。使用听筒/蓝牙/耳机时,声音清晰可听。 iPhone 5s 使用的 iOS 版本:7.0.4
我们正在使用音频单元来录制/播放通话音频。 在设置会话类别、音频路由、会话模式等音频属性时,我们尝试了旧的(已弃用)AudioSessionSetProperty() 和 AVAudioSession API。 对于播放音调,我们使用 AVAudioPlayer。在 VOIP 通话期间以及在应用程序内按下键盘控制器时播放音调会产生机器人声音。 当使用 AudioComponentInstanceNew 实例化音频组件时,我们将 componentSubType 设置为 kAudioUnitSubType_VoiceProcessingIO。 在将 kAudioUnitSubType_VoiceProcessingIO 替换为 kAudioUnitSubType_RemoteIO 时,我们注意到通话音频和提示音的声音不再是机械的,非常清晰,但使用扬声器模式时音量非常低。
总之,保持所有其他音频 API 相同:
kAudioUnitSubType_VoiceProcessingIO:音量很高(理想),但在扬声器模式下,音调和通话音频是机器人。 kAudioUnitSubType_RemoteIO:提示音和通话音频清晰但听不到。
复制步骤 - 将音频会话类别设置为 playAndRecord。 - 将音频路由设置为扬声器 - 设置所有其他音频属性,如启动音频单元、激活音频会话、实例化音频组件。 - 设置输入和渲染回调 - 尝试两种选择 1. 使用 AVAudioPlayer 播放铃声 2. 播放通话音频
有关如何解决此问题的任何建议。已向 Apple 提出问题,但尚未得到他们的回应。
我在这里分享了代码github link
【问题讨论】:
【参考方案1】:kAudioUnitSubType_VoiceProcessingIO
和 kAudioUnitSubType_RemoteIO
之间的唯一区别是 voiceProcessing 包含用于调出回声的代码,即调出扬声器的噪音,这样麦克风就不会接收到它。我已经很久没有玩过音频框架了,但我记得听起来可能有很多东西,
您是否正在处理可能需要很长时间的音频回调工作?
回调在实时线程上运行。如果您的处理时间过长,您可能会丢失数据。在固定时间段内跟踪数据以查看您是否全部捕获将很有帮助。使用诸如wireShark之类的东西来嗅探网络。记录数据包的数量,看看手机是否捕获了相同的数据包。
您是否正在修改任何音频? 您是否有可能导致问题的循环缓冲区?我在执行此操作时遇到了几个问题,其中一个问题是使用了被描述为低延迟和高效的第三方循环缓冲区……但事实并非如此。我在这里回答了我自己的问题,并包含了我的循环缓冲区实现,它极大地改善了我的音频,因为问题是我跳过了数据。
试一试,让我知道: iOS UI are causing a glitch in my audio stream
请注意,此代码中的某些代码是 ALaw 音频格式所独有的,如果您使用线性 PCM 或任何其他可能会产生某种噪音的代码,0xD5 是 ALaw 中的一个静音字节。
【讨论】:
以上是关于iOS 7 机器人/iPhone 5s 在扬声器模式下出现乱码的主要内容,如果未能解决你的问题,请参考以下文章
查看在 iPhone 5s 和 5c (iOS 7.1) 中打开,如 iPhone 4s 屏幕
对于相同的 iPhone 5s,iOS 模拟器在 ios 7.1 和 ios 8.2 之间具有不同的屏幕高度
在使用 iOS 7 的 iPhone 5s 上写入 /dev/null 时,AVAudioRecorder 停止工作
使用运行 iOS 7.1 的 iPhone 5s 时,设备令牌为零