输入:
wavinfo -i xxx.wav -o output.txt
输出:(格式规范)xxx=yyy
rate(Hz)=16000
length=32000
ch=2
depth(bit)=16
c语言实现代码
////命令行输入参数,读取wav文件的信息
#include <stdio.h>
#include <stdint.h> /*struct类型里面我用的是uint32_t等类型,而不是传统的int,short等等
这些类型是由stdint.h头文件提供*/
#include <stdlib.h>
#include <windows.h>
typedef struct wave_tag //声明结构体的相关参数
{
char ChunkID[4]; // "RIFF"标志
unsigned int ChunkSize; // 文件长度(WAVE文件的大小, 不含前8个字节)
char Format[4]; // "WAVE"标志
char SubChunk1ID[4]; // "fmt "标志
unsigned long int SubChunk1Size; // 过渡字节(不定)
unsigned short int AudioFormat; // 格式类别(10H为PCM格式的声音数据)
unsigned short int NumChannels; // 通道数(单声道为1, 双声道为2)
unsigned short int SampleRate; // 采样率(每秒样本数), 表示每个通道的播放速度
unsigned int ByteRate; // 波形音频数据传输速率, 其值为:通道数*每秒数据位数*每样本的数据位数/8
unsigned short int BlockAlign; // 每个样点的Byte数(按字节算), 其值为:通道数*每样本的数据位数/8
unsigned short int BitsPerSample; // 每个样点的数据位数, 表示每个声道中各个样本的数据位数.
char SubChunk2ID[4]; // 数据标记"data"
unsigned long int SubChunk2Size; // 语音数据的长度
} WAVE;
void main(int argc, char *argv[])
{
if (argc != 5) //命令行输入参数判断
{
printf("输入参数有误");
return 0;
}
FILE *fp; //定义指针型文件
FILE *fpWrite; //定义指针型文件
WAVE wav; //调用结构体wav
char a[20];
//输入参数条件设定
if ((**(argv + 1)) == '-')
{
switch (*(*(argv + 1) + 1))//等效于*(argv[1] + 1)
{
case 'i':
fp=fopen(argv[2],"rb"); /*以二进制方式打开并读取(rb)wav文件,
通常r是正常方式读取文件 */
fread(&wav, sizeof(WAVE), 1, fp); //读取文件信息
break;
default:
printf("无此命令,请重新运行\n");
break;
}
}
//输出参数条件设定
if ((**(argv + 3)) == '-')
{
switch (*(*(argv + 3) + 1))//等效于*(argv[1] + 1)
{
case 'o':
fpWrite=fopen(argv[4],"wb");
if((fp = fopen(argv[4],"wb")) == NULL)//查看文件是否创建成功
{
printf("\nerror on open argv[4]!");
getch();
exit(1);
}
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"ChunkID=\t%c%c%c%c \n",wav.ChunkID[0],wav.ChunkID[1],wav.ChunkID[2],wav.ChunkID[3]);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将"RIFF"标志信息写到输出文件中
// fprintf(fpWrite,"%s","\n"); //在文件中写入一个换行符
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"ChunkSize=\t%d\n",wav.ChunkSize);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将WAVE文件长度信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"Format=\t\t%c%c%c%c\n",wav.Format[0],wav.Format[1],wav.Format[2],wav.Format[3]);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将"WAVE"标志信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SubChunk1ID=\t%c%c%c%c\n",wav.SubChunk1ID[0],wav.SubChunk1ID[1],wav.SubChunk1ID[2],wav.SubChunk1ID[3]);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将"fmt"标志信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将过渡字节信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SubChunk1Size=\t%ld\n",wav.SubChunk1Size);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将过渡字节信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"AudioFormat=\t%x\n",wav.AudioFormat);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将格式类别(10H为PCM格式的声音数据)信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"NumChannels=\t%d\n",wav.NumChannels);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将通道数写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SampleRate=\t%d\n",wav.SampleRate);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将采样率写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"ByteRate=\t%d\n",wav.ByteRate);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将波形音频数据传输速率写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"BlockAlign=\t%d\n",wav.BlockAlign);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将个样点的Byte数信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"BitsPerSample=\t%d\n",wav.BitsPerSample);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将每个样点的数据位数信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SubChunk2ID=\t%c%c%c%c \n",wav.SubChunk2ID[0],wav.SubChunk2ID[1],wav.SubChunk2ID[2],wav.SubChunk2ID[3]);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将"data"标志信息写到输出文件中
/*利用sprintf,对输出的内容进行字符串格式化,保存到指定的字符串中*/
sprintf(a,"SubChunk2Size=\t%ld\n",wav.SubChunk2Size);
printf("%s",a);
fprintf(fpWrite,"%s",a); //将数据长度信息写到输出文件中
break;
default:
printf("无此命令,请重新运行\n");
break;
}
}
return 0;
fclose(fpWrite);
}
运行结果
在命令行输入(wavinfo.c需提前编译生成wavinfo.exe)
wavinfo -i E:\\test_wave\\2.wav -o output.txt
命令行显示情况
在文件中产生output.txt文件,并写入wave文件信息
总结:
1.在读wav文件信息时,要注意“r”与“rb”的区别
2.在输入wav文件路径时,要注意wav文件的路径需要用绝对路径,且以\\隔开
3.sprintf(字符串格式转换)的用法
//sprintf的实例
#include <stdio.h>
void main()
{
char s[10] ;
int a=10;
sprintf(s,"a=%d",a);
printf("%s",s);
return 0;
}
运行结果
4.命令行传参实例
c代码
//命令行参数的用法
#include <stdio.h>
void main(int argc,char** argv)
{
printf("%d\n",argc);
printf("%s\n",argv[0]);
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
}
在命令行输入
test_transfer_parameters hello word
命令行运行结果
来源:CSDN
作者:张亚楠·
链接:https://blog.csdn.net/qq_40644291/article/details/104506630