一 代码

转载文章,修改了几处代码风格

#include <stdio.h>
#include <stdlib.h>#define u8 unsigned char
#define u16 unsigned short
#define u32 unsigned int//44字节
typedef struct {u8 riff_mark[4];    //0u32 file_size;       //4u8  wave_str[4]; //8u8  fmt_str[4];u32 pcm_bit_num;u16 pcm_encode;u16 sound_channel;u32 pcm_sample_freq;u32 byte_freq;u16 block_alin;u16 sample_bits;u8  data_mark[4]; u32 sound_size;
} WAV_Typedef;WAV_Typedef WAVFile_Array;u16 *Sound_Data;
u8 *Read_Sound_Data;union Union_Data{char b[4];short s[2];      //这个short千万别定义成u16,否则会有很大的噪音!!! int w;
};
union Union_Data uniondat;int debug_print_cnt;
long fw_cnt;
short currpos=-1;
int main()
{FILE *fp,*fw;int ret;int i,j,res;short s_tmp;char a,b[4]={0};if((fp=fopen("sea.wav","rb"))==NULL)  //打开操作不成功{return 1;}if((fw=fopen("out-sea.wav","wb"))==NULL) //打开操作不成功{return 2;}if(fread(&WAVFile_Array,sizeof(WAVFile_Array),1,fp)==1){printf("wav file read ok!\n");}printf("资源交换文件标志: %.4s\n",WAVFile_Array.riff_mark);printf("文件大小: %d\n",WAVFile_Array.file_size+8);printf("文件格式: %.4s\n",WAVFile_Array.wave_str);printf("波形格式: %.4s\n",WAVFile_Array.fmt_str);printf("PCM: %dbits\n",WAVFile_Array.pcm_bit_num);printf("pcm_encode: %d\n",WAVFile_Array.pcm_encode);printf("声道: %s\n",WAVFile_Array.sound_channel==1?"单声道":"双声道");printf("采样速率: %d\n",WAVFile_Array.pcm_sample_freq);printf("码率: %d Bps\n",WAVFile_Array.byte_freq);printf("块对齐: %d\n",WAVFile_Array.block_alin);printf("采样位宽: %d\n",WAVFile_Array.sample_bits); printf("Data标志: %.4s\n",WAVFile_Array.data_mark); if(memcmp(WAVFile_Array.data_mark,"LIST",4)==0){printf("\n########## 发现LIST类型数据 ###########\n"); fseek(fp,sizeof(WAV_Typedef)-4,SEEK_SET);for(i=0;i<256;i++){if(fgetc(fp)==0x00 && (a=fgetc(fp))!=0x00){if(a=='d'){for(j=0;j<3;j++)b[j]=fgetc(fp);if(memcmp(b,"ata",3)==0){                                                  currpos=ftell(fp);                             printf("\tFound data Mark!!! currpos=%d\n",currpos);                                     break;}}}} if(i<currpos+4){for(j=0;j<4;j++)uniondat.b[j]=fgetc(fp);WAVFile_Array.sound_size=uniondat.w;}}printf("声音数据大小: %d\n",WAVFile_Array.sound_size);if(WAVFile_Array.sound_channel==1){printf("已经是单声道了!!!\n");goto exit; }       /*********** 生成新的单声道文件头部 *****************/WAVFile_Array.sound_channel=1;  WAVFile_Array.sound_size/=2;WAVFile_Array.block_alin/=2;WAVFile_Array.byte_freq/=2;WAVFile_Array.file_size=WAVFile_Array.sound_size+44-8;memcpy(WAVFile_Array.data_mark,"data",4);if(fwrite(&WAVFile_Array,sizeof(WAVFile_Array),1,fw)==1)printf("写入文件信息成功!\n"); elseprintf("############### 写入文件信息失败!!! #################\n");    printf("截取后的声音数据大小: %d\n",WAVFile_Array.sound_size);  Sound_Data=malloc(WAVFile_Array.sound_size*2);Read_Sound_Data=(u8 *)Sound_Data;if(Sound_Data==NULL){printf("malloc failed!\n");   return 2;}debug_print_cnt=20;  fw_cnt=0;for(i=0;i<WAVFile_Array.sound_size/2;i++){res=fread(&uniondat.b,1,4,fp);if(res<=0){printf("fread over,res=%d\n",res);   break;  }if(debug_print_cnt>0){printf("%08X\t",uniondat.w);                     }/* 生成单声道有多种方法,可以左+右再除以2或者只单独提取某一通道 */s_tmp=(uniondat.s[0]+uniondat.s[1])>>1;if(debug_print_cnt>0){    printf("s_tmp= (%04X,%04X=%X)\n",(u16)uniondat.s[0],(u16)uniondat.s[1],(u16)s_tmp);                  }debug_print_cnt--;fw_cnt+=fwrite(&s_tmp,sizeof(s_tmp),1,fw);} printf("total write %d bytes!\n",fw_cnt);if(fw_cnt==WAVFile_Array.sound_size/2){printf("已经成功生成单声道文件了!\n"); }exit: if(fp!=NULL){fclose(fp); }if(fw!=NULL){fclose(fw);  }if(Sound_Data!=NULL){free(Sound_Data);}system("pause");return 0;
}

二 出处

WAV转单声道

WAV 文件双声道转单声道的实现相关推荐

  1. 基于C语言的 WAV 文件双声道转单声道的实现

    这里只处理PCM是16位,encode是PCM格式的波形进行解析: #include <stdio.h> #include <stdlib.h>#define u8 unsig ...

  2. 立体声、双声道、单声道的区别

    http://www.ccet.cn/newsdetail.aspx?newsid=193 假设双声道的左右两声道波形相位一样时,没有立体感 ,其效果和单声道一 样. (也就是说双声道不一定是立体声咯 ...

  3. wav文件的声道数转换(C实现)

    目录 前言 程序的实现及思考 单声道转双声道 双声道转单声道 强制类型转换 结语及参考文章 前言 有关于wav文件的采样位数转换的实验暂时告一段落,接下来本篇文章打算写写有关于如何让wav文件的声道数 ...

  4. 从双声道转单声道看语言/算法性能差异

    目录 一.使用场景 二.算法 1. Java-数组遍历 2. c/c++ -索引遍历 3. c/c++ -指针遍历 三.数据说话 四.总结 一.使用场景 我们都知道不同的语言有不同的特性,所以在比较某 ...

  5. 单声道数据转双声道_单声道转双声道方法

    单声道转双声道方法 前段时间有个朋友问我如何可以将一个音频文件的单声道转换为双声道 [音频文件右键查看 属性 → 摘要 → 音频 → 频道( 1. 单声道 2. 立体声) ] ,于是我推荐他用 Gol ...

  6. 记录一个音频PCM数据由双声道转单声道出错问题

    引言 工作需要将一份 双声道的PCM数据转换成单声道数据,我采用的是将左右声道样点值对应相加求平均样点值的办法. 计算式如下: typedef int s32; typedef unsigned in ...

  7. matlab 生成sine音频文件.wav (双声道.wav)--audiowrite

    1 直接上源码 close all clear all clc%set system parameter fs = 1000; %The frequency of the local oscillat ...

  8. 基于C语言实现把WAV双声道文件差分成两个单声道文件

    本deemo基于下面这篇文章的deemo实现 基于C语言的 WAV 文件双声道转单声道的实现_快乐的老鼠的博客-CSDN博客_wav 双声道转单声道 #include <stdio.h> ...

  9. android声音播放函数双声道合并,Android音视频系列(七):PCM音频单声道与双声道的相互转换...

    前言 上一篇我们已经学习了PCM音频的保存格式,这一篇我们通过掌握的知识,完成PCM音频的单声道和双声道的互相转换. 正文 首先我们把上一篇的最核心部分贴出来: PCM音频保存格式 我们首先完成单声道 ...

最新文章

  1. 大数据处理的关键架构
  2. Hibernate, 想说爱你不容易
  3. Pytorch中图像预处理相关函数
  4. django链接数据库报错Error loading MySQLdb module:No module named MySQLdb
  5. 工作205:修改记录取消文本提示ele提示
  6. 上下伸缩代码_CQRS之旅——旅程4(扩展和增强订单和注册限界上下文)
  7. EBS 报表输出PDF时中文乱码
  8. Robots.txt 协议——百度之星
  9. mvc VIEW部分介绍
  10. 《鬼谷子》决篇第十一(翻译)
  11. ubantu 安装anaconad_Ubuntu16.04安装Anaconda (转)
  12. 数据库系统概论重点总结
  13. java structs_java深入探究12-框架之Structs
  14. MCE | 外泌体的检测提取机制
  15. oracle 限制条数的查询
  16. 鸟枪换炮---IDEA
  17. 开源软件新时代:55个经典开源Wind…
  18. FFT—音频频谱设计
  19. React 官网入门教程 - 井字棋小游戏
  20. c++ cleartype_在Windows Vista中调整ClearType字体设置

热门文章

  1. 手把手的K-means聚类算法教程(含简介及教育数据应用实例 Python实现)
  2. Windows netstat 结合 tasklist 检查 网络连接程序
  3. vue-element-admin 如何跳过登录直接访问主页面
  4. lol1月24服务器维护,2019LOL1月24日更新维护时间一览/更新到什么时候 LOL1月24日维护到几点好能进游戏_蚕豆网新闻...
  5. Postman:测试下载文件时默认打开文件改为弹出下载框
  6. 自动交易股票软件的功能?
  7. 四年 android开发 转 web前端 开发3个月的一点点工作、生活感悟
  8. 窨井液位计(下水道液位计)的分类
  9. LTE 物理层、资源网格配置
  10. Altium Designer PCB制作入门实例