合并兩個格式相同的wav檔案

來源:互聯網
上載者:User

碰到這個問題也是照常搜尋一下曆史的資料

發現一條線索:“通過Wav檔案的格式合并”

那就按線索先看看Wav檔案的格式


明顯SubChunk2Size就是音頻資料的大小

那麼只要格式相同,合并Data區試試

當然SubChunk2Size音頻資料大小和檔案大小ChunkSize需要重新計算

 

type

  TWavFormat = packed record

    ChunkID: array[0..3] of Char; //'RIFF'

    ChunkSize: Longword; // file size - 8 [bytes]

    Format: array[0..3] of Char; // 'WAVE'

    SubChunk1ID: array[0..3] of Char; // 'fmt '   mind the space!

    SubChunk1Size: Longword; // hex10

    AudioFormat: Word; // hex 01

    NumOfChannels: Word; //1 mono, 2 stereo

    SampleRate: Longword; // number of samples/sec

    ByteRate: Longword; // samplerate* num of channels*

                        // bytes per (mono) sample

    BytesperSample: Word; // size of (mono) sample [bytes]

    BitsPerSample: Word; // BytesperSample *8

    SubChunk2ID: array[0..3] of Char; //'data'

    SubChunk2Size: Longword; //number of data bytes

  end;

 

function ConcatWavFile(AWavFile1, AWavFile2, ANewFile: string): Boolean;

var

  vWavFormat1: TWavFormat;

  vWavFormat2: TWavFormat;

  vFileHandle1: THandle;

  vFileHandle2: THandle;

  vFileStream1: TFileStream;

  vFileStream2: TFileStream;

  vChunkSize1, vChunkSize2: Integer;

begin

  Result := False;

  if not FileExists(AWavFile1) then Exit;

  if not FileExists(AWavFile2) then Exit;

  vFileHandle1 := _lopen(PChar(AWavFile1), OF_READ or OF_SHARE_DENY_NONE);

  vFileHandle2 := _lopen(PChar(AWavFile2), OF_READ or OF_SHARE_DENY_NONE);

  if (Integer(vFileHandle1) <= 0) or (Integer(vFileHandle2) <= 0) then

  begin

    _lclose(vFileHandle1);

    _lclose(vFileHandle2);

    Exit;

  end;

 

  vFileStream1 := TFileStream.Create(vFileHandle1);

  vFileStream2 := TFileStream.Create(vFileHandle2);

  try

    if vFileStream1.Read(vWavFormat1, SizeOf(TWavFormat)) <>

      SizeOf(TWavFormat) then Exit;

    if vFileStream2.Read(vWavFormat2, SizeOf(TWavFormat)) <>

      SizeOf(TWavFormat) then Exit;

    if vWavFormat1.ChunkID <> 'RIFF' then Exit;

    if vWavFormat1.SubChunk2ID <> 'data' then Exit;

    vChunkSize1 := vWavFormat1.SubChunk2Size;

    vChunkSize2 := vWavFormat2.SubChunk2Size;

    vWavFormat1.ChunkSize := 0;

    vWavFormat1.SubChunk2Size := 0;

    vWavFormat2.ChunkSize := 0;

    vWavFormat2.SubChunk2Size := 0;

    if not CompareMem(@vWavFormat1, @vWavFormat2, SizeOf(TWavFormat)) then Exit; //格式不相同

    with TMemoryStream.Create do try

      vWavFormat1.ChunkSize := vChunkSize1 + vChunkSize2 +

        SizeOf(vWavFormat1) - 8;

      vWavFormat1.SubChunk2Size := vChunkSize1 + vChunkSize2;

      Write(vWavFormat1, SizeOf(TWavFormat));

      CopyFrom(vFileStream1, vChunkSize1);

      CopyFrom(vFileStream2, vChunkSize2);

      try

        SaveToFile(ANewFile);

      except

        Exit;

      end;

    finally

      Free;

    end;

  finally

    vFileStream1.Free;

    vFileStream2.Free;

  end;

  Result := True;

end; { ConcatWavFile }

 

procedure TForm1.Button1Click(Sender: TObject);

begin

  ConcatWavFile('c:/windows/media/chord.wav', 'c:/windows/media/chimes.wav',

    'c:/temp/temp.wav');

end;

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.