Как прочитать свойства видеофайла?
01.01.2007
Below is some code to get some of the data. To use the DirectDraw/ DirectShow calls you need either the older DSHOW.PAS (DX6) or more current DirectShow.pas header conversion from the Project JEDI web site:
type TDSMediaInfo = record SurfaceDesc: TDDSurfaceDesc; Pitch: integer; PixelFormat: TPixelFormat; MediaLength: Int64; AvgTimePerFrame: Int64; FrameCount: integer; Width: integer; Height: integer; FileSize: Int64; end; function GetHugeFileSize(const FileName: string): int64; var FileHandle: hFile; begin FileHandle := FileOpen(FileName, fmOpenRead or fmShareDenyNone); try LARGE_INTEGER(Result).LowPart := GetFileSize(FileHandle, @LARGE_INTEGER(Result).HighPart); if LARGE_INTEGER(Result).LowPart = $FFFFFFFF then Win32Check(GetLastError = NO_ERROR); finally FileClose(FileHandle); end; end; function GetMediaInfo(FileName: WideString): TDSMediaInfo; var DirectDraw: IDirectDraw; AMStream: IAMMultiMediaStream; MMStream: IMultiMediaStream; PrimaryVidStream: IMediaStream; DDStream: IDirectDrawMediaStream; GraphBuilder: IGraphBuilder; MediaSeeking: IMediaSeeking; TimeStart, TimeStop: Int64; DesiredSurface: TDDSurfaceDesc; DDSurface: IDirectDrawSurface; begin if FileName = '' then raise Exception.Create('No File Name Specified'); OleCheck(DirectDrawCreate(nil, DirectDraw, nil)); DirectDraw.SetCooperativeLevel(GetDesktopWindow(), DDSCL_NORMAL); Result.FileSize := GetHugeFileSize(FileName); AMStream := IAMMultiMediaStream(CreateComObject(CLSID_AMMultiMediaStream)); OleCheck(AMStream.Initialize(STREAMTYPE_READ, AMMSF_NOGRAPHTHREAD, nil)); OleCheck(AMStream.AddMediaStream(DirectDraw, MSPID_PrimaryVideo, 0, IMediaStream(nil^))); OleCheck(AMStream.OpenFile(PWideChar(FileName), AMMSF_NOCLOCK)); AMStream.GetFilterGraph(GraphBuilder); MediaSeeking := GraphBuilder as IMediaSeeking; MediaSeeking.GetDuration(Result.MediaLength); MMStream := AMStream as IMultiMediaStream; OleCheck(MMStream.GetMediaStream(MSPID_PrimaryVideo, PrimaryVidStream)); DDStream := PrimaryVidStream as IDirectDrawMediaStream; DDStream.GetTimePerFrame(Result.AvgTimePerFrame); {Result.FrameCount := Result.MediaLength div Result.AvgTimePerFrame;} { TODO : Test for better accuracy } Result.FrameCount := Round(Result.MediaLength / Result.AvgTimePerFrame); Result.MediaLength := Result.FrameCount * Result.AvgTimePerFrame; ZeroMemory(@DesiredSurface, SizeOf(DesiredSurface)); DesiredSurface.dwSize := Sizeof(DesiredSurface); OleCheck(DDStream.GetFormat(TDDSurfaceDesc(nil^), IDirectDrawPalette(nil^), DesiredSurface, DWord(nil^))); Result.SurfaceDesc := DesiredSurface; DesiredSurface.ddsCaps.dwCaps := DesiredSurface.ddsCaps.dwCaps or DDSCAPS_OFFSCREENPLAIN or DDSCAPS_SYSTEMMEMORY; DesiredSurface.dwFlags := DesiredSurface.dwFlags or DDSD_CAPS or DDSD_PIXELFORMAT; {Create a surface here to get vital statistics} OleCheck(DirectDraw.CreateSurface(DesiredSurface, DDSurface, nil)); OleCheck(DDSurface.GetSurfaceDesc(DesiredSurface)); Result.Pitch := DesiredSurface.lPitch; if DesiredSurface.ddpfPixelFormat.dwRGBBitCount = 24 then Result.PixelFormat := pf24bit else if DesiredSurface.ddpfPixelFormat.dwRGBBitCount = 32 then Result.PixelFormat := pf32bit; Result.Width := DesiredSurface.dwWidth; Result.Height := DesiredSurface.dwHeight; end;
Взято с Delphi Knowledge Base: https://www.baltsoft.com/