AUGraph 播放 aac->pcm 转换的音频流在 iPhone7plus 上听起来断断续续,但不是 iPhone6
Posted
技术标签:
【中文标题】AUGraph 播放 aac->pcm 转换的音频流在 iPhone7plus 上听起来断断续续,但不是 iPhone6【英文标题】:AUGraph playback of aac->pcm converted audio stream sounds choppy on iPhone7plus but not iPhone6 【发布时间】:2017-09-21 20:45:59 【问题描述】:我用 AUmixer 构建了一个 AUGraph,当通过 iPhone7plus 上的回调播放流时,音频播放听起来很糟糕。您可以听到音频和正在说的内容,但非常刺耳。如果我在我的 iPhone6 上构建并运行它听起来不错。
我还使用没有混音器的单一 AudioUnit 实现了设置,这在 iPhone7 和 iPhone6 上听起来都不错,但我当然失去了混音器所需的功能。我对两种设置都使用相同的 AudiostreamBasicDescription(带有混音器的图形和单个音频单元)
关于为什么我的 iPhone7 plus 上的图表听起来如此糟糕的想法?
My current ASBD:
_pcmASBD AudioStreamBasicDescription
mSampleRate Float64 44100
mFormatID AudioFormatID 1819304813
mFormatFlags AudioFormatFlags 12
mBytesPerPacket UInt32 4
mFramesPerPacket UInt32 1
mBytesPerFrame UInt32 4
mChannelsPerFrame UInt32 2
mBitsPerChannel UInt32 16
mReserved UInt32 0
我正在做 AAC 到 PCM 的转换,然后将该数据输入 AURenderCallback,最后输入到由 AudioUnit 架构播放的 pendingBufferList。
我需要使用混音器,因为我想控制音量,所以一个单一的 AudioUnit 方法(它不显示此错误,但使用相同的回调和所有内容)对我不起作用,因为我不想通过调制音频影响原始数据流。
编辑:
将为此添加更多代码和想法以希望解决问题。
我使用 AudioConverter 处理传入的 AAC 流,这将转换为 LPCM,然后我将其输入到我的 AudioBufferList 中,该列表在 audiounit 图形渲染过程中被填充。
我注意到,如果我采用 48Khz(编码然后流式传输)-> 48khz(接收流、解码、播放)听起来不错,并且我的音频渲染过程显示的 inNumberFrames 为 1024。
如果我使用 44.1khz -> 48khz,它听起来很刺耳(我的音频单元图发出的声音是正确的音高,尽管因为我放入了采样率转换器)但音频渲染过程显示 inNumberFrames 为 941 或 940
我觉得这可能是 hotpaw2 所说的,但是当我将 AudioBufferList 的大小设置为 4*inNumberFrames 的倍数时,它仍然听起来很刺耳。
@hotpaw2?
【问题讨论】:
【参考方案1】:检查硬件采样率。在许多较新的 iOS 设备上,硬件音频采样率可以默认为 48000,而不是 44100,具体取决于插入的内容或之前播放的音频。如果是这样,并且您想要的格式是 44100,那么重采样器将提供不同长度和奇数长度的缓冲区。期望固定长度甚至长度缓冲区的音频单元回调可能会因此出现故障。
修复它的方法可能是检查硬件采样率。如果是 48000,则将格式设置为相同,因此无需重新采样。还要确保你所有的音频上下文回调块可以处理不同的和奇数长度/帧数的 AudioBufferList 缓冲区。
【讨论】:
感谢 cmets,我检查了硬件采样率并确保他们使用支持的硬件(确实是 48000)我仍然有问题。我收到了一个 AAC 流,我将其音频转换为 PCM,然后通过我的 AUGraph 播放出来。使用单个 AudioUnitComponent 听起来可以找到使用相同的回调逻辑来填充两者的 pendingBufferList 但似乎只有 Graph 显示了问题。我只会使用单数 AudioUnitComponent 但我需要使用图表来进行音量混合。以上是关于AUGraph 播放 aac->pcm 转换的音频流在 iPhone7plus 上听起来断断续续,但不是 iPhone6的主要内容,如果未能解决你的问题,请参考以下文章
使用 AudioConverter 将 PCM 转换为 AAC 并使用 AVAssetWriter 写入 .mp4 文件时音频失真