如何取得wav文件的播放时间长度 如何取得wav文件的播放时间长度 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TPCMWaveHeader = record rID: array[0..3] of char; // 'RIFF' 标志 rLen: longint; // 文件长度 wID: array[0..3] of char; // 'WAVE' 标志 fId: array[0..3] of char; // 'fmt '标志 以空格结束(fID[3]:=Chr($20);) fLen: longint; // 过度字节(不定) wFormatTag: word; // 格式字节(过度字节为PCM形式的声音数据) nChannels: word; // 通道数 单声道=1, 双声道=2 } nSamplesPerSec: longint; // 采样频率 (每秒样本数),表示每个通道的播放速度 nAvgBytesPerSec: longint; // 波形音频数据传送速度(值:通道数X每秒数据位数X每 // 样本的数据位数/8。播放软件利用根据此值估计缓 // 冲区的大小) nBlockAlign: word; // 数据块的调整数(按字节计算),值为通道数*没样本的数据位值/8。 // 播放软件需要一次处理多个该值大小的字节数据,以便 // 将其值用于缓冲区的调整。 nBitsPerSample: word; // 每样本数据位数,表示每个声道中各个样本的数据位 // 数。如果有多个声道,对每个声道而言,样本大 // 小都一样 8 or 16 dId: array[0..3] of char; // 'data' 标志 dLen: longint; // 语音数据长度 end;读取文件头就行了 感谢 constantine(飘遥的安吉儿)我是菜鸟,能说的再详细些吗?怎么读取头文件? type TWavHeader=record FieldLabel:array[0..3] of Char; //"RIFF" FieldLen:DWORD; //从08H开始到文件末尾字节数 WaveID:array[0..3] of Char; //"WAVE" 57 41 56 45 FmtID:array[0..3] of Char; //"fmt " 66 6D 74 20 FmtLen:DWORD; //A_LAW 12 00 00 00 PCM 10 00 00 00 wFormatTag: Word; // format type A_LAW 06 00 PCM 01 00 nChannels: Word; // 声道数 01 00 nSamplesPerSec: DWORD; // sample rate 采样率 40 1F 00 00 nAvgBytesPerSec: DWORD; // AvgBytesPerSec是每秒钟的字节数,应该这样计算:AvgBytesPerSec = BlockAlign * SamplesPerSec; nBlockAlign: Word; // BlockAlign是每个样本的字节数,应该这样计算:BlockAlign = Channel * BitsPerSample / 8; wBitsPerSample: Word; //采样BITS数 08 00 DataID:array[0..3] of Char; //"data" 64 61 74 61 DataLen:DWORD; // 采样数据总字节数 end;//取WAV文件格式function GetWavHeader(FHandle:Integer;var WHeader:TWavHeader):Boolean;implementationfunction GetWavHeader(FHandle:Integer;var WHeader:TWavHeader):Boolean;begin Result:=False; if FHandle<0 then Exit; FileSeek(FHandle,0,0); FileRead(FHandle,WHeader,SizeOf(TWavHeader)); if WHeader.WaveID<>'WAVE' then Exit; if WHeader.FieldLabel<>'RIFF' then Exit; if WHeader.DataID<>'data' then Exit; Result:=True;end;'时间长度:'+ IntToStr(WavHeader.DataLen div WavHeader.nAvgBytesPerSec)+'秒' ); FWavFileHandle:=FileOpen(Lab_FileName.Caption,fmOpenRead+fmShareDenyNone); WavHeader哪来的啊,请说清楚一点,有的地方不是很明白 明白了,请问belllab,我想获得.mov文件的时间长度啊? 两个adoquery做主从表和业务主键引发的问题。。 3000万个状态 aacess 数据库的时间比较问题? 打包后,安装遇到的问题? 等待中... 关于反恐精英游戏的连接问题,请教高位高手 如何调出任务栏中指定的某个程序? 大侠!help me 改写TOpenDialog,按ok按钮之后对话框不关闭。 怎么用代码实现与SOL SERVER 的ODBC 连接 (送分题) 各位高手,救救我吧!!!!!1 请问如何判断一个窗口已经打开? 如何用DBGrid来实现将列中相同值的行进行合并?
// 样本的数据位数/8。播放软件利用根据此值估计缓
// 冲区的大小) nBlockAlign: word; // 数据块的调整数(按字节计算),值为通道数*没样本的数据位值/8。
// 播放软件需要一次处理多个该值大小的字节数据,以便
// 将其值用于缓冲区的调整。 nBitsPerSample: word; // 每样本数据位数,表示每个声道中各个样本的数据位
// 数。如果有多个声道,对每个声道而言,样本大
// 小都一样 8 or 16 dId: array[0..3] of char; // 'data' 标志 dLen: longint; // 语音数据长度 end;读取文件头就行了
TWavHeader=record
FieldLabel:array[0..3] of Char; //"RIFF"
FieldLen:DWORD; //从08H开始到文件末尾字节数
WaveID:array[0..3] of Char; //"WAVE" 57 41 56 45
FmtID:array[0..3] of Char; //"fmt " 66 6D 74 20
FmtLen:DWORD; //A_LAW 12 00 00 00 PCM 10 00 00 00
wFormatTag: Word; // format type A_LAW 06 00 PCM 01 00
nChannels: Word; // 声道数 01 00
nSamplesPerSec: DWORD; // sample rate 采样率 40 1F 00 00
nAvgBytesPerSec: DWORD; // AvgBytesPerSec是每秒钟的字节数,应该这样计算:AvgBytesPerSec = BlockAlign * SamplesPerSec;
nBlockAlign: Word; // BlockAlign是每个样本的字节数,应该这样计算:BlockAlign = Channel * BitsPerSample / 8;
wBitsPerSample: Word; //采样BITS数 08 00
DataID:array[0..3] of Char; //"data" 64 61 74 61
DataLen:DWORD; // 采样数据总字节数
end;//取WAV文件格式
function GetWavHeader(FHandle:Integer;var WHeader:TWavHeader):Boolean;implementationfunction GetWavHeader(FHandle:Integer;var WHeader:TWavHeader):Boolean;
begin
Result:=False;
if FHandle<0 then Exit;
FileSeek(FHandle,0,0);
FileRead(FHandle,WHeader,SizeOf(TWavHeader));
if WHeader.WaveID<>'WAVE' then Exit;
if WHeader.FieldLabel<>'RIFF' then Exit;
if WHeader.DataID<>'data' then Exit;
Result:=True;
end;'时间长度:'+ IntToStr(WavHeader.DataLen div WavHeader.nAvgBytesPerSec)+'秒' );