C++ 多路音频pcm混音算法

1、均值化混音算法

不适合商用,声音的损失比较大,不建议用,建议用第二种声音混音

short remix(short pcm1,short pcm2){

int value = pcm1+ pcm2;

return (short)(value/2)

}

2、归一化混音算法

输入数据为48Khz-2-16bit音频数据

方法:为避免发生溢出,使用一个可变的衰减因子对语音进行衰减。这个衰减因子也就代表语音的权重,衰减因子随着音频数据的变化而变化,所以称为自适应加权混音。当溢出时,衰减因子较小,使得溢出的数据在衰减后能够处于临界值以内,而在没有溢出时,又让衰减因子慢慢增大,使数据较为平缓的变化。(PCM音频混合的方法_pcm混音算法-CSDN博客

//归一化混音

void mix(char **src_data, char *mix_data, int channels, int buffer_size)

{

int const MAX = 32767;

int const MIN = -32768;

double f = 1;

int output;

int i = 0, j = 0;

for (i = 0; i < buffer_size / channels; i++)

{

int temp = 0;

for (j = 0; j < channels; j++)

{

temp += *(short*)(src_data[j] + i * channels);

}

output = (int)(temp*f);

if (output > MAX)

{

f = (double)MAX / (double)(output);

output = MAX;

}

if (output < MIN)

{

f = (double)MIN / (double)(output);

output = MIN;

}

if (f < 1)

{

f += ((double)1 - f) / (double)32;

}

*(short*)(mix_data + i * 2) = (short)output;

}

}

调用方法:

char *testSrcData[2] = { NULL };

testSrcData[0] = 声音通道1数据

testSrcData[1] = 声音通道2数据

mix(testSrcData, mix_data, 2, buffer_size);

3、其他方法本人没用过,不好评价,不过感觉第二种够用了,至少目前没什么特别大的反馈
4、混音的思路

采集多路pcm数据-》统一重采样成48Khz-2通道-16bit-》归一化混音

相关推荐
朱古力(音视频开发)4 小时前
NDI开发指南
fpga开发·音视频·实时音视频·视频编解码·流媒体
科技资讯快报10 小时前
法国声学智慧 ,音响品牌SK (SINGKING AUDIO) 重构专业音频边界
重构·音视频
云霄IT12 小时前
python之使用ffmpeg下载直播推流视频rtmp、m3u8协议实时获取时间进度
python·ffmpeg·音视频
WSSWWWSSW15 小时前
Jupyter Notebook 中显示图片、音频、视频的方法汇总
ide·人工智能·jupyter·音视频·python notebook
sukalot20 小时前
window显示驱动开发—Direct3D 11 视频播放改进
驱动开发·音视频
ls_qq_267081347021 小时前
cocos打包web - ios设备息屏及前后台切换音频播放问题
前端·ios·音视频·cocos-creator
科技资讯快报1 天前
法式基因音响品牌SK(SINGKING AUDIO)如何以硬核科技重塑专业音频版图
科技·音视频
天天向上10241 天前
vue2 使用liveplayer加载视频
音视频
WSSWWWSSW1 天前
华为昇腾NPU卡 文生视频[T2V]大模型WAN2.1模型推理使用
人工智能·大模型·音视频·显卡·文生视频·文生音频·文生音乐