PCM音频混合的方法

音频混音算法的实现

1、线性叠加后求平均

优点:不会产生溢出,噪音较小;

缺点:衰减过大,影响通话质量;

cpp 复制代码
    short  remix(short buffer1,short buffer2)  
    {  
        int value = buffer1 + buffer2;  
        return (short)(value/2);  
    } 

2、归一化混音(自适应加权混音算法)

思路:使用更多的位数(32 bit)来表示音频数据的一个样本,混完音后在想办法降低其振幅,使其仍旧分布在16 bit所能表示的范围之内,这种方法叫做归一法;

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

objectivec 复制代码
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 / 2; i++)  
	//for (i=0; i < buffer_size; i++)  
    {  
        int temp = 0;  
        for (j = 0; j < channels; j++)  
        {  
            //两个文件对应音轨值相加
            temp += *(short*)(src_data[j] + i * 2);  
        }
        
        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;  
    }  
}  

3、PCM脉冲编码的音频信号的混音实现,

objectivec 复制代码
#define WIDEN_TEMP_TYPE int	
#define AUDIO_DATA_TYPE short
#define AUDIO_DATA_TYPE_MAX 32767	// 2^15(short)
#define AUDIO_DATA_TYPE_MIN -32768
void mix1(char **src_data, char *mix_data, int channels, int buffer_size)  
{  
// 初始化中间变量
	WIDEN_TEMP_TYPE tempMul = 1;
	WIDEN_TEMP_TYPE tempSum = 0;
	WIDEN_TEMP_TYPE mixedTempData;
	int howManyPointsArePos = 0;

	int sz = channels;
	int i = 0;
	int j = 0;
	for ( i = 0; i < buffer_size / 2; ++i)
	{
		// 复位中间变量
		tempMul = 1;
		tempSum = 0;

		// 求中间变量
		howManyPointsArePos = 0;								// 统计每个点是不是都是正数
		for ( j = 0; j < sz; ++j)
		{
			tempMul *= *(short*)(src_data[j] + i * 2); 
			tempSum += *(short*)(src_data[j] + i * 2); 

			if (*(short*)(src_data[j] + i * 2) < 0)
				++howManyPointsArePos;
		}

		// 混音
		if (howManyPointsArePos == sz)
			mixedTempData = tempSum - (tempMul / -(pow(2, 16 - 1) - 1));
		else
			mixedTempData = tempSum - (tempMul / (pow(2, 16 - 1) - 1));

		// 防止上下溢出
		if (mixedTempData > AUDIO_DATA_TYPE_MAX)
			mixedTempData = AUDIO_DATA_TYPE_MAX;
		else if (mixedTempData < AUDIO_DATA_TYPE_MIN)
			mixedTempData = AUDIO_DATA_TYPE_MIN;

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

	}
}  
相关推荐
hz5678910 小时前
内网视频会议系统建设方案:适合政企单位的安全会议选择
安全·云计算·音视频·实时音视频·信息与通信
2601_9568657712 小时前
怎么用AI生成带货视频?电商内容创作工具推荐与选择思路
人工智能·aigc·音视频
冰可乐配12 小时前
fmpeg音频编码组件aac(Advanced Audio Coding (AAC) encoder)学习
学习·音视频·aac
气泡音人声分离13 小时前
音频技术解析|混音的底层逻辑:从采样点相加到艺术层次塑造
音视频·混音·音频剪辑
日光明媚14 小时前
LongLive-英伟达-数字人实时生成
人工智能·计算机视觉·aigc·音视频
AI服务老曹14 小时前
GB28181接入AI视频分析常见问题与排查清单:从国标平台注册、通道同步到心跳断线的工程实践
人工智能·音视频
硅谷秋水18 小时前
OMNIDRIVE:一种由LLM协同的多智体世界模型,采用统一潜协压缩技术,用于多视角驾驶视频生成
人工智能·深度学习·机器学习·语言模型·自动驾驶·音视频
ai产品老杨18 小时前
GB28181接入AI视频分析项目实战记录:从国标注册、通道同步到信令调优
人工智能·音视频
Niuguangshuo19 小时前
TTS 架构的六代演进(二):第 1-2 代 · 拼接合成与 HMM-TTS
音视频
最爱老式锅包肉19 小时前
《HarmonyOS技术精讲-蓝牙》传统蓝牙实战:音频播放与文件传输
华为·音视频·harmonyos