輸入:
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
命令行運行結果