如何取得wav文件的播放时间长度

chinavic 2006-03-24 02:49:18
如何取得wav文件的播放时间长度
...全文
480 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
janezjtjdx 2006-03-24
  • 打赏
  • 举报
回复
明白了,请问belllab,我想获得.mov文件的时间长度啊?
janezjtjdx 2006-03-24
  • 打赏
  • 举报
回复
WavHeader哪来的啊,请说清楚一点,有的地方不是很明白
belllab 2006-03-24
  • 打赏
  • 举报
回复
FWavFileHandle:=FileOpen(Lab_FileName.Caption,fmOpenRead+fmShareDenyNone);
belllab 2006-03-24
  • 打赏
  • 举报
回复
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;

implementation

function 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)+'秒' );
chinavic 2006-03-24
  • 打赏
  • 举报
回复
感谢 constantine(飘遥的安吉儿)

我是菜鸟,能说的再详细些吗?怎么读取头文件?
constantine 2006-03-24
  • 打赏
  • 举报
回复
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;

读取文件头就行了

5,391

社区成员

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

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