回 帖 发 新 帖 刷新版面

主题:关于wav格式

在VFP下怎么知道XX.wav有多长时间?
懂VB的帮我看看,谢谢
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)+'秒'   ); 

回复列表 (共2个回复)

沙发

homayzh你好,你给出的程序看来是分析了wav文件的结构,从文件头信息中获取wav长度。因为fox是弱变量类型语言,用它构造一些数据类型不是很容易,常用字符数组代替,因此所给程序改造为fox语言有点麻烦。俺先给个从fox的solution示例Play Multimedia Files Using MCI Commands Sample中改造的程序,完成“在VFP下怎么知道XX.wav有多长时间?”的任务。有时间俺再看看你所给的怎么改造为fox语言。

PUBLIC MCIerror, MCIerrorString
DECLARE INTEGER mciSendString ;
   IN WinMM.DLL ;
   STRING cMCIString,;
   STRING @cRetString,;
   INTEGER nRetLength,;
   INTEGER hInstance
DECLARE INTEGER mciGetErrorString ;
   IN WINMM.DLL ;
   INTEGER nErrorno, ;
   STRING @cBuffer, ;
   INTEGER nBufSize
cFileName = GETFILE("wav","Select a wav file")
if empty(cFileName)
   return
endif
cCmd = ('OPEN "' + cFileName + '" alias FoxMedia WAIT')
=doMCI(cCmd)
IF MCIerror > 0 THEN
  messagebox(MCIerrorString)
  RETURN
ENDIF
=doMCI("SET FoxMedia time format milliseconds")
nMediaLength = VAL(doMCI("STATUS FoxMedia length"))
?nMediaLength/1000,"秒"
cCmd = "CLOSE FoxMedia"
=doMCI(cCmd)

FUNCTION doMCI
LPARAMETERS cMCIcmd
cRetString = space(80)
nRetValue = mciSendString(cMCIcmd,@cRetString,len(cRetString),0)
cErr = getMCIerror(nRetValue)
IF nRetValue > 0
  RETURN CeRR
ENDIF
RETURN TRIM(STRTRAN(cRetString,chr(0),""))

FUNCTION  getMCIerror
LPARAMETERS cError
LOCAL lcErrorString,nError
nError=0
IF TYPE("cError")="C"
   IF LEFT(cError,7)="*ERROR*"
      nError=val(substr(cError,8))
   ENDIF
ENDIF   
IF TYPE("cError")="N"
  nError=cError
ENDIF
cErrorString=SPACE(256)  
=mciGetErrorString(nError,@cErrorString,len(cErrorString))
MCIerror = nError
MCIerrorString = cErrorString
RETURN TRIM(CHRTRAN(cErrorString,CHR(0),""))

板凳


太谢谢你啦 。赵老师。

我来回复

您尚未登录,请登录后再回复。点此登录或注册