您现在的位置:首页 >> 图形媒体 >> 图形媒体 >> 内容

合并两个格式相同的WAV文件

时间:2011/9/3 15:02:59 点击:

  核心提示:type TWavFormat = packed record ChunkID: array[0..3] of Char; //'RIFF' ChunkSize: Longword; // file...

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;

作者:王集鹄 来源:转载
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • 盒子文章(www.2ccc.com) © 2024 版权所有 All Rights Reserved.
  • 沪ICP备05001939号