音频混音算法的实现

最近项目有用到混音算法,这里用比较常见的一种,就是简单的加和之后做一下归一化。

是参考这个博主实现的:
音频混音的算法实现

下面直接贴代码:

c 复制代码
#include <stdio.h>  
#include <stdlib.h>  
#include <math.h>  
   
#define IN_FILE1 "mic.wav"  
#define IN_FILE2 "spk.wav"  
#define OUT_FILE "remix.pcm"  
   
#define SIZE_AUDIO_FRAME (2)  
   
void Mix(char sourseFile[10][SIZE_AUDIO_FRAME],int number,char *objectFile)  
{  
    //归一化混音  
    int const MAX=32767;  
    int const MIN=-32768;  
   
    double f=1;  
    int output;  
    int i = 0,j = 0;  
    for (i=0;i<SIZE_AUDIO_FRAME/2;i++)  
    {  
        int temp=0;  
        for (j=0;j<number;j++)  
        {  
            temp+=*(short*)(sourseFile[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*)(objectFile+i*2)=(short)output;  
    }  
}  
   
int main()  
{  
    FILE * fp1,*fp2,*fpm;  
    fp1 = fopen(IN_FILE1,"rb");  
    fp2 = fopen(IN_FILE2,"rb");  
    fpm = fopen(OUT_FILE,"wb");  
       
    short data1,data2,date_mix;  
    int ret1,ret2;  
    char sourseFile[10][2];  
   
    while(1)  
    {  
        ret1 = fread(&data1,2,1,fp1);  
        ret2 = fread(&data2,2,1,fp2);  
        *(short*) sourseFile[0] = data1;  
        *(short*) sourseFile[1] = data2;  
           
        if(ret1>0 && ret2>0)  
        {  
            Mix(sourseFile,2,(char *)&date_mix);  
            if(date_mix > pow(2,16-1) || date_mix < -pow(2,16-1))  
                printf("mix error\n");  
        }  
        else if( (ret1 > 0) && (ret2==0))  
        {  
            date_mix = data1;  
        }  
        else if( (ret2 > 0) && (ret1==0))  
        {  
            date_mix = data2;  
        }  
        else if( (ret1 == 0) && (ret2 == 0))  
        {  
            break;  
        }  
        fwrite(&date_mix,2,1,fpm);  
    }  
    fclose(fp1);  
    fclose(fp2);  
    fclose(fpm);  
    printf("Done!\n");  
}  

关键函数在Mix函数里面实现,实现上来看就是加在一起,然后做一个归一化处理,就是为了防止达到上限设置了一下归一化。

测试上可以用两个dtmf的声音来测试,结果如下

相关推荐
美狐美颜sdk14 分钟前
直播APP开发技术架构解析:从音视频流到第三方美颜SDK接入的完整方案
大数据·人工智能·音视频·美颜sdk·美颜api
wabs66615 分钟前
关于图论【A*算法 | 卡码网127.骑士的攻击的思考】
数据结构·算法·图论·卡码网·广搜的改进版
CIO_Alliance22 分钟前
AI认知系列(3)| 数据、算法、算力、场景四要素协同
人工智能·算法·ipaas·系统集成·企业cio联盟·企业级ai化转型
阿童木写作2 小时前
跨境电商图片翻译工具推荐:跨马翻译批量处理视频字幕与抠图
python·音视频
m0_547486662 小时前
《数据结构与算法》全套PPT课件2026(中国海洋大学)
数据结构·算法
旖旎夜光2 小时前
LeetCode 904:水果成篮(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
奈斯先生Vector2 小时前
AI 视频不是会动的图片:用 Shot Contract、时间码与音画质检构建可交付流水线
人工智能·重构·架构·prompt·aigc·音视频
ai产品老杨2 小时前
AI视频分析并发优化参数配置说明
人工智能·音视频
怪奇云呼军3 小时前
G.711、Opus 和重采样会拖慢识别吗?闪电智能VoiceAgent 的音频入口怎么选
java·人工智能·python·算法·云计算·音视频
DogDaoDao3 小时前
MSU 2026 视频编解码大赛放榜深度解读
音视频·视频编解码·hevc·av1·h266·msu·avs