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

解决方案 »

  1.   

    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;读取文件头就行了
      

  2.   

    感谢 constantine(飘遥的安吉儿)我是菜鸟,能说的再详细些吗?怎么读取头文件?
      

  3.   

    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)+'秒' );
      

  4.   

    FWavFileHandle:=FileOpen(Lab_FileName.Caption,fmOpenRead+fmShareDenyNone);
      

  5.   

    WavHeader哪来的啊,请说清楚一点,有的地方不是很明白
      

  6.   

    明白了,请问belllab,我想获得.mov文件的时间长度啊?