WAVチャンクの作成

私は既存のWAVファイルにカスタムチャンクを追加しようとしています。私はmmioCreateChunk関数を使用していますが、実行後には何もファイルに変更されません。私のプログラムのコードは次のとおりです:

#include  
#include  
#include 
#include 

using namespace std;

#pragma comment( lib, "winmm" )

int main() 
{
  HMMIO       hmmio;                //file handle for open file 
  MMCKINFO    mmckinfoParent;       //parent chunk information 
  MMCKINFO    mmckinfoFormatChunk;  //Format chunk information structure 
  MMCKINFO    mmckinfoDataChunk;    //Data chunk information structure
  MMCKINFO    mmckinfoRdibChunk;    //Rdib chunk information structure

 //Open the file for reading with buffered I/O 
 //by using the default internal buffer   
  if(!(hmmio = mmioOpen(L"out.wav", NULL, 
    MMIO_READ))) 
  { 
    cout << "Error opening file." << endl;
    return 0; 
  }

 //Locate a "RIFF" chunk with a "WAVE" form type to make 
 //sure the file is a waveform-audio file. 
  mmckinfoParent.fccType = mmioFOURCC('W', 'A', 'V', 'E'); 
  if (mmioDescend(hmmio, (LPMMCKINFO) &mmckinfoParent, NULL, 
    MMIO_FINDRIFF)) 
  { 
    cout << "This is not a waveform-audio file." << endl; 
    mmioClose(hmmio, 0); 
    return 0; 
  }

 //Find the "FMT" chunk (form type "FMT"); it must be 
 //a subchunk of the "RIFF" chunk. 
  mmckinfoFormatChunk.ckid = mmioFOURCC('f', 'm', 't', ' '); 
  if (mmioDescend(hmmio, &mmckinfoFormatChunk, &mmckinfoParent, 
    MMIO_FINDCHUNK)) 
  { 
    cout << "Waveform-audio file has no \"FMT\" chunk." << endl; 
    mmioClose(hmmio, 0); 
    return 0; 
  }

  unsigned int fmtSize = mmckinfoFormatChunk.cksize;
  char * waveFmt = new char[fmtSize];
  mmioRead(hmmio, waveFmt, mmckinfoFormatChunk.cksize);

  mmioAscend(hmmio, &mmckinfoFormatChunk, 0); 

 //Find the data subchunk. The current file position should be at 
 //the beginning of the data chunk; however, you should not make 
 //this assumption. Use mmioDescend to locate the data chunk. 
  mmckinfoDataChunk.ckid = mmioFOURCC('d', 'a', 't', 'a'); 
  if (mmioDescend(hmmio, &mmckinfoDataChunk, &mmckinfoParent, 
    MMIO_FINDCHUNK)) 
  { 
    cout << "Waveform-audio file has no data chunk." << endl; 
    mmioClose(hmmio, 0); 
    return 0;
  }

  unsigned int size = mmckinfoDataChunk.cksize;
  char* data = new char[size];
  mmioRead(hmmio, data, size);
  mmioClose(hmmio, 0);

  ifstream fs;
  fs.open("out.txt");

 //get length of file:
  fs.seekg (0, ios::end);
  int length = fs.tellg();
  fs.seekg (0, ios::beg);

 //allocate memory:
  char* buffer = new char [length];

 //read data as a block:
  fs.read (buffer,length);
  fs.close();

  HMMIO hmmio_out;

  //Creating new wav file.
  hmmio_out = mmioOpen(L"test.wav", 0, MMIO_CREATE | MMIO_WRITE);

  //Creating RIFF chunk
  mmioCreateChunk(hmmio_out, &mmckinfoParent, MMIO_CREATERIFF);

  //Creating format chunk and inserting information from source file
  mmioCreateChunk(hmmio_out, &mmckinfoFormatChunk, 0);
  mmioWrite(hmmio_out, waveFmt, mmckinfoFormatChunk.cksize);

  mmioAscend(hmmio_out, &mmckinfoFormatChunk, 0);

  //Creating data chunk and inserting information from source file
  mmioCreateChunk(hmmio_out, &mmckinfoDataChunk, 0);
  mmioWrite(hmmio_out, data, mmckinfoDataChunk.cksize);

  mmioAscend(hmmio_out, &mmckinfoDataChunk, 0);

  //Creating new rdib chunk and inserting information from out.txt
  mmckinfoRdibChunk.ckid = mmioFOURCC('r', 'd', 'i', 'b');
  mmckinfoRdibChunk.cksize = sizeof(char) * length;
  mmioCreateChunk(hmmio_out, &mmckinfoRdibChunk, 0);

  mmioWrite(hmmio_out, buffer, sizeof(char) * length);

  mmioAscend(hmmio_out, &mmckinfoRdibChunk, 0);

 //Close the file. 
  mmioClose(hmmio_out, 0); 

  return 0; 
}

私は新しい塊を作るために何をしなければならないのですか?

0

3 答え

mmioDescendは、現在のファイル位置での検索を開始します。それで、あなたはちょうどあなたが書いたチャンクを見つけられません。最初にファイルの位置を開始位置または以前のチャンクにリセットする必要があります。 他のチャンクフィールド(ckSizeとfccType)を正しく設定しましたか? おそらく、チャンクを作成した後にmmioAscendを実行して、パディングを正しく行う必要があります。

1
追加された
チャンクの長さをファイルの長さに設定していますか?チャンクは完全ではないかもしれません(それはバイト数が偶数でなければなりません)、それがRIFFビューには見えないかもしれません。
追加された 著者 Han,
私はリフファイルの構造を見るためにRIFFビューアプリケーションを使用していますが、新しいチャンクを見つけることはできません。しかし、私がメモ帳でファイルを開いている場合、私はそれに挿入された情報を見ることができます。それが私の問題です。編集したトピックのメインメッセージに表示される新しいコードです。
追加された 著者 Alexander Taraymovich,
hmmio_out = mmioOpen(L"test.wav", 0, MMIO_CREATE | MMIO_WRITE);

すべきである

hmmio_out = mmioOpen(L"test.wav", 0, MMIO_CREATE | MMIO_READWRITE);

注意:MMIO_CREATEのためにファイルの内容を消去します。

0
追加された

RIFF仕様の内部を参照してください。

成功した場合、 mmioCreateChunk()は現在のファイルの位置を   新しいチャンクのデータ領域の開始(チャンクの後)   RIFFまたはLISTチャンクのタイプ)。 チャンクの内容は、   mmioWrite()、またはを使って書かれたサブチャンクは、   mmioCreateChunk()を呼び出します。 mmioCreateChunk()は、   チャンクは途中で既に存在するファイルに挿入されます。これが試みられると、   ファイル内の既存のデータは上書きされます。

0
追加された
私も新しいファイルを作成し、既存のファイルからそのファイルにデータをコピーしようとしましたが、結果は同じでした。
追加された 著者 Alexander Taraymovich,
このファイルに書きたい情報を追加しますが、チャンクとして認識しません。
追加された 著者 Alexander Taraymovich,