不用播放控件,自己写类,不用打开视频文件就可以读取文件信息,
要涉及到MPEG文件信息格式,研究了一周也没有搞定,请高手赐教!我找到一个Vc++的例子
/*****************************************************************************/
/* tpkMpegInfo.h  */
/*  */
/* Includes FileInfo structures definition and functions declaration  */
/*  */
/*****************************************************************************/#ifndef _TPK_MPEGINFO_H_
#define _TPK_MPEGINFO_H_
#if defined(__cplusplus)
extern "C"
{         
#endif#include <windows.h>#ifndef TPKRTDAPI
#define TPKRTDAPI __stdcall
#endif#ifdef _WIN32 
#define   far
#endif /***********************Error List********************************/
#define NO_SUCH_FILE 0x1
#define MEMORY_ALLOC_ERR 0x2
#define FILE_NOT_SUPPORT 0x3
/*********************End Error List******************************/typedef enum {
VP_VF_MPEG_I=1,
VP_VF_MPEG_II
}VIDEO_TYPE;typedef enum {
VP_ST_VIDEO=0,//mpeg video 
VP_ST_AUDIO,//mpeg audio or uncompressed wav
VP_ST_PES,//mpeg pes
VP_ST_SYSTEM,//mpeg1
VP_ST_PROGRAM,//mpeg2 program stream
VP_ST_TRANSPORT_188,//mpeg2 transport stream,包长188
VP_ST_TRANSPORT_204 //mpeg2 transport stream,包长204
}SYSTEM_TYPE;/* structures definition *//*-- AUDIO_INFO struct ----*/
typedef struct 
{
unsigned char ucStereo:4;          /* 0= mono    1= stereo                    */
unsigned char ucLayer:4;           /* 0= AC-3    1= Layer-I  2= Layer-II
3= Layer-III 4 = wav */
unsigned char ucBitRateIndex:4 ;
unsigned char ucFreqIndex:4;       /* 0 - 44100, 1 - 48000, 2 - 32000 Hz      */
unsigned short unBitRate;         /* Bit Rate (in K bits per second).          */
unsigned char ucMode;
unsigned char ucModeExt;
unsigned short unSampFreq;
char szAudioMode[16];  
} AUDIO_INFO , far *LP_AUDIO_INFO;/*-- TIME_CODE struct : from GOP */
typedef struct
{
unsigned char  isDrop:1; /* drop frame flag */
unsigned char  ucPic:7;
unsigned char  ucSec;
unsigned char  ucMin;
unsigned char  ucHours;
} TIME_CODE, far *LP_TIME_CODE ;  /* Sequence header info */ 
typedef struct
{
int dwOffSet;    /* OffSet of Video Packet (Sequence Header for ES) from begining of file  */
unsigned short  unHorizSize;
unsigned short  unVertSize;
unsigned char   ucPelAspectRatio;
unsigned char   ucChromaFormat;
unsigned char ucVideoFormat;
unsigned char ucFrameRate;
float fPicturePerSecond;
unsigned int dwBitRate;
}SEQ_INFO,  far* LP_SEQ_INFO;/*--MAIN_VIDEO_INFO--*/
typedef struct tagMAIN_VIDEO_INFO
{
unsigned short unVPID;
unsigned char ucStreamID;
unsigned char fGetInfo:3; 
unsigned char fSecondField:1;
unsigned char fGetPTS:3; 
unsigned char   fTimecode:1;//时码是否正常
VIDEO_TYPE VideoType;
SEQ_INFO SeqInfo;
__int64 qwFirstVPTS;
__int64 qwLastVPTS;
TIME_CODE FirstTimeCode;
TIME_CODE LastTimeCode;
unsigned char ucReserved[8];
struct tagMAIN_VIDEO_INFO *pNext;
}MAIN_VIDEO_INFO, far *LP_MAIN_VIDEO_INFO;/*--MAIN_AUDIO_INFO--*/
typedef struct tagMAIN_AUDIO_INFO
{
unsigned short unAPID;
unsigned char ucStreamID;
unsigned char fGetInfo:4; 
unsigned char fGetPTS:4; 
AUDIO_INFO AudioInfo;
__int64 qwFirstAPTS;
__int64 qwLastAPTS;
unsigned char ucReserved[8];
char szLanguage[12];
struct tagMAIN_AUDIO_INFO * pNext;
}MAIN_AUDIO_INFO, far *LP_MAIN_AUDIO_INFO;/*--SCR_INFO--*/
typedef struct
{
__int64        qwFirstSCRB;
__int64        qwLastSCRB;
}SCR_INFO, far *LP_SCR_INFO;/*-- SUBTITLE(DVD字幕) INFO struct --*/
typedef struct tagMAIN_SUBT_INFO
{
unsigned short unSubID;
char szLanguage[14];
struct tagMAIN_SUBT_INFO *pNext;
}MAIN_SUBT_INFO, far *LP_MAIN_SUBT_INFO;/*-- PROGRAM_TABLE struct --*/
typedef struct tagPROGRAM_TABLE
{
unsigned short unProgramNo;
unsigned short ucNumVideoStream:4;
unsigned short ucNumAudioStream:6;
unsigned short ucNumSubTitle:6;
unsigned int unMAPPID:13;
unsigned int unPCRPID:13;
unsigned int ucVerNum:6;
LP_SCR_INFO lpSCRInfo;
LP_MAIN_AUDIO_INFO lpMainAudio;
LP_MAIN_VIDEO_INFO lpMainVideo;
LP_MAIN_SUBT_INFO  lpSubInfo;
struct tagPROGRAM_TABLE *pNext;
}PROGRAM_TABLE,far *LP_PROGRAM_TABLE;
/*--STREAM_INFO--*/
typedef struct 
{
int  iOffset;
SYSTEM_TYPE  StreamType;
unsigned short   unVersion;
unsigned short  unNumberofProgram;
PROGRAM_TABLE    *lpProgramTable;
unsigned int     dwMuxRate;
}STREAM_INFO,far *LP_STREAM_INFO;/* FileInfo function */
short TPKRTDAPI tpkFileInfo(LPCCH strFileName,LP_STREAM_INFO *lpInfo);
LP_STREAM_INFO TPKRTDAPI tpkFileInfoA(LPCCH strFileName);
short TPKRTDAPI tpkFreeInfo(LP_STREAM_INFO lpInfo);
unsigned int TPKRTDAPI tpkGetDuration(LPCCH strFileName);#if defined(__cplusplus)
}
#endif #endif我转换成了delphi的pas仿造Vc++例子的用法,调用tpkGetDuration得到的结果没有时,分,只有秒和帧,好像少了两个字节,但是我一直没有找出我的定义有什么不对的,郁闷!

解决方案 »

  1.   

    接上贴,这是我转换的pas文件unit TpkMpegInfo;interfaceuses windows;const
      TpkUtilsDll = 'tpkUtils.dll' ;  //***********************Error List********************************/
      NO_SUCH_FILE = $1       ;
      MEMORY_ALLOC_ERR = $2   ;
      FILE_NOT_SUPPORT = $3   ;
      //*********************End Error List******************************/type
      VIDEO_TYPE = (
        VP_VF_MPEG_I=1,
        VP_VF_MPEG_II
      );  SYSTEM_TYPES = (
        VP_ST_VIDEO=0,//mpeg video
        VP_ST_AUDIO,//mpeg audio or uncompressed wav
        VP_ST_PES,//mpeg pes
        VP_ST_SYSTEM,//mpeg1
        VP_ST_PROGRAM,//mpeg2 program stream
        VP_ST_TRANSPORT_188,//mpeg2 transport stream,包长188
        VP_ST_TRANSPORT_204 //mpeg2 transport stream,包长204
      );  //* structures definition */  //*-- AUDIO_INFO struct ----*/
      LP_AUDIO_INFO = ^TAUDIO_INFO ;
      AUDIO_INFO = record
        ucStereo_ucLayer: Byte;
        ucBitRateIndex_FreqIndex: Byte;
        unBitRate: Word;
        ucMode: Byte;
        ucModeExt: Byte;
        unSampFreq: Word;
        szAudioMode: array [0..16-1] of char;
      end;
      
      TAUDIO_INFO = AUDIO_INFO;  //*-- TIME_CODE struct : from GOP */
      LP_TIME_CODE = ^TTIME_CODE ;
      TIME_CODE = record
        isDrop_ucPic: Byte;
        ucSec: Byte;
        ucMin: Byte;
        ucHours: Byte;
      end;
      
      TTIME_CODE = TIME_CODE;  //* Sequence header info */
      LP_SEQ_INFO = ^TSEQ_INFO ;
      SEQ_INFO = record
        dwOffSet: Integer;
        unHorizSize: Word;
        unVertSize: Word;
        ucPelAspectRatio: Byte;
        ucChromaFormat: Byte;
        ucVideoFormat: Byte;
        ucFrameRate: Byte;
        fPicturePerSecond: Single;
        dwBitRate: LongWord;
      end;
      
      TSEQ_INFO = SEQ_INFO;   //*--MAIN_VIDEO_INFO--*/
      LP_MAIN_VIDEO_INFO = ^MAIN_VIDEO_INFO;
      tagMAIN_VIDEO_INFO = record
        unVPID: Word;
        ucStreamID: Byte;
        fGetInfo_SecondField_GetPTS_TimeCode: Byte;
        VideoType: TVIDEO_TYPE;
        SeqInfo: SEQ_INFO;
        qwFirstVPTS: Int64;
        qwLastVPTS: Int64;
        FirstTimeCode: TIME_CODE;
        LastTimeCode: TIME_CODE;
        ucReserved: array [0..8-1] of byte;
        pNext: LP_MAIN_VIDEO_INFO;
      end;
      
      MAIN_VIDEO_INFO = tagMAIN_VIDEO_INFO ;
      //*--MAIN_AUDIO_INFO--*/
      LP_MAIN_AUDIO_INFO = ^MAIN_AUDIO_INFO;
      tagMAIN_AUDIO_INFO = record
        unAPID: Word;
        ucStreamID: Byte;
        fGetInfo_PTS: Byte;
        AudioInfo: AUDIO_INFO;
        qwFirstAPTS: Int64;
        qwLastAPTS: Int64;
        ucReserved: array [0..8-1] of byte;
        szLanguage: array [0..12-1] of char;
        pNext: LP_MAIN_AUDIO_INFO;
      end;
      
      MAIN_AUDIO_INFO = tagMAIN_AUDIO_INFO;  //*--SCR_INFO--*/
      LP_SCR_INFO = ^SCR_INFO;
      SCR_INFO = record
        qwFirstSCRB: Int64;
        qwLastSCRB: Int64;
      end;
      
      SCR_INFO = SCR_INFO;  //*-- SUBTITLE(DVD字幕) INFO struct --*/
      LP_MAIN_SUBT_INFO = ^MAIN_SUBT_INFO;
      tagMAIN_SUBT_INFO = record
        unSubID: Word;
        szLanguage: array [0..14-1] of char;
        nexttag: LP_MAIN_SUBT_INFO;
      end;
      
      MAIN_SUBT_INFO = tagMAIN_SUBT_INFO;  //*-- PROGRAM_TABLE struct --*/
      LP_PROGRAM_TABLE = ^PROGRAM_TABLE;
      tagPROGRAM_TABLE = record
        unProgramNo: Word;
        ucNumVideoStream_Audio_SubTitle: Word;
        unMAPPID_PCRPID_VerNum: LongWord;
        lpSCRInfo: LP_SCR_INFO;
        lpMainAudio: LP_MAIN_AUDIO_INFO;
        lpMainVideo: LP_MAIN_VIDEO_INFO;
        lpSubInfo: LP_MAIN_SUBT_INFO;
        pNext: LP_PROGRAM_TABLE;
      end;
      
      PROGRAM_TABLE = tagPROGRAM_TABLE;  //*--STREAM_INFO--*/
      LP_STREAM_INFO = ^TSTREAM_INFO;
      STREAM_INFO = record
        iOffset: Integer;
        StreamType: SYSTEM_TYPES;
        unVersion: Word;
        unNumberOfProgram: Word;
        lpProgramTable: LP_PROGRAM_TABLE;
        dwMuxRate: LongWord;
      end;
      
      TSTREAM_INFO = STREAM_INFO;  //* FileInfo function *//
      function tpkGetDuration(strFileName:Pchar): Cardinal; stdcall; external
              TpkUtilsDLL;
      function tpkFileInfo(strFileName : Pchar; lpInfo : LP_STREAM_INFO): integer;
              stdcall; external TpkUtilsDLL;
      function tpkFileInfoA(strFileName : Pchar):LP_STREAM_INFO; stdcall; external TpkUtilsDLL;
      function tpkFreeInfo(lpInfo : LP_STREAM_INFO):integer; stdcall; external TpkUtilsDLL;
      implementationend.