0

私はこのコードを使用して Delphi で .wav データを読み取り、結果を matlab 関数 wavread から取得した値と比較しています。そこから、matlab関数はどれがサンプルデータ値であるかを自動的に認識できると言えますが、delphiではそうではありません(ただし、matlabとdelphiのコード結果は同じです)。私の Delphi コードはサンプル データ値を認識できないため、配列を調べたところ、サンプル データ値の開始位置のインデックスが .wav ファイルごとに異なることがわかりました。例として、いくつかの .wav ファイルをテストして、これを取得します。

  1. classic1.wav wavedata[].Data[] インデックス番号 40 で始まるサンプル データ値
  2. classic2.wav wavedata[].Data[] インデックス番号 35 で始まるサンプル データ値

結果 y,[y, Fs, nbits, opts]=wavread('classic1.wav','double'); を見て結論を上回りました。次に、結果の Delphi の戻り値を配列で確認し、classic1.wav のインデックス 40 と classic2.wav のインデックス 35 で始まるまったく同じ値を見つけます。そして、各 .wav ファイルのサンプル データ値の開始インデックスを知る方法があるかどうか知りたいですか?

EDIT : 与えられた参照に似たレコードを修正しました。ヘッダー (ChunkID から Subchunk2size まで) は完全に正しいですが、前の結果から変更がないため、それに続くサンプル データにまだ混乱しています。

type
TWaveHeader = packed record

    Marker_RIFF: array [0..3] of char;
    ChunkSize: cardinal;
    Marker_WAVE: array [0..3] of char;


    Marker_fmt: array [0..3] of char;
    SubChunkSize: cardinal;
    FormatTag: word;
    NumChannels: word;
    SampleRate: longint;
    ByteRate: longint;
    BlockAlign:word; 
    BitsPerSample: word;


    Marker_data: array [0..3] of char;
    DataBytes: longint;
  end;

  TChannel = record
  Data : array of smallint;


end;
4

2 に答える 2

3

すべてのファイル I/O を手動で行うのではなく、代わりに Win32 マルチメディア API 関数( mmioOpen()mmioDescend()mmioAscend()mmioRead()など) を使用する必要があります。 . API に各チャンクの検索に関する低レベルの詳細を処理させながら、個々のチャンクのコンテンツにより集中できるため、コードの管理と読み取りが容易になります。

于 2013-04-27T09:02:39.933 に答える