c语言编程解析.wav语音文件

概述

本文使用c语言编程实现语音文件的解析,得到采样频率,语音频道,语音长度,采样深度等信息。语音文件读入采用命令行方式。对语音文件进行解析,得到语音信息,同时打印结果,命令行传参输入,如果输入参数不对或输入错误均能进行判断,给出提示。如果输入为wavinfo.exe -i test.wav表示将test.wav语音信息打印到屏幕,如果输入为wavinfo.exe -i test.wav -o test.txt表示将test.wav语音信息保存到test.txt文件中。
本文中调用了自己编写的wav.h程序文件

程序

wavinfo.c主程序

 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
 #include <stdlib.h>
 #include "wave.h"
 int main(int argc,char* argv[])  //命令行传参
 {
     FILE *fp = NULL;
	 FILE *fp1 = NULL; 
     Wav wav;  //使用wve.h中的结构体重命名为wav
     RIFF_t riff;
     FMT_t fmt;
     Data_t data;
	 char* str1 = "-i";  //用于比较第二个输入参数是否为-i
	 char* str2 = "-o";  //用于比较第四个输入参数是否为-o
	 if(argc==3)   //判断输入参数个数,如果不为2个就报错
     {
		if (strcmp(str1,argv[1])==0)  //如果第二个输入参数不为-i,则输入错误
		{
			//printf("第二个输入参数为-i,输入正确");
		
		fp=fopen(argv[2],"rb");   //打开.wav语音文件
   
		if (!fp) //打开失败
		{
			 printf("can't open audio file\n");
			 exit(1);
		 }
		 fread(&wav, 1, sizeof(wav), fp);  //读入语音文件
		 
		 riff = wav.riff;  //调用结构体,附给riff
		 fmt = wav.fmt;
		 data = wav.data;
         printf("SampleRate(HZ)= %d\n", fmt.SampleRate);    //SampleRate为采样率
	     printf("length= %d\n", data.Subchunk2Size/2);
	     printf("Channel= %d\n", fmt.NumChannels);   //NumChannels是WAV音频文件的声道数量
         printf("depth(bit)= %d\n", fmt.BitsPerSample);   //BitsPerSample为每秒采样比特,有的地方称它为量化精度或者PCM位宽(depth(bit))
     printf("语音长度= %lf\n", (double)data.Subchunk2Size / fmt.ByteRate);
		}
		else
		{
			printf("输入的第二个参数错误,应为-i");
		}
	  }
    
	if(argc==5)   //判断输入参数个数,如果不为2个就报错
    {
		if (strcmp(str1,argv[1])==0)  //如果第四个输入参数不为-o,则输入错误
		{
		fp=fopen(argv[2],"rb");    //打开.wav语音文件
		fp1=fopen(argv[4],"w");   //打开文件,只写,用于将数组内容重新保存到另一个文件中
   
	if (!fp)   //打开失败
	{
         printf("can't open audio file\n");
         exit(1);
     }
     fread(&wav, 1, sizeof(wav), fp);  //读入文件
     
     riff = wav.riff;  //调用结构体,附给riff
     fmt = wav.fmt;
     data = wav.data;
		
	fprintf(fp1,"SampleRate(HZ)=%d\n",fmt.SampleRate);  //将采样率数据保存到test1.txt文件中
	fprintf(fp1,"length= %d\n",data.Subchunk2Size/2);    //将语音长度数据保存到test1.txt文件中
	fprintf(fp1,"Channel= %d\n",fmt.NumChannels);    //将语音频道数据保存到test1.txt文件中
	fprintf(fp1,"depth(bit)= %d\n",fmt.BitsPerSample);   
	fprintf(fp1,"语音长度= %lf\n",(double)data.Subchunk2Size / fmt.ByteRate); 
		}
		else  //第四个参数不为-o
		{
			printf("输入的第四个参数错误,应为-o");
		}
	}
if(argc==2||argc==4)   //判断输入参数个数,如果为2个或4个就报错
    {
       printf("输入参数个数错误,请重新输入\n如果是要将数据打印出来,则需要输入三个参数,输入格式为:wavinfo.exe -i test.wav\n其中-i表示输入,test.wav为语音文件\n\n如果是要将数据保存到文件,则需要输入五个参数,输入格式为:wavinfo.exe -i test.wav  -o test.txt\n其中-i表示输入,test.wav为语音文件,-o表示输出,test.txt为数据存入的文件名称");
       return -1;	
	}
	fclose(fp);  //关闭文件,释放指向文件的指针
	fclose(fp1);  //关闭文件,释放指向文件的指针
 }

wav.h程序

typedef struct WAV_RIFF {
    char ChunkID[4];   /* "RIFF" */
    uint32_t ChunkSize; /* 36 + Subchunk2Size */
    char Format[4];    /* "WAVE" */
} RIFF_t;    //给WAV_RIFF取别名为RIFF_t 

typedef struct WAV_FMT {
    char Subchunk1ID[4];   /* "fmt " */
    uint32_t Subchunk1Size; /* 16 for PCM */
    uint16_t AudioFormat;   /* PCM = 1*/
    uint16_t NumChannels;   /* Mono = 1, Stereo = 2, etc. */
    uint32_t SampleRate;    /* 8000, 44100, etc. */
    uint32_t ByteRate;  /* = SampleRate * NumChannels * BitsPerSample/8 */
    uint16_t BitsPerSample; /* 8bits, 16bits, etc. */
} FMT_t;    //给WAV_FMT取别名为FMT_t,到时候如果要使用这个结构体,就可以使用FMT_t代替WAV_FMT

typedef struct WAV_data {
    char Subchunk2ID[4];   /* "data" */
    uint32_t Subchunk2Size; /* data size */
} Data_t;    //给WAV_data取别名为Data_t

typedef struct WAV_fotmat {
   RIFF_t riff;
   FMT_t fmt;
   Data_t data;
} Wav;    //给WAV_fotmat取别名为Wav

运行结果

C:\Users\CL\Desktop\学习\程序>tcc wavinfo.c

C:\Users\CL\Desktop\学习\程序>wavinfo.exe -i test.wav
SampleRate(HZ)= 8000
length= 19000
Channel= 1
depth(bit)= 2
语音长度= 2.375000
C:\Users\CL\Desktop\学习\程序>wavinfo.exe -o test.wav
输入的第二个参数错误,应为-i
C:\Users\CL\Desktop\学习\程序>wavinfo.exe -i test.wav -o test.txt

C:\Users\CL\Desktop\学习\程序>wavinfo.exe -i test.wav -o
输入参数个数错误,请重新输入
如果是要将数据打印出来,则需要输入三个参数,输入格式为:wavinfo.exe -i test.wav
其中-i表示输入,test.wav为语音文件

如果是要将数据保存到文件,则需要输入五个参数,输入格式为:wavinfo.exe -i test.wav  -o test.txt
其中-i表示输入,test.wav为语音文件,-o表示输出,test.txt为数据存入的文件名称
C:\Users\CL\Desktop\学习\程序>wavinfo.exe -i
输入参数个数错误,请重新输入

本文所有程序代码下载:
链接:https://pan.baidu.com/s/1XeaDR6T3PeUDYSQhpUtP2Q
提取码:65ma

发布了52 篇原创文章 · 获赞 2 · 访问量 7228
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览