设置AVCaptureAudioChannel的isEnabled时AVFoundation崩溃问题咨询
AVCaptureAudioChannel isEnabled设置崩溃及AVFoundation内部后缀疑问
一、设置isEnabled属性触发崩溃问题
崩溃断言信息
Assertion failed: (pSrcASBD->mChannelsPerFrame == [_internal->audioChannels count]), function -[AVCaptureConnection_Tundra copyPostSplitSummaryAudioFormatDescription], file AVCaptureConnection.m, line 817.
问题代码对比
触发崩溃的代码(设置isEnabled):
guard let channel = connection.audioChannels[safe: channelIndex] else { return } if channel.isEnabled != enabled { channel.isEnabled = enabled }
无异常的代码(设置volume):
guard let channel = connection.audioChannels[safe: channelIndex] else { return } if channel.volume != volume { channel.volume = volume }
原因分析与规避方案
- 核心原因:修改
isEnabled时,AVFoundation内部会重新生成音频格式描述,但部分设备的底层音频流通道数和AVCaptureConnection维护的通道列表数不同步,触发了内部断言校验。而设置volume仅调整通道音量,不会触发格式描述的重计算,因此无问题。 - 临时规避方法:
- 修改前先校验通道数一致性,不一致则跳过设置:
guard let channel = connection.audioChannels[safe: channelIndex], let formatDesc = connection.audioFormat?.formatDescription, let asbd = formatDesc.audioStreamBasicDescription else { return } if Int(asbd.mChannelsPerFrame) == connection.audioChannels.count { if channel.isEnabled != enabled { channel.isEnabled = enabled } } - 尝试先暂停捕获会话,修改通道状态后再恢复,减少实时流状态下的同步冲突。
- 修改前先校验通道数一致性,不一致则跳过设置:
二、AVFoundation日志中的_tundra后缀含义
_Tundra是苹果AVFoundation框架内部的私有模块代号,属于内部开发时的组件命名标识,用于区分不同功能分支或硬件适配版本(比如针对多通道音频的特定实现)。这类内部代号不会对外公开文档,外部开发者无需深究,只需遵循公开API的使用规范即可。
内容的提问来源于stack exchange,提问作者DanM
相关产品推荐
相关产品推荐

