1

これは、.wav ファイルを読み取るためのコードの一部です。

    //Variable
    wavehdr:TWaveHeader;
    ckiRIFF,ckiFmt,ckiData,ckiLIST: TMMCKInfo;
    mmioinfo: PMMIOInfo;
    waveFmt: TWaveFormatEx;
    buf: Array of smallint;
    buf_recon: Array of double;
    list:Array of longint; // THIS IS MY GUESS so it's definetly not work
    HMMIO: hFile;

    //Locate the "RIFF" chunk
    ckiRIFF.fccType := mmioStringToFOURCC('WAVE',0);
    mmioDescend(HMMIO, @ckiRIFF, nil, MMIO_FINDRIFF);
    mmioAscend(HMMIO, @ckiRIFF, MMIO_FINDRIFF);

    //Locate the "FMT" subchunk
    ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
    mmioDescend(HMMIO, @ckiFmt, nil, MMIO_FINDCHUNK);
    mmioRead(HMMIO, @waveFmt, ckiFmt.cksize);
    mmioAscend(HMMIO, @ckiFmt, 0);

    //Locate the "LIST" chunk (THIS PART IS NOT WORK)
    ckiLIST.fccType := mmioStringToFOURCC('LIST',0);
    mmioDescend(HMMIO, @ckiLIST, nil, MMIO_FINDLIST);
    mmioRead(HMMIO, @list, ckiLIST.cksize);
    mmioAscend(HMMIO, @ckiFmt, 0);

    //Locate the "data" subchunk
    ckiData.ckid := mmioStringToFOURCC('data', 0);
    if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then begin
    SetLength(buf, ckiData.cksize);
    mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);

そして、「LIST」を取得することしかできなかったLISTチャンクを見逃したことに気付くまで、それは完璧に機能します。これは、ファイルを読み込んで書き戻す前のファイルの例で、リストチャンクとデータですここに画像の説明を入力

そして、これが私が読んで書き戻した後ですここに画像の説明を入力

私がマークした部分はなくなりました。だから誰かがここで私の間違いを知っているなら、私を助けてください

編集1

ここに画像の説明を入力

4

1 に答える 1

2

あなたのコードには多くの問題があります:

  1. エラーをチェックしていません。
  2. リストを読み取る前に、リストにメモリを割り当てていません。
  3. そもそもWAVファイルには「LIST」チャンクがないため、「LIST」チャンクを正しく読み取っていません。読み取ろうとしているのは、LIST タイプの「INFO」チャンクです。したがって、「INFO」チャンクを見つけて下降し、必要に応じてそのサブチャンクに下降して読み取り、RIFF チャンクに上昇する必要があります。
  4. すべきではないときに、「RIFF」チャンクから上昇しています。

代わりにこれを試してください:

var
  wavehdr: TWaveHeader;
  ckiRIFF, ckiFmt, ckiData, ckiLIST, ckiINAM: TMMCKInfo;
  mmioinfo: PMMIOInfo;
  waveFmt: TWaveFormatEx;
  buf: Array of smallint;
  buf_recon: Array of double;
  HMMIO: hFile;
begin
  ...
  //Locate the "RIFF" chunk
  ckiRIFF.fccType := mmioStringToFOURCC('WAVE',0);
  if mmioDescend(HMMIO, @ckiRIFF, nil, MMIO_FINDRIFF) = 0 then
  begin
    //Locate the "FMT" subchunk
    ZeroMemory(@waveFmt, SizeOf(waveFmt));
    ckiFmt.ckid := mmioStringToFOURCC('fmt', 0);
    if mmioDescend(HMMIO, @ckiFmt, @ckiRIFF, MMIO_FINDCHUNK) = 0 then
    begin
      // technically, you should use a dynamic-length buffer instead of a static buffer
      mmioRead(HMMIO, @waveFmt, ckiFmt.cksize);
      mmioAscend(HMMIO, @ckiFmt, 0);
    end;

    //Locate the "INFO" chunk
    ckiLIST.fccType := mmioStringToFOURCC('INFO', 0);
    if mmioDescend(HMMIO, @ckiLIST, @ckiRIFF, MMIO_FINDLIST) = 0 then
    begin
      //Locate the "INAM" chunk
      ckiINAM.fccType := mmioStringToFOURCC('INAM', 0);
      if mmioDescend(HMMIO, @ckiINAM, @ckiLIST, MMIO_FINDCHUNK) = 0 then
      begin
        // read chunk data as needed...
        mmioAscend(HMMIO, @ckiINAM, 0);
      end;
      mmioAscend(HMMIO, @ckiLIST, 0);
    end;

    //Locate the "data" subchunk
    ckiData.ckid := mmioStringToFOURCC('data', 0);
    if (mmioDescend(HMMIO, @ckiData, @ckiRIFF, MMIO_FINDCHUNK) = MMSYSERR_NOERROR) then
    begin
      SetLength(buf, ckiData.cksize);
      mmioRead(HMMIO, PAnsiChar(buf), ckiData.cksize);
      mmioAscend(HMMIO, @ckiData, 0);
    end;
    ...
  end;
  ...
end;
于 2013-06-28T20:43:19.230 に答える