怎么合并两个wav文件

小马哥aa 2004-10-25 10:14:03
请问各位高手,wav的文件格式是怎么样的。
怎么样把两个wav文件合并成一个wav文件。
不知道它的格式我想是不可能合并的成一个wav文件的,我试过了合并后的文件用播放器不能放!!
...全文
723 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiso 2005-03-04
  • 打赏
  • 举报
回复
顶一下
leeky 2005-03-04
  • 打赏
  • 举报
回复
哈,这种合并不要理解为只是文件的追加哦(楼主与另外的某个兄弟可能就这样理解了),
因为这种文件有固定方式,比如前面有几个字节是指示总的数据长度的。合并(据我理解,楼主想做的是把两个声音前后连接起来)后长度肯定会改变,而且后面部分不再需要文件头,如果两个文件的采样位数不一样,就必须做转换,采样频率不一样,也要做转换,转换的结果要么是牺牲空间,要么是牺牲质量。
WAV的文件格式,只要你下点功夫,其实不难理解。
codeuser 2005-01-15
  • 打赏
  • 举报
回复
用cooledit 2.0
yanlls 2005-01-15
  • 打赏
  • 举报
回复
如果是对8位的wav文件混合,要注意8位音频波形值的范围是0~255,混合的方式是把两个值相加再减128,再判断结果小于0则变0,大于255则变255。 如果是16位的文件混合,波形值范围是-32765 ~ 32765,混合的方式为两值相加。再掐头去尾。如果不同格式的文件混合,要先转成相同格式。相加除2的方式会使声音音量小一半,还会有杂音,尽量不要采用。

Wave格式是RIFF(Resource Interchange File Format)的一种形式. RIFF文件由块(chunk)组成. 每个块的开头是一个四字符的标识, 块的剩余部分的内容取决于块的类型. 许多块的内部又包含新的块, 他们称为子块(subchunk).

格式例: 大部分WAVE文件包含以下3块.
RIFF: 没有子块. 之后紧跟4字节, 存储后续数据的大小.1-8字节
WAVE: 包含3个子块. fmt, fact, data.9-58
LIST: 没有子块. 之后紧跟4字节, 存储后续数据的大小.之后是制造商等信息.

fmt加一个空格: 占用四字节长度. 之后紧跟4字节, 表示其后的数据长度. 剩下的格式信息包括: Format tag, 2字节; channels, 2字节; Sample Per Second, 4字节; Avg Bytes Per Second, 4字节; Block Align, 2字节; Bits Per Sample, 2字节; Extra Format Information, 2字节(非8k采样则无此字段,仅对PCM, Alaw, Ulaw而言).

fact: 占用四字节, 之后紧跟4字节, 表示其后的数据长度. 还包含4字节的Total Samples, 表示共有多少采样点.(在其他格式众此子块可扩展)

data: 占用四字节, 之后紧跟4字节, 表示其后的数据长度. 之后紧跟语音数据.51-58

WAV头信息如下(58字节):
1-4:RIFF字符
4-8:存储后续数据的大小(到文件末尾)
9-16:WAVEfmt字符+空格
17-20:表示其后的数据长度.(到字符fact之前的长度12)
21-22:Format tag
23-24:channels
25-28:Sample Per Second
29-32:Avg Bytes Per Second
33-34:Block Align
35-36:Bits Per Sample
37-38:Extra Format Information, 2字节(非8k采样则无此字段,仅对PCM, Alaw, Ulaw而言)
39-42:face字符
43-46:表示其后的数据长度.(到字符data之前的长度4)
47-50:Total Samples, 表示共有多少采样点.等于55-58的数据。(在其他格式中此子块可扩展)
51-54:字符data
55-58:存储后续数据的大小(到文件末尾)
yanlls 2005-01-15
  • 打赏
  • 举报
回复
不知道你是怎么合并,是叠加呢?还是在一个的后面加另一个
jackie168 2005-01-15
  • 打赏
  • 举报
回复
合并mpg倒有一个~~~
leeky 2005-01-14
  • 打赏
  • 举报
回复
ksaiy(消失在人海) 提供的资料在上个世纪的《程序员大本营》中收藏过啊。
leeky 2005-01-14
  • 打赏
  • 举报
回复
继续发别人写的文章,你自己参考:
你可以用UltraEdit打开一个文件来看。

什么是Wav文件:
Wav文件直接反映了一个声音在每个时刻的大小值,比如说以下一段波形:
我们按每人0.1秒取一点,得到的wav文件数值就是0,1,1,-1,0,1。因此,假如我们能把许多Wav文件的数据直接相加,你听到的就是所有的声音,这就是混音器的原理。
下面我们分析一下Wav文件结构:
我们可以打开一个Wav文件直接看其二进制码:
C:\user\wave\22.wav
00000000 5249 4646 9CB6 1E00 5741 5645 666D 7420
00000010 1000 0000 0100 0200 2256 0000 44AC 0000
00000020 0200 0800 6461 7461 78B6 1E00 7F7F 7F7F
00000030.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000040.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000050.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000060.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000070.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000080.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
00000090.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
000000A0.7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F 7F7F
大家可以看到wav文件存储格式如下:

"RIFF"
×××× 文件大小
"WAVE"
"fmt"
×××× PCMWAWFORMAT——数据结构大小
××××
…… 数据结构“PCMWAVEFORMAT”
××××
data
×××× 数据大小
∶ 数据

首先是字符串“RIFF”,表示此文件遵循一种标准格式名为“资源互换文件格式”(Resource Intercharge Format)。后面紧跟四个字节指明文件大小。其次是字符串“WAVE”和“fmt”,后面紧跟一个名为“PCMWAVEFORMAT”的结构,最后是字符串“data”,紧跟数据大小及所有数据。PIFF文件为一种树状结构,基本构成单位是“块”,
leeky 2005-01-14
  • 打赏
  • 举报
回复
哈,知道格式不就得了?
如果采样频率及其它一些参数不一致的话,花费的精力要稍大些。
(我今天才把这种文件的头完全理解了。)
RIFF文件和WAV文件格式

  在Windows环境下,大部分的多媒体文件都依循着一种结构来存放信息,这种结构称为"资源互换文件格式"(Resources lnterchange File Format),简称RIFF。例如声音的WAV文件、视频的AV1文件等等均是由此结构衍生出来的。RIFF可以看做是一种树状结构,其基本构成单位为chunk,犹如树状结构中的节点,每个chunk由"辨别码"、"数据大小"及"数据"所组成。

  辨别码由4个ASCII码所构成,数据大小则标示出紧跟其后数据的长度(单位为Byte),而数据大小本身也用掉4个Byte,所以事实上一个chunk的长度为数据大小加8。一般而言,chunk本身并不允许内部再包含chunk,但有两种例外,分别为以"RIFF"及"L1ST"为辨别码的chunk。而针对此两种chunk,RIFF又从原先的"数据"中切出4个Byte。 此4个Byte称为"格式辨别码",然而RIFF又规定文件中仅能有一个以"RIFF"为辨别码的chunk。

  只要依循此一结构的文件,我们均称之为RIFF档。此种结构提供了一种系统化的分类。如果和MS一DOS文件系统作比较,"RIFF"chunk就好比是一台硬盘的根目录,其格式辨别码便是此硬盘的逻辑代码(C:或D:),而"L1ST"chunk即为其下的子目录,其他的chunk则为一般的文件。至于在RIFF文件的处理方面,微软提供了相关的函数。视窗下的各种多媒体文件格式就如同在磁盘机下规定仅能放怎样的目录,而在该目录下仅能放何种数据。

  WAV为WAVEFORM(波形)的缩写。声音文件的结构如图1所示,"RIFF"的格式辨别码为"WAVE"。整个文件由两个chunk所组成:辨别码"fmt"(注意,最后一个是空白字符!)及"data"。

  在"fmt"的chunk下包含了一个PCMWAVEFORMAT数据结构,其定义如下:

  typedef struct pcmwaveformat - tag {

  WAVEFORMAT wf ;

  WORD wBitsPerSample;

  } PCMWAVEFORMAT;

  typedef struct waveformat - tag {

  WORD wFormatTag ;

  WORD nChannels;

  DWORD nSamplesPerSec;

  DWORD nAvgBytesperSec;

  WORD nBlockAlign;

  } WAVEFORMAT;

  其意义分别为:

  wFormatTag:记录着此声音的格式代号,例如WAVE_FORMAT_PCM,WAVE_F0RAM_ADPCM等等。

  nChannels:记录声音的频道数。

  nSamp1esPerSec:记录每秒取样数。

  nAvgBytesPerSec:记录每秒的数据量。

  nBlockA1ign:记录区块的对齐单位。

  wBitsPerSample:记录每个取样所需的位元数。

小马哥aa 2004-10-27
  • 打赏
  • 举报
回复
ksary我在等你的DELPHI代码呢。有没有找到呀,合并WAV文件的
小马哥aa 2004-10-25
  • 打赏
  • 举报
回复
谢谢,我的EMAIL:mszok@163.com
在线
ksaiy 2004-10-25
  • 打赏
  • 举报
回复
晕.偶现在都看英文资料.国内详细资料都很少.
给你找一下我以前写的一个例子............
小马哥aa 2004-10-25
  • 打赏
  • 举报
回复
详细是详细了点,不过是全英文的,
我的英文水平菜,要是有中文的就更好了.
ksaiy 2004-10-25
  • 打赏
  • 举报
回复
http://www.wavecn.com/_data/data.htm
这里有,你下载看看吧.比较详细的。我有个C++Builder生成WAV的代码,要不?
小马哥aa 2004-10-25
  • 打赏
  • 举报
回复
有哪位大哥知道wav文件的格式呀。在线等!
lwk_hlj 2004-10-25
  • 打赏
  • 举报
回复
这个问题比较难
首先你要搞清楚WAV文件的格式
把两个WAV文件的数据区读出来
数据区合并,根据数据区的数据,生成新的WAV的文件头格式,保存
GoldShield 2004-10-25
  • 打赏
  • 举报
回复
看有没有专用工具.如果没有的话.好像就不行了吧

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧