網上看了下,提問的多,但是解決了的還沒見著。
那位做過的給點Demo吧,謝謝。就是把幾個文件合併成一個然後播放出來。

解决方案 »

  1.   


    应该类似这样,如果再复杂点就得分析wav文件格式var
    aryMs:array of TMemoryStream;
    temp: TMemoryStream;
    begin
    ......
    temp.Clear;
    temp.Seek(0,soBeginning);
    aryMs[0].Seek(0,soFromBeginning);
    temp.CopyFrom( aryMs[0],aryMs[0].Size );
    aryMs[1].Seek(0,soFromBeginning);
    temp.CopyFrom( aryMs[1],aryMs[1].Size );
    aryMs[3].Seek(0,soFromBeginning);
    temp.CopyFrom( aryMs[3],aryMs[3].Size );
    aryMs[2].Seek(0,soFromBeginning);
    temp.CopyFrom( aryMs[2],aryMs[2].Size );
    aryMs[4].Seek(0,soFromBeginning);
    temp.CopyFrom( aryMs[4],aryMs[4].Size );
    temp.SaveToFile( 'F:\AV.wav' );   
    .....
    end;   
      

  2.   

    現在就是一個一個的播放,這樣CPU佔用會很大,并且有點慢.
      

  3.   

    做成资源文件,然后用playsound播放
      

  4.   

    需要合并的*.wav文件都是动态生成的吧
    要不然通过其他软件合并起来再playsound不知道行不行
    ^_^都是高手,不敢乱说,呵呵
      

  5.   

    搜了以前的帖子,有种方案是通过分析Wav文件格式实现另外这几个wav文件的音频格式是否相同?先留个记号,关注一下。
      

  6.   

    参考如下代码:
    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;
      

  7.   

    调用DOS命令COPY不就可以合并了吗?
      

  8.   

    如果只是用一下,可以试试GoldWave软件合并的效果很好.呵呵.
      

  9.   

    Copy肯定是不行的,那是针对文本文件有效.谢谢伴水了,晚上回去试一下.
      

  10.   

    if vWavFormat1.SubChunk2ID <> 'data' then Exit;
    执行到这里时就退出了。