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

碰到这个问题也是照常搜索一下历史的资料

发现一条线索:“通过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;

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值