如何对Wave文件按照指定的时间段进行分割(100分)

  • 主题发起人 主题发起人 TheCodec
  • 开始时间 开始时间
T

TheCodec

Unregistered / Unconfirmed
GUEST, unregistred user!
如何对Wave文件按照指定的时间段进行分割
 
没有人知道吗?
 
唉~~~我在这里提的几个问题,没有一个能够解决的,大家是觉得分太少吗?[:(]
 
咳,是问题太高深!
 
WAVE文件作为多媒体中使用的声波文件格式之一,它是以RIFF格式为标准的。
wave文件头(44字节)+PCM数据,由于数据没有压缩,所以很好处理.
头描述中,第24,25字节的字型变量为,采样率,即每秒播放字节数,例如该值=8000,要得到10~20的波形数据,计算可得到对应的文件位置为44+8000*10开始,8000*10字节(假设单声道,8位)

附:wave文件头信息:
偏移地址 字节数 数据类型 内  容
00H 4 char "RIFF"标志
04H 4 long int 文件长度
08H 4 char "WAVE"标志
0CH 4 char "fmt"标志
10H 4   过渡字节(不定)
14H 2 int 格式类别(10H为PCM形式的声音数据)
16H 2 int 通道数,单声道为1,双声道为2
18H 2 int 采样率(每秒样本数),表示每个通道的播放速度,
1CH 4 long int 波形音频数据传送速率,其值为通道数×每秒数据位数×每样
        本的数据位数/8。播放软件利用此值可以估计缓冲区的大小。
20H 2 int 数据块的调整数(按字节算的),其值为通道数×每样本的数据位
      值/8。播放软件需要一次处理多个该值大小的字节数据,以便将其
      值用于缓冲区的调整。
22H 2   每样本的数据位数,表示每个声道中各个样本的数据位数。如果有多
     个声道,对每个声道而言,样本大小都一样。
24H 4 char 数据标记符"data"
28H 4 long int 语音数据的长度
  

PCM数据的存放方式:
  样本1 样本2
8位单声道 0声道 0声道
8位立体声 0声道(左) 1声道(右) 0声道(左) 1声道(右)
16位单声道 0声道低字节 0声道高字节 0声道低字节 0声道高字节
16位立体声 0声道(左)低字节 0声道(左)高字节 1声道(右)低字节 1声道(右)高字节
 WAVE文件的每个样本值包含在一个整数i中,i的长度为容纳指定样本长度所需
的最小字节数。首先存储低有效字节,表示样本幅度的位放在i的高有效位上,
剩下的位置为0,这样8位和16位的PCM波形样本的数据格式如下所示。  
样本大小 数据格式 最大值 最小值
8位PCM unsigned int 255 0
16位PCM int 32767 0


 
还是丢字了:头描述中,第24,25字节的字型变量为采样率,即每秒采样/播放字节数,例如该值=8000,要得到第10~20秒的波形数据....
 
tianhf 您好,我想请教您一个问题,我需要在程序中播放*.vox 文件(a-law 8000hz)我很急,能否麻烦您给我一个答复,分数好说。my e_mail :fzwlf2002@sina.com 谢谢!
 
抱歉,我也没有播放过.vox文件,你试试System面板的MediaPlayer控件可否播放:
MediaPlayer1.FileName:=tmpWavName;
MediaPlayer1.Open;
MediaPlayer1.Play;
 
这是不全面的,wav文件可以在头标识前加上任何非“RIFF”字样。
比如ID3www.Mp3.com什么的,必须扫描到RIFF标识在动态确定后面是否正常的数据
 
同意章惠的看法,tianhf的讲解还是有点问题的,前段时间正巧做Wav方面的东西,就把wav给研究了一下,我来说几句吧,头文件主要是由下面组成。

标志符(RIFF)
数据大小
格式类型("WAVE")

"fmt"
Sizeof(PCMWAVEFORMAT)
PCMWAVEFORMAT //以上三个是绑在一起的, 该处的位置不一定是紧跟在“格式类型("WAVE") ”后面的,有些硬件采集下来的文件,中间还有他自己的一些信息,所以应该用个循环来进行定位。



"data" //该位置也同上,不一定就是紧跟上面的
声音数据大小
声音数据 //该三个是绑在一起的

typedef struct pcmwaveformat_tag {
WAVEFORMAT wf;
WORD wBitsPerSample;//WAVE文件的采样大小;
} PCMWAVEFORMAT

typedef struct {
WORD wFormatTag;
//编码格式,包括WAVE_FORMAT_PCM,WAVEFORMAT_ADPCM等
WORD nChannels;
//声道数,单声道为1,双声道为2;
DWORD nSamplesPerSec;
//采样频率;
DWORD nAvgBytesPerSec;
//每秒的数据量;
WORD nBlockAlign;
//块对齐;
} WAVEFORMAT;



其中数据部分编码又有8位,16位,32位,64位等之分,主要取决上面的nSamplesPerSec,nAvgBytesPerSec,nChannels等决定的,最常见的有8位和16位,现在以16位的居多,8位的时候是用无符号数据来表示的,所以128是静音 ,而16位是有符号的,所以0才表示静音。

如果上面都搞清楚了,wav文件的分割应该是没问题。

另外如果自己要用directx中的directsound来写个功能比较强大的wav播放器,其中还是有好多值得注意的地方,这是后话,暂且不谈了。
 
仁兄请继续赐教,后话对我很有帮助。我需要多路混音播放内存中的wav
 
后退
顶部