`
huobengle
  • 浏览: 860003 次
文章分类
社区版块
存档分类
最新评论

合并两个格式相同的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;

分享到:
评论

相关推荐

    多个wav文件合并成一个文件

    单纯用vb实现的wav文件合并,两个文件要有相同的码率,采样位数,声道等等,总之就是两个正常大小的文件合并是可以的,只要两个文件的总大小小于2GB,那就可以了.这个纯vb6实现,像一般的几十兆的wav文件合并,还是很快的,...

    wav文件合并代码 c++

    test.cpp文件提供合并多个wav文件的功能。要求每个文件采样率,声道数,编码位数相同。wav格式详解推荐地址:http://blog.csdn.net/bluesoal/article/details/932395

    c#wav音频合并类

    将wav音频文件批量合并成一个wav音频文件,用于简单的语音合成,比如可以用作数值播报方面,我这个是收银软件的语音播报的wav合并类。我估计这是网上唯一一个能用的,因为我找了很久都没找到一个能用的,只好自己找...

    WAV合并工具 可插入毫秒间隔

    WAV合并工具 可在两个WAV文件间插入毫秒级间隔 注意: 1.此软件没有实现批量合并。 2.两个WAV文件格式须一致。

    c++ PCM合并,并转换为WAV

    合并两个PCM文件,并可将转换后的PCM文件}转化为WAV文件,里面包含合并PCM的算法

    audio-merge:合并两个WAV文件

    将两个WAV文件合并在一起。 注意:WAV文件中的ID是任意的,因此它们可能与音频文件之一相同。大小必须加在一起,例如chunkSize = chunkSize1 + chunkSize2。 声音数据然后必须被组合或彼此附加。

    混合 .wav 声音文件:该程序将 2 个声音 .wav 文件混合到一个文件中 该程序处理不同长度和比特率的 .wav 文件-matlab开发

    % 这个程序将 2 个声音 .wav 文件混合成一个文件% 程序处理不同长度和比特率的 .wav 文件% % 对于不同长度的文件,程序给用户 2 个选项: % 选项 1:合并两个不同长度的文件,使它们都% 同时开始,短文件完成后,...

    delphi 合并声音文件

    使用delphi制作,可以合并2个单声道声音文件; 也可以合并多个相同类型的声音文件;是由两个函数完成主要部分的.

    Total Commander 文件管理工具

    同时它还会创建一个校验文件,用Total Commander合并时,这个文件用来检验合并后的文件是否和原文件相同。  内置FTP功能  Total Commander同时可以连接多个服务器,支持站对站传输、设置代理服务器、自动保持...

    Video Workshop V3.40.zip

     该视频研讨会的主要功能是从一种格式转换到另一个视频文件,提取单个帧图像文件,切成新的视频文件一个文件的一部分,合并在一两个或多个文件,从视频文件为MP3翻录音轨或WAV文件,和混合(MP3或WAV)的音频文件到...

    华工多媒体大作业.doc

    "文件拆分与合并 " "打开一个音频文件,将该音频文件拆分成两个文件分别存盘;打开两个音频" "文件,将两个音频文件合成一个音频文件。 " "文件格式转换 " "打开多个同种格式文件,将其批量转换成另一种格式文件存盘...

    格式工厂V2.60

    格式工厂 (Format Factory) 是一款功能全面的格式转换软件,支持转换几乎所有主流的多媒体文件格式,包括视频 MP4、AVI、3GP、WMV、MKV、VOB、MOV、FLV、SWF、GIF;音频 MP3、WMA、FLAC、AAC、MMF、AMR、M4A、M4R、...

    华工多媒体作业.docx

    多媒体技术平时作业 实验1:用GoldWave软件处理音频 音频素材(MP3、WAV、MIDI,至少准备两种格式的文件,每种格式准备2个以上文件) 1、文件拆分与合并 打开一个音频文件,将该音频文件拆分成两个文件分别存盘;...

    系统增强文件管理器 Total Commander 9.51 + x64 Final 中文.zip

    同时它还会创建一个校验文件,用Total Commander合并时,这个文件用来检验合并后的文件是否和原文件相同。 内置FTP功能 Total Commander同时可以连接多个服务器,支持站对站传输、设置代理服务器、自动保持在线,...

    2d转3d转换器(Wondershare Video Converter Ultimate) v7.3.0.3.zip

    - 作物,调整视频效果,并添加水印/有两个实时预览窗口字幕。 - 剪辑视频文件/ DVD章节。 - 合并多个文件。 - 自定义DVD菜单。 - 拍摄的图片。 - 为您的每一个需要自定义输出配置文件。 - 灵活的输出视频/音频...

    格式工厂V2.70

    格式工厂(Format Factory)是一款功能全面的格式转换软件,支持转换几乎所有主流的多媒体文件格式,包括视频 MP4、AVI、3GP、WMV、MKV、VOB、MOV、FLV、SWF、GIF;音频 MP3、WMA、FLAC、AAC、MMF、AMR、M4A、M4R、OGG...

    完全免费的国产 光盘刻录大师 10.0 中文免费版.zip

    5.视频合并:把多个不同或相同格式的视频文件合并成一个视频文件。 6.视频截图:从视频中截取精彩画面。支持bmp.jpg,png等格式 7.DVD视频提取:可以把DVD影音光盘转换为MPEG-4, ASF, AVI, DivX, XviD, FLV, WMV, RMVB等...

    画质最好的视频批量转成rmvb或rm的工具EasyRealMediaProducer1.94中文绿色版(2.7M)

    如果是要合并文件就在选择多个文件合并后依次在左边的小窗口中添加上要追加合并的文件,这里要特别注意的是所有被合并的文件必须保证编码率和分辨率都要完全相同。  此外,ERP还通过插件支持对字幕、Ogg音频以及...

    Total commander 7.02a

    同时它还会创建一个校验文件,用Total Commander合并时,这个文件用来检验合并后的文件是否和原文件相同。  (四)、内置FTP功能  Total Commander同时可以连接多个服务器,支持站对站传输、设置代理服务器、...

    Visual FoxPro 9.0多媒体三维图形编程(可执行VFP9代码的电子书)

    DirectSound用于播放wav格式的音乐文件,一般用于音效效果。通过我们的封装,对音乐编程更加高效和简单。这些函数也封装到了DLGame.fll库中 一般编程语言必须先编译再运行,调试麻烦。VFP有先天的优势,边解释边运行...

Global site tag (gtag.js) - Google Analytics