webrtc的音频混音源码都在modules\audio_mixer目录下最核心的文件为frame_combiner.h/frame_combiner.cc该文件的类为class FrameCombiner。FrameCombiner是 WebRTC 音频混音器Audio Mixer模块中的核心组件负责将多个输入的音频帧AudioFrame**混合Mix/Sum**成一个单一的输出音频帧。它的主要任务是执行实际的样本级加法运算并处理防止音频削波Clipping的限幅Limiting逻辑。总之FrameCombiner 是 WebRTC 音频会议的数学引擎。它高效地将多路音频信号叠加在一起并通过智能限幅技术保证输出音质的完整性是实现多人实时语音通话不可或缺的基础组件一、核心职责1. 音频混合接收来自不同参与者Remote Streams的音频数据将它们对应的采样点相加。例如如果有两个说话者输出样本 。2. 防削波处理当多个音频信号相加时振幅可能会超过最大允许值对于 float 类型通常是 /- 1.0对于 int16 是 /- 32767。FrameCombiner 使用 Limiter 来平滑地降低增益避免产生刺耳的数字失真。3. 缓冲区管理维护一个固定的浮点数缓冲区 (mixing_buffer_) 用于中间计算避免频繁的内存分配。二、关键成员2.1 mixing_buffer (std::unique_ptrMixingBuffer):• 这是一个二维数组[通道数][样本数]。• kMaximumNumberOfChannels 8: 支持最多 8 个通道通常用于环绕声或特殊配置标准通话为 1 或 2。• kMaximumChannelSize 480: 对应 48kHz 采样率下 10ms 的样本数 ()。• 使用 float 类型进行累加因为浮点数具有更大的动态范围可以在混合过程中暂时容纳超过整型范围的数值最后再转换或限幅。2.2 limiter (Limiter):• 音频限幅器实例。• 如果混合后的信号峰值过高Limiter 会动态调整增益使输出信号保持在合法范围内同时尽量保持音质自然避免剧烈的音量跳动。2.3 use_limiter (bool):构造函数传入的标志位决定是否启用限幅功能。在某些低延迟或特定测试场景下可能会禁用。2.4 data_dumper:用于调试和日志记录可以将混合前后的音频数据dump到文件进行分析。三、核心混音函数void Combine(const std::vectorAudioFrame* mix_list, size_t number_of_channels, int sample_rate, size_t number_of_streams, AudioFrame* audio_frame_for_mixing);这是执行混合操作的核心函数。3.1 参数说明• mix_list: 输入音频帧的指针列表。每个 AudioFrame 代表一个远程参与者的音频数据。• number_of_channels: 输出音频的通道数如 1 为单声道2 为立体声。输入帧会被重采样或混音到此通道数。• sample_rate: 采样率如 48000 Hz。所有输入帧必须与此采样率一致或在进入此函数前已重采样。• number_of_streams: 活跃流的数量。用于判断是否需要应用限幅例如只有一个流时通常不需要限幅除非它本身就过载。• audio_frame_for_mixing: 输出参数。混合后的结果将写入这个 AudioFrame 对象。3.2 内部工作流程逻辑推断1. 初始化缓冲区: 将 mixing_buffer_ 清零。2. 累加样本:• 遍历 mix_list 中的每一个 AudioFrame。• 将每个帧的样本数据通常从 int16 转换为 float累加到 mixing_buffer_ 对应的通道和样本位置上。• 如果是多声道输入可能需要进行下混Downmix到目标 number_of_channels。3. 应用限幅 (Limiter):• 如果 use_limiter_ 为 true 且 number_of_streams 1或信号过大调用 limiter_.Process()。• Limiter 会分析 mixing_buffer_ 中的峰值并应用增益衰减确保最终输出不会削波。4. 写入输出:• 将处理后的 mixing_buffer_ 中的数据转换回 int16_tWebRTC AudioFrame 的标准格式。• 填充 audio_frame_for_mixing 的字段samples_per_channel_, num_channels, sample_rate_hz_, data 等。5. 统计日志: 调用 LogMixingStats 记录混合状态如是否发生了削波限幅器的增益调整量等。四、为什么需要单独的 FrameCombiner• 性能优化: 音频混合是 CPU 密集型操作每 10ms 处理数千次浮点加法。使用预分配的 mixing_buffer_ 避免了每次混合都 new/delete 数组。• 模块化: 将“混合算法”与“混音器调度逻辑”决定谁该被混合、静音处理等分离。AudioMixerImpl 负责调度FrameCombiner 负责数学运算。• 音质保护: 简单的相加会导致严重的削波失真。集成 Limiter 确保了在多人大声说话时输出音频依然清晰且不破音。
webrtc 音频混音介绍
发布时间:2026/6/12 11:34:36
webrtc的音频混音源码都在modules\audio_mixer目录下最核心的文件为frame_combiner.h/frame_combiner.cc该文件的类为class FrameCombiner。FrameCombiner是 WebRTC 音频混音器Audio Mixer模块中的核心组件负责将多个输入的音频帧AudioFrame**混合Mix/Sum**成一个单一的输出音频帧。它的主要任务是执行实际的样本级加法运算并处理防止音频削波Clipping的限幅Limiting逻辑。总之FrameCombiner 是 WebRTC 音频会议的数学引擎。它高效地将多路音频信号叠加在一起并通过智能限幅技术保证输出音质的完整性是实现多人实时语音通话不可或缺的基础组件一、核心职责1. 音频混合接收来自不同参与者Remote Streams的音频数据将它们对应的采样点相加。例如如果有两个说话者输出样本 。2. 防削波处理当多个音频信号相加时振幅可能会超过最大允许值对于 float 类型通常是 /- 1.0对于 int16 是 /- 32767。FrameCombiner 使用 Limiter 来平滑地降低增益避免产生刺耳的数字失真。3. 缓冲区管理维护一个固定的浮点数缓冲区 (mixing_buffer_) 用于中间计算避免频繁的内存分配。二、关键成员2.1 mixing_buffer (std::unique_ptrMixingBuffer):• 这是一个二维数组[通道数][样本数]。• kMaximumNumberOfChannels 8: 支持最多 8 个通道通常用于环绕声或特殊配置标准通话为 1 或 2。• kMaximumChannelSize 480: 对应 48kHz 采样率下 10ms 的样本数 ()。• 使用 float 类型进行累加因为浮点数具有更大的动态范围可以在混合过程中暂时容纳超过整型范围的数值最后再转换或限幅。2.2 limiter (Limiter):• 音频限幅器实例。• 如果混合后的信号峰值过高Limiter 会动态调整增益使输出信号保持在合法范围内同时尽量保持音质自然避免剧烈的音量跳动。2.3 use_limiter (bool):构造函数传入的标志位决定是否启用限幅功能。在某些低延迟或特定测试场景下可能会禁用。2.4 data_dumper:用于调试和日志记录可以将混合前后的音频数据dump到文件进行分析。三、核心混音函数void Combine(const std::vectorAudioFrame* mix_list, size_t number_of_channels, int sample_rate, size_t number_of_streams, AudioFrame* audio_frame_for_mixing);这是执行混合操作的核心函数。3.1 参数说明• mix_list: 输入音频帧的指针列表。每个 AudioFrame 代表一个远程参与者的音频数据。• number_of_channels: 输出音频的通道数如 1 为单声道2 为立体声。输入帧会被重采样或混音到此通道数。• sample_rate: 采样率如 48000 Hz。所有输入帧必须与此采样率一致或在进入此函数前已重采样。• number_of_streams: 活跃流的数量。用于判断是否需要应用限幅例如只有一个流时通常不需要限幅除非它本身就过载。• audio_frame_for_mixing: 输出参数。混合后的结果将写入这个 AudioFrame 对象。3.2 内部工作流程逻辑推断1. 初始化缓冲区: 将 mixing_buffer_ 清零。2. 累加样本:• 遍历 mix_list 中的每一个 AudioFrame。• 将每个帧的样本数据通常从 int16 转换为 float累加到 mixing_buffer_ 对应的通道和样本位置上。• 如果是多声道输入可能需要进行下混Downmix到目标 number_of_channels。3. 应用限幅 (Limiter):• 如果 use_limiter_ 为 true 且 number_of_streams 1或信号过大调用 limiter_.Process()。• Limiter 会分析 mixing_buffer_ 中的峰值并应用增益衰减确保最终输出不会削波。4. 写入输出:• 将处理后的 mixing_buffer_ 中的数据转换回 int16_tWebRTC AudioFrame 的标准格式。• 填充 audio_frame_for_mixing 的字段samples_per_channel_, num_channels, sample_rate_hz_, data 等。5. 统计日志: 调用 LogMixingStats 记录混合状态如是否发生了削波限幅器的增益调整量等。四、为什么需要单独的 FrameCombiner• 性能优化: 音频混合是 CPU 密集型操作每 10ms 处理数千次浮点加法。使用预分配的 mixing_buffer_ 避免了每次混合都 new/delete 数组。• 模块化: 将“混合算法”与“混音器调度逻辑”决定谁该被混合、静音处理等分离。AudioMixerImpl 负责调度FrameCombiner 负责数学运算。• 音质保护: 简单的相加会导致严重的削波失真。集成 Limiter 确保了在多人大声说话时输出音频依然清晰且不破音。