0

私はプログラミングに本当に慣れていないので、皆さんからの助けはとても役に立ち、とても感謝しています. ちなみにC++です。ヘッダーを正常に読み取った wave ファイルがあります。最初のウェーブ ファイルの 1 つおきのデータ値を出力として持つ別のウェーブ ファイルを作成したいと考えています。各値は、最初のファイルからの 2 つの平均になります。

これにより、サンプル数が半分になります。適切な速度で再生するには、サンプリング周波数が半分になるように、2 番目の wave ファイルのヘッダー情報を変更する必要があります。ただし、fwrite を使用しようとすると、算術演算ができないようです。最初のファイルと同じヘッダーを持つ 2 番目の wave ファイルの書き込みに成功しましたが、いくつかの値を変更する必要があります。

単純なデータ型が間違っているだけだと本当に思いますが、初心者のプログラマーなのでわかりません。

FILE* fptr2;                        // File pointer for WAV output
fptr2 = fopen("KingdomOut.wav","w");    // Open wav file for reading


int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;

cout << ChunkSizeOut << endl;

// RIFF chunk descriptor
fwrite(HeaderInfo.ChunkID, sizeof(char), 4, fptr2);             // "RIFF"
fwrite(&HeaderInfo.ChunkSize, sizeof(int), 1, fptr2);           // 4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
fwrite(HeaderInfo.Format, sizeof(char), 4, fptr2);              // "WAVE"
// fmt sub-chunk
fwrite(HeaderInfo.Subchunk1ID, sizeof(char), 4, fptr2);         // "fmt "
fwrite(&HeaderInfo.Subchunk1Size, sizeof(int), 1, fptr2);       // bytes remaining in subchunk, 16 if uncompressed
fwrite(&HeaderInfo.AudioFormat, sizeof(short), 1, fptr2);       // 1 = uncompressed
fwrite(&HeaderInfo.NumChannels, sizeof(short), 1, fptr2);       // mono or stereo
fwrite(&HeaderInfo.SampleRate, sizeof(int), 1, fptr2);
fwrite(&HeaderInfo.ByteRate, sizeof(int), 1, fptr2);            // == SampleRate * NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BlockAlign, sizeof(short), 1, fptr2);        // == NumChannels * BitsPerSample/8
fwrite(&HeaderInfo.BitsPerSample, sizeof(short), 1, fptr2);         
// data sub-chunk
fwrite(HeaderInfo.Subchunk2ID, sizeof(char), 4, fptr2);         // "data"
fwrite(&HeaderInfo.Subchunk2Size, sizeof(int), 1, fptr2);       // == NumSamples * NumChannels * BitsPerSample/8

fclose(fptr2);

これは、最初のデータを使用した 2 番目の wave ファイルの書き込みです。(最初の wav ファイルのヘッダーは、HeaderInfo という構造体にあります)。このコードは完全に機能しますが、&HeaderInfo.Chunksize を一番上にある値 ChunkSizeOut に変更したいと思います。int 型の変数は互換性がないと表示されているため、単純に値を入力することはできません。私はもっ​​と多くのことを試しましたが、何もうまくいかないようです。&HeaderInfo.Chunksize で演算を実行しようとしましたが、それはできません。これ以外の変数も変更しますが、形式はすべて同じです。

私を助けてください、私はとても感謝しています。

4

2 に答える 2

1

fopen通話についてお読みください。'b'バイナリファイルを書き込むときは、次のようにオープンモードにa を追加する必要があります

fptr2 = fopen("KingdomOut.wav","wb");    // Open wav file for reading

のないデフォルトは'b'、ファイルをテキストモードで開くため、一部のバイトが異なる方法で書き込まれる可能性があります (より具体的には、値0x0aがシーケンスとして書き込まれ、0x0d改行0x0aが改行改行'\n'に変換される可能性があります"\r\n") 。 .

于 2013-10-21T06:13:07.790 に答える
0

HeaderInfo は構造体のようですが、ChunkSize フィールドの型は何ですか? この構造体が宣言されたヘッダー ファイル (*.h は、おそらく riff.h または wave.hi ではなく、使用しているライブラリの種類) で宣言を見つけようとします。あなたのコードによると、どの方法でも HeaderInfo.ChunkSize は int 値でなければなりません。だからあなたはそのようなことを試すことができます:

int ChunkSizeOut = ((int)HeaderInfo.ChunkSize)/2 + 18;

それ以外の:

int ChunkSizeOut = (HeaderInfo.ChunkSize)/2 + 18;
于 2013-10-21T06:21:37.370 に答える