作者hardman1110 (笨小孩)
看板C_and_CPP
標題[問題] wav檔案data讀取
時間Tue Oct 2 14:49:21 2012
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
vc2008
額外使用到的函數庫(Library Used): (Ex: OpenGL, ...)
non
問題(Question):
標頭擷取都無誤,但是data擷取會錯誤,我用fopen打開音訊檔,用fread讀取後再用
fwrite寫入另一個檔案,但是輸出的音訊檔聲音完全跑掉,我規格是參考以下網頁
https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
餵入的資料(Input):
取名為04.wav的錄音檔
預期的正確結果(Expected Output):
輸出一模一樣的音訊檔out.wav
錯誤結果(Wrong Output):
輸出入的音訊檔完全不一樣,只有大小一樣...
程式碼(Code):(請善用置底文網頁, 記得排版)
#include <math.h>
#include <stdlib.h>
#include <iostream>
#include "fun.h"
int main(void)
{
int i;
int cnt=0;
char right,left;
char ddd[100];
unsigned char ttt[100];
FILE *fp1,*fp2,*fp3;
wave_t input;
fp1=fopen("04.wav","r");
fp2=fopen("tmp.txt","w+");
fp3=fopen("out.wav","w");
fprintf(fp2,"left\tright\n");
printf("read header\n");
///////read header///////////
fread(&input.ChunkID,4,1,fp1);
fread(&input.ChunkSize,4,1,fp1);
fread(&input.Format,4,1,fp1);
fread(&input.Subchunk1ID,4,1,fp1);
fread(&input.Subchunk1Size,4,1,fp1);
fread(&input.AudioFormat,2,1,fp1);
fread(&input.NumChannels,2,1,fp1);
fread(&input.SampleRate,4,1,fp1);
fread(&input.ByteRate,4,1,fp1);
fread(&input.BlockAlign,2,1,fp1);
fread(&input.BitsPerSample,2,1,fp1);
fread(&input.Subchunk2ID,4,1,fp1);
fread(&input.Subchunk2Size,4,1,fp1);
printf("size is %d bytes \n",input.Subchunk2Size);
printf(" %d Channels \n",input.NumChannels);
printf("read data\n");
////////write header/////////////
fwrite(&input.ChunkID,4,1,fp3);
fwrite(&input.ChunkSize,4,1,fp3);
fwrite(&input.Format,4,1,fp3);
fwrite(&input.Subchunk1ID,4,1,fp3);
fwrite(&input.Subchunk1Size,4,1,fp3);
fwrite(&input.AudioFormat,2,1,fp3);
fwrite(&input.NumChannels,2,1,fp3);
fwrite(&input.SampleRate,4,1,fp3);
fwrite(&input.ByteRate,4,1,fp3);
fwrite(&input.BlockAlign,2,1,fp3);
fwrite(&input.BitsPerSample,2,1,fp3);
fwrite(&input.Subchunk2ID,4,1,fp3);
fwrite(&input.Subchunk2Size,4,1,fp3);
////////copy audio raw data/////////////
for(i=0;i<input.Subchunk2Size;i++){
fread(&left,1,1,fp1);
fwrite(&left,1,1,fp3);
}
printf("%d\n",cnt);
printf("end\n");
fclose(fp1);
fclose(fp2);
fclose(fp3);
return 0;
}
補充說明(Supplement):
懇請各位大大指點我錯在哪,我標頭讀寫都無誤,但data讀寫都會錯
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 163.13.132.117
推 LPH66:fp1 fp3 的 mode 加個 b (變成 "rb"/"wb") 10/02 16:47
→ hardman1110:原來是這樣...非常謝謝你,我還在想怎麼只某些地方對 10/02 17:25