以命令行的格式读取音频文件信息,并将读取的内容写到输出文件中

╄→гoц情女王★ 提交于 2020-02-26 13:56:15


输入: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

命令行显示情况
image-20200212132520649.png
在文件中产生output.txt文件,并写入wave文件信息
20200110171043920.png)]

总结:

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

命令行运行结果

在这里插入图片描述

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!