AVI问题

huzi 2000-01-21 09:39:00
哪位能告诉如何判断一个AVI文件的实际播放时间。
MediaPlayer.Length所给出的值好象不对。
谢谢!
...全文
223 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Venne 2000-01-21
  • 打赏
  • 举报
回复
我告诉你使用这样的方法来获得播放时间,LENGTH给的值是对的,但首先你要OPEN它,还要设置其时间格式,我使用的是毫秒,然后我把这个值赋给一个进程条的最大值,当MPlayer的Position属性改变之后,将Position值赋给进度条的Position,这样,AVI的时间是正确显示了。
MediaPlayer1.TimeFormat:=tfMilliseconds;
该LENGTH即返回以毫秒计算长度的播放时间值。

另外,贴一个BORLAND的帮助:
type

HMSRec = record
Hours: byte;
Minutes: byte;
Seconds: byte;
NotUsed: byte;

end;

procedure TForm1.Button1Click(Sender: TObject);

var
TheLength: LongInt;
begin

{ Set time format - note that some devices don抰 support tfHMS }

MediaPlayer1.TimeFormat := tfHMS;
{ Store length of currently loaded media }
TheLength := MediaPlayer1.Length;
with HMSRec(TheLength) do { Typecast TheLength as a HMSRec record }
begin
Label1.Caption := IntToStr(Hours); { Display Hours in Label1 }
Label2.Caption := IntToStr(Minutes); { Display Minutes in Label2 }
Label3.Caption := IntToStr(Seconds); { Display Seconds in Label3 }
end;
end;

LaoZheng 2000-01-21
  • 打赏
  • 举报
回复
DCAVIPlay控件或利用avifil32.dll函数

unit Vfw;
////////////////////////////////////////////////////////////////////////////////
// //
// Video for Windows //
// //
////////////////////////////////////////////////////////////////////////////////
// //
// Adapted from Thomas Schimming's VFW.PAS //
// (c) 1996 Thomas Schimming, schimmin@iee1.et.tu-dresden.de //
// (c) 1998,99 Anders Melander //
// //
////////////////////////////////////////////////////////////////////////////////
// //
// Ripped all COM/ActiveX stuff and added some AVI stream functions. //
// //
////////////////////////////////////////////////////////////////////////////////
interface

uses
{$ifdef VER90}
ole2,
{$else}
ActiveX,
{$endif}
Windows;

type

{ TAVIFileInfoW record }

LONG = Longint;
PVOID = Pointer;

// TAVIFileInfo dwFlag values
const
AVIF_HASINDEX = $00000010;
AVIF_MUSTUSEINDEX = $00000020;
AVIF_ISINTERLEAVED = $00000100;
AVIF_WASCAPTUREFILE = $00010000;
AVIF_COPYRIGHTED = $00020000;
AVIF_KNOWN_FLAGS = $00030130;

type
TAVIFileInfoW = record
dwMaxBytesPerSec, // max. transfer rate
dwFlags, // the ever-present flags
dwCaps,
dwStreams,
dwSuggestedBufferSize,

dwWidth,
dwHeight,

dwScale,
dwRate, // dwRate / dwScale == samples/second
dwLength,

dwEditCount: DWORD;

szFileType: array[0..63] of WideChar; // descriptive string for file type?
end;
PAVIFileInfoW = ^TAVIFileInfoW;

// TAVIStreamInfo dwFlag values
const
AVISF_DISABLED = $00000001;
AVISF_VIDEO_PALCHANGES= $00010000;
AVISF_KNOWN_FLAGS = $00010001;

type
TAVIStreamInfoA = record
fccType,
fccHandler,
dwFlags, // Contains AVITF_* flags
dwCaps: DWORD;
wPriority,
wLanguage: WORD;
dwScale,
dwRate, // dwRate / dwScale == samples/second
dwStart,
dwLength, // In units above...
dwInitialFrames,
dwSuggestedBufferSize,
dwQuality,
dwSampleSize: DWORD;
rcFrame: TRect;
dwEditCount,
dwFormatChangeCount: DWORD;
szName: array[0..63] of AnsiChar;
end;
TAVIStreamInfo = TAVIStreamInfoA;
PAVIStreamInfo = ^TAVIStreamInfo;

{ TAVIStreamInfoW record }

TAVIStreamInfoW = record
fccType,
fccHandler,
dwFlags, // Contains AVITF_* flags
dwCaps: DWORD;
wPriority,
wLanguage: WORD;
dwScale,
dwRate, // dwRate / dwScale == samples/second
dwStart,
dwLength, // In units above...
dwInitialFrames,
dwSuggestedBufferSize,
dwQuality,
dwSampleSize: DWORD;
rcFrame: TRect;
dwEditCount,
dwFormatChangeCount: DWORD;
szName: array[0..63] of WideChar;
end;

PAVIStream = pointer;
PAVIFile = pointer;
TAVIStreamList = array[0..0] of PAVIStream;
PAVIStreamList = ^TAVIStreamList;
TAVISaveCallback = function (nPercent: integer): LONG; stdcall;

TAVICompressOptions = packed record
fccType : DWORD;
fccHandler : DWORD;
dwKeyFrameEvery : DWORD;
dwQuality : DWORD;
dwBytesPerSecond : DWORD;
dwFlags : DWORD;
lpFormat : pointer;
cbFormat : DWORD;
lpParms : pointer;
cbParms : DWORD;
dwInterleaveEvery : DWORD;
end;
PAVICompressOptions = ^TAVICompressOptions;

// Palette change data record
const
RIFF_PaletteChange: DWORD = 1668293411;
type
TAVIPalChange = packed record
bFirstEntry : byte;
bNumEntries : byte;
wFlags : WORD;
peNew : array[byte] of TPaletteEntry;
end;
PAVIPalChange = ^TAVIPalChange;

procedure AVIFileInit; stdcall;
procedure AVIFileExit; stdcall;
function AVISaveOptions(hwnd: HWND;uiFlags:UINT;nStreams:integer;var ppavi:PAVISTREAM;var plpOptions: PAVICOMPRESSOPTIONS):Boolean;stdcall;
function AVIFileOpen(var ppfile: PAVIFile; szFile: PChar; uMode: UINT; lpHandler: pointer): HResult; stdcall;
function AVIFileCreateStream(pfile: PAVIFile; var ppavi: PAVISTREAM; var psi: TAVIStreamInfo): HResult; stdcall;
function AVIStreamSetFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; cbFormat: LONG): HResult; stdcall;
function AVIStreamReadFormat(pavi: PAVIStream; lPos: LONG; lpFormat: pointer; var cbFormat: LONG): HResult; stdcall;
function AVIStreamWrite(pavi: PAVIStream; lStart, lSamples: LONG; lpBuffer: pointer; cbBuffer: LONG; dwFlags: DWORD; var plSampWritten: LONG; var plBytesWritten: LONG): HResult; stdcall;
function AVIStreamWriteData(pavi: PAVIStream; ckid: DWORD; lpData: pointer; cbData: LONG): HResult; stdcall;
function AVIStreamRelease(pavi: PAVISTREAM): ULONG; stdcall;
function AVIFileRelease(pfile: PAVIFile): ULONG; stdcall;
function AVIFileGetStream(pfile: PAVIFile; var ppavi: PAVISTREAM; fccType: DWORD; lParam: LONG): HResult; stdcall;
function AVIStreamBeginStreaming(pavi: PAVISTREAM; lStart, lEnd: LONG; lRate: LONG): HResult; stdcall;
function AVIStreamEndStreaming(pavi: PAVISTREAM): HResult; stdcall;
function AVIStreamGetFrameOpen(pavi: PAVISTREAM; var lpbiWanted: TBitmapInfoHeader): pointer; stdcall;
function AVIStreamGetFrame(pgf: pointer; lPos: LONG): pointer; stdcall;
function AVIStreamGetFrameClose(pget: pointer): HResult; stdcall;
function AVIStreamInfo(pavi: PAVISTREAM; var psi: TAVIStreamInfo; lSize: LONG): HResult; stdcall;
function AVIStreamLength(pavi: PAVISTREAM): LONG; stdcall;
function CreateEditableStream(var ppsEditable: PAVISTREAM; psSource: PAVISTREAM): HResult; stdcall;
function EditStreamSetInfo(pavi: PAVISTREAM; var lpInfo: TAVIStreamInfo; cbInfo: LONG): HResult; stdcall;
function AVIMakeFileFromStreams(var ppfile: PAVIFILE; nStreams: integer; papStreams: PAVIStreamList): HResult; stdcall;
function AVISave(szFile: PChar; pclsidHandler: PCLSID; lpfnCallback: TAVISaveCallback;nStreams: integer; pavi: PAVISTREAM; lpOptions: PAVICompressOptions): HResult; stdcall;
function AVIMakeCompressedStream(var ppsCompressed:PAVISTREAM;ppsSource: PAVISTREAM;lpOptions:PAVICOMPRESSOPTIONS;pclsidHandler: PCLSID): HResult; stdcall;

const
AVIERR_OK = 0;

AVIIF_LIST = $01;
AVIIF_TWOCC = $02;
AVIIF_KEYFRAME = $10;

streamtypeVIDEO = $73646976; // DWORD( 'v', 'i', 'd', 's' )

implementation

procedure AVIFileInit; stdcall; external 'avifil32.dll' name 'AVIFileInit';
procedure AVIFileExit; stdcall; external 'avifil32.dll' name 'AVIFileExit';
function AVISaveOptions;stdcall;external 'avifil32.dll' name 'AVISaveOptions';
function AVIFileOpen; external 'avifil32.dll' name 'AVIFileOpenA';
function AVIFileCreateStream; external 'avifil32.dll' name 'AVIFileCreateStreamA';
function AVIStreamSetFormat; external 'avifil32.dll' name 'AVIStreamSetFormat';
function AVIStreamReadFormat; external 'avifil32.dll' name 'AVIStreamReadFormat';
function AVIStreamWrite; external 'avifil32.dll' name 'AVIStreamWrite';
function AVIStreamWriteData; external 'avifil32.dll' name 'AVIStreamWriteData';
function AVIStreamRelease; external 'avifil32.dll' name 'AVIStreamRelease';
function AVIFileRelease; external 'avifil32.dll' name 'AVIFileRelease';
function AVIFileGetStream; external 'avifil32.dll' name 'AVIFileGetStream';
function AVIStreamBeginStreaming; external 'avifil32.dll' name 'AVIStreamBeginStreaming';
function AVIStreamEndStreaming; external 'avifil32.dll' name 'AVIStreamEndStreaming';
function AVIStreamGetFrameOpen; external 'avifil32.dll' name 'AVIStreamGetFrameOpen';
function AVIStreamGetFrame; external 'avifil32.dll' name 'AVIStreamGetFrame';
function AVIStreamGetFrameClose; external 'avifil32.dll' name 'AVIStreamGetFrameClose';
function AVIStreamInfo; external 'avifil32.dll' name 'AVIStreamInfo';
function AVIStreamLength; external 'avifil32.dll' name 'AVIStreamLength';
function CreateEditableStream; external 'avifil32.dll' name 'CreateEditableStream';
function EditStreamSetInfo; external 'avifil32.dll' name 'EditStreamSetInfo';
function AVIMakeFileFromStreams; external 'avifil32.dll' name 'AVIMakeFileFromStreams';
function AVISave; external 'avifil32.dll' name 'AVISave';
function AVIMakeCompressedStream;external 'avifil32.dll' name 'AVIMakeCompressedStream';
(*
typedef struct {
unsigned long dwMicroSecPerFrame;
unsigned long dwMaxBytesPerSec;
unsigned long dwReserved1;
unsigned long dwFlags;
unsigned long dwTotalFrames;
unsigned long dwInitialFrames;
unsigned long dwStreams;
unsigned long dwSuggestedBufferSize;
unsigned long dwWidth;
unsigned long dwHeight;
unsigned long dwScale;
unsigned long dwRate;
unsigned long dwStart;
unsigned long dwLength;
} MainAVIHeader;

#define AVIF_HASINDEX 0x00000010
#define AVIF_MUSTUSEINDEX 0x00000020
#define AVIF_ISINTERLEAVED 0x00000100
#define AVIF_WASCAPTUREFILE 0x00010000
#define AVIF_COPYRIGHTED 0x00020000

#define AVIF_KNOWN_FLAGS 0x00030130

#define Defined_MainAVIHeader_Size (14*4)

typedef struct {
unsigned long fccType;
unsigned long fccHandler;
unsigned long dwFlags;
unsigned long dwReserved1;
unsigned long dwInitialFrames;
unsigned long dwScale;
unsigned long dwRate;
unsigned long dwStart;
unsigned long dwLength;
unsigned long dwSuggestedBufferSize;
unsigned long dwQuality;
unsigned long dwSampleSize;
unsigned long dwReserved2;
unsigned long dwReserved3;
} AVIStreamHeader;

#define AVISF_DISABLED 0x00000001
#define AVISF_VIDEO_PALCHANGES 0x00010000

#define AVISF_KNOWN_FLAGS 0x00010001

#define Defined_AVIStreamHeader_Size_old (12*4)
#define Defined_AVIStreamHeader_Size (14*4)

typedef struct {
unsigned char bFirstEntry;
unsigned char bNumEntries;
unsigned short wFlags;
} AVIPALCHANGE;

typedef struct {
unsigned long ckid;
unsigned long dwFlags;
unsigned long dwChunkOffset;
unsigned long dwChunkLength;
} AVIINDEXENTRY;

#define AVIIF_LIST 0x00000001
#define AVIIF_KEYFRAME 0x00000010
#define AVIIF_FIRSTPART 0x00000020
#define AVIIF_LASTPART 0x00000040
#define AVIIF_MIDPART (AVIIF_LASTPART and AVIFF_FIRSTPART)
#define AVIIF_NOTIME 0x00000100
#define AVIIF_COMPUSE 0x0fff0000

#define AVIIF_KNOWN_FLAGS 0x0fff0171

#define Defined_AVIINDEXENTRY_Size (4*4)
*)
end.

Venne 2000-01-21
  • 打赏
  • 举报
回复
不会呀,或者你试一下顺序:
先设置时间格式,再打开AVI,再获得长度。
以下的代码供参考,在表单上放置一个可以获得文件名的控件,一个TIMER,一个MEDIAPLAYER,一个PANEL,一个PROGRESSBAR,TIMER的ENABLED属性为假,间距为100MS

procedure TForm1.FileListBox1Click(Sender: TObject);
begin
if FileListbox1.SelCount =0 then exit;
With mediaPlayer1 do begin
Close;
TimeFormat := tfMilliseconds;
FileName :=FileListbox1.FileName ;
Open ;
progressbar1.Max :=Length;
play;
timer1.Enabled :=true;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if Mediaplayer1.Mode =mpPlaying then begin
progressbar1.Position :=mediaplayer1.Position ;
end else begin
progressbar1.Position :=0;
timer1.Enabled :=false;
end;
end;
huzi 2000-01-21
  • 打赏
  • 举报
回复
用这个方法,就是不行。不知有什么需要进一步注意的?

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧