以命令行的格式讀取音頻文件信息,並將讀取的內容寫到輸出文件中


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

命令行運行結果

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章