C语言实现WAV混音

2023-10-21 16:50
文章标签 语言 实现 混音 wav

本文主要是介绍C语言实现WAV混音,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

为什么80%的码农都做不了架构师?>>>   hot3.png

#include <stdio.h>
#include <stdlib.h>
#include <math.h>#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(int argc, char *argv[]) {if(argc!=argc){printf("error!\n");return 0;}FILE * fp1, *fp2, *fpm;fp1 = fopen(argv[1], "rb");fp2 = fopen(argv[2], "rb");fpm = fopen(argv[3], "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( data1 < 0 && data2 < 0)date_mix = data1+data2 - (data1 * data2 / -(pow(2,16-1)-1));elsedate_mix = data1+data2 - (data1 * data2 / (pow(2,16-1)-1));*/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("OK Done!\n");
}

可以在centos下编译
# gcc -o hunyun hunyun.c
# ./hunyun 1.wav 2.wav 3.pcm

wav文件要编码一样才可以




转载于:https://my.oschina.net/yecao/blog/181150

这篇关于C语言实现WAV混音的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/255686

相关文章

使用Redis实现会话管理的示例代码

《使用Redis实现会话管理的示例代码》文章介绍了如何使用Redis实现会话管理,包括会话的创建、读取、更新和删除操作,通过设置会话超时时间并重置,可以确保会话在用户持续活动期间不会过期,此外,展示了... 目录1. 会话管理的基本概念2. 使用Redis实现会话管理2.1 引入依赖2.2 会话管理基本操作

mybatis-plus分表实现案例(附示例代码)

《mybatis-plus分表实现案例(附示例代码)》MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,:本文主要介绍my... 目录文档说明数据库水平分表思路1. 为什么要水平分表2. 核心设计要点3.基于数据库水平分表注意事项示例

C#高效实现在Word文档中自动化创建图表的可视化方案

《C#高效实现在Word文档中自动化创建图表的可视化方案》本文将深入探讨如何利用C#,结合一款功能强大的第三方库,实现在Word文档中自动化创建图表,为你的数据呈现和报告生成提供一套实用且高效的解决方... 目录Word文档图表自动化:为什么选择C#?从零开始:C#实现Word文档图表的基本步骤深度优化:C

nginx跨域访问配置的几种方法实现

《nginx跨域访问配置的几种方法实现》本文详细介绍了Nginx跨域配置方法,包括基本配置、只允许指定域名、携带Cookie的跨域、动态设置允许的Origin、支持不同路径的跨域控制、静态资源跨域以及... 目录一、基本跨域配置二、只允许指定域名跨域三、完整示例四、配置后重载 nginx五、注意事项六、支持

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

MySQL查看表的历史SQL的几种实现方法

《MySQL查看表的历史SQL的几种实现方法》:本文主要介绍多种查看MySQL表历史SQL的方法,包括通用查询日志、慢查询日志、performance_schema、binlog、第三方工具等,并... 目录mysql 查看某张表的历史SQL1.查看MySQL通用查询日志(需提前开启)2.查看慢查询日志3.

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

使用Python实现局域网远程监控电脑屏幕的方法

《使用Python实现局域网远程监控电脑屏幕的方法》文章介绍了两种使用Python在局域网内实现远程监控电脑屏幕的方法,方法一使用mss和socket,方法二使用PyAutoGUI和Flask,每种方... 目录方法一:使用mss和socket实现屏幕共享服务端(被监控端)客户端(监控端)方法二:使用PyA

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp