不用播放控件,自己写类,不用打开视频文件就可以读取文件信息,
要涉及到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得到的结果没有时,分,只有秒和帧,好像少了两个字节,但是我一直没有找出我的定义有什么不对的,郁闷!
要涉及到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得到的结果没有时,分,只有秒和帧,好像少了两个字节,但是我一直没有找出我的定义有什么不对的,郁闷!
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.