2

Wave ファイルからヘッダー変数を読み取り、それらが何であるかを表示する必要があります。次のコードを使用していますが、出力の数値が大きすぎます。私は何時間も解決策を探してきました。助けていただければ幸いです。ありがとう。https://ccrma.stanford.edu/courses/422/projects/WaveFormat/から Wave サウンドファイル形式を取得しました。

出力: Wav file header information: Filesize 3884 bytes RIFF header RIFF WAVE header WAVE Subchunk1ID fmt Chunk Size (based on bits used) 604962816 Subchunk1Size 268435456 Sampling Rate 288030720 Bits Per Sample 2048 AudioFormat 256 Number of channels 2048 Byte Rate 288030720 Subchunk2ID Subchunk2Size 1684108385

ソースは次のとおりです。

#include <stdio.h>
#include <stdlib.h>

typedef struct  WAV_HEADER
{
char                RIFF[4];        
int                 ChunkSize;     
char                WAVE[4];       
char                fmt[4];        
int                 Subchunk1Size;                              
short int           AudioFormat;  
short int           NumOfChan;      
int                 SamplesPerSec;  
int                 bytesPerSec;    
short int           blockAlign;    
short int           bitsPerSample;  
int                 Subchunk2Size; 
char                Subchunk2ID[4];
}wav_hdr; 

int getFileSize(FILE *inFile); 
int main(int argc,char *argv[])
{
//check startup conditions
if(argc >= 2); //we have enough arguments -- continue
else { printf("\nUSAGE: program requires a filename as an argument -- please try again\n"); exit(0);}

wav_hdr wavHeader;
FILE *wavFile;
int headerSize = sizeof(wav_hdr),filelength = 0;
wavFile = fopen(argv[1],"r");
if(wavFile == NULL)
{
    printf("Unable to open wave file\n");
    exit(EXIT_FAILURE);
}
fread(&wavHeader,headerSize,1,wavFile);
filelength = getFileSize(wavFile);
fclose(wavFile);
printf("\nWav file header information:\n");
printf("Filesize\t\t\t%d bytes\n",filelength);
printf("RIFF header\t\t\t%c%c%c%c\n",wavHeader.RIFF[0],wavHeader.RIFF[1],wavHeader.RIFF[2],wavHeader.RIFF[3]);
printf("WAVE     header\t\t\t%c%c%c%c\n",wavHeader.WAVE[0],wavHeader.WAVE[1],wavHeader.WAVE[2],wavHeader.WAVE[3]);
     printf("Subchunk1ID\t\t\t%c%c%c%c\n",wavHeader.fmt[0],wavHeader.fmt[1],wavHeader.fmt[2],wavHeader.fmt[3]);
printf("Chunk Size (based on bits used)\t%d\n",wavHeader.ChunkSize);
printf("Subchunk1Size\t\t\t%d\n",wavHeader.Subchunk1Size);
printf("Sampling Rate\t\t\t%d\n",wavHeader.SamplesPerSec); //Sampling frequency of the wav file
printf("Bits Per Sample\t\t\t%d\n",wavHeader.bitsPerSample); //Number of bits used per sample
printf("AudioFormat\t\t\t%d\n",wavHeader.AudioFormat);
printf("Number of channels\t\t%d\n",wavHeader.bitsPerSample);     //Number of channels (mono=1/sterio=2)
printf("Byte Rate\t\t\t%d\n",wavHeader.bytesPerSec);   //Number of bytes per second
printf("Subchunk2ID\t\t\t%c%c%c%c\n",wavHeader.Subchunk2ID[0],wavHeader.Subchunk2ID[1],wavHeader.Subchunk2ID[2],wavHeader.Subchunk2ID[3]);
printf("Subchunk2Size\t\t\t%d\n",wavHeader.Subchunk2Size);
printf("\n");
return 0;
}

int getFileSize(FILE *inFile)
{
int fileSize = 0;
fseek(inFile,0,SEEK_END);
fileSize=ftell(inFile);
fseek(inFile,0,SEEK_SET);
return fileSize;
}`
4

2 に答える 2

3

したがって、コードは基本的に機能します。ファイル形式の仕様の作成者が使用していたのと同じコンパイラとO / S(32ビットWindows)を使用してコードをコンパイルする場合です。ファイルのバイトを一致させるために必要なとおりに、コンパイラが構造体を正確にレイアウトしていることを期待しています。たとえば、win32でコンパイルして実行し、WAVファイルを完全に読み取ることができます-可変性をコーディングできなかったヘッダーの可変部分まで。

さまざまなファイル形式を操作するための大量のコードを記述したので、構造体への読み取りをあきらめ、代わりに「次の4バイトを読み取ってintに変換する」などの簡単なユーティリティ関数をいくつか作成することをお勧めします。 。

「余分なフォーマットのバイト」のようなものに注意してください。ファイル形式の一部は、ファイル形式の前の部分の値によって異なります。そのため、通常、ヘッダーを取得するための1つの大きな読み取りではなく、動的な読み取りプロセスと考える必要があります。stat()などのO / S固有のものに依存したり、htonl()などのライブラリ依存関係を追加したりせずにオペレーティングシステム間で機能する移植性の高いCの結果を維持することは難しくありません。同じO/S上の異なるコンパイラオプションでさえも望ましいです。

于 2013-02-19T02:55:33.567 に答える
0

エンディアンの問題に気付いたようですが、それを処理する方法はhtonlntohlhtons、および ですntohs。これは番号の問題の一部です。

ここを読む:

http://www.beej.us/guide/bgnet/output/html/multipage/htonsman.html

ここには、WAV ファイルに関する他の多くの投稿があることに注意してください。それらを読むことを考えましたか?

また、Windows の Windows API またはstatLinux/Unixのいずれかで、サイズなどのファイル情報を取得する標準的な方法があります。

于 2013-02-19T02:22:54.657 に答える