zoukankan      html  css  js  c++  java
  • 合并两个 Wav 文件流的函数 回复 "刘文强" 的问题


    问题来源: http://www.cnblogs.com/del/archive/2008/10/25/1069523.html#1351197
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Button2: TButton;
        procedure FormCreate(Sender: TObject);
        procedure FormDestroy(Sender: TObject);
        procedure Button1Click(Sender: TObject);
        procedure Button2Click(Sender: TObject);
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    uses MMSystem;
    
    {合并两个 Wav 文件流的函数}
    function ConWavStream(AWavStream1, AWavStream2: TStream; var ANewStream: TStream): Boolean;
    type
      TWavFormat = packed record
        ChunkID: array[0..3] of AnsiChar;     {'RIFF'}
        ChunkSize: Longword;                  {size-8}
        Format: array[0..3] of AnsiChar;      {'WAVE'}
        SubChunk1ID: array[0..3] of AnsiChar; {'fmt '}
        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}
        BitsPerSample: Word;                  {BytesperSample *8}
        SubChunk2ID: array[0..3] of AnsiChar; {'data'}
        SubChunk2Size: Longword;              {number of data bytes}
      end;
    var
      vWavFormat1: TWavFormat;
      vWavFormat2: TWavFormat;
      vChunkSize1, vChunkSize2: Integer;
    begin
      Result := False;
      if AWavStream1.Read(vWavFormat1, SizeOf(TWavFormat)) <> SizeOf(TWavFormat) then Exit;
      if AWavStream2.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; {格式不同}
    
      vWavFormat1.ChunkSize := vChunkSize1 + vChunkSize2 + SizeOf(vWavFormat1) - 8;
      vWavFormat1.SubChunk2Size := vChunkSize1 + vChunkSize2;
      ANewStream.Write(vWavFormat1, SizeOf(TWavFormat));
      ANewStream.CopyFrom(AWavStream1, vChunkSize1);
      ANewStream.CopyFrom(AWavStream2, vChunkSize2);
    
      Result := True;
    end; { ConWavStream End}
    
    
    var
      WavStream: TStream;
    
    {合并两个资源流; 之前要在资源中分别加载两个 WAV 文件, 并分别命名: wav1、wav2}
    procedure TForm1.FormCreate(Sender: TObject);
    var
      rs1,rs2: TResourceStream;
    begin
      rs1 := TResourceStream.Create(HInstance, 'wav1', RT_RCDATA);
      rs2 := TResourceStream.Create(HInstance, 'wav2', RT_RCDATA);
      WavStream := TMemoryStream.Create;
      ConWavStream(rs1, rs2, WavStream);
      rs1.Free;
      rs2.Free;
    end;
    
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      WavStream.Free;
    end;
    
    {循环播放}
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      sndPlaySound(TMemoryStream(WavStream).Memory, SND_ASYNC or SND_MEMORY or SND_LOOP);
    end;
    
    {暂停}
    procedure TForm1.Button2Click(Sender: TObject);
    begin
      sndPlaySound(nil, 0);
    end;
    
    end.
    
  • 相关阅读:
    ylbtech-LanguageSamples-Indexers_2(索引器)
    ylbtech-LanguageSamples-Indexers(索引器)
    ylbtech-LanguageSamples-Hello World
    ylbtech-LanguageSamples-Generics(泛型)
    Tomcat
    Tomcat中部署WEB项目的四种方法
    解决fonts.gstatic.com无法访问
    关于android的屏幕保持常亮
    求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)
    不用加减乘除实现加法
  • 原文地址:https://www.cnblogs.com/del/p/1319582.html
Copyright © 2011-2022 走看看