急,请问如何抓取动态视频格式文件的第一帧???(100分)

  • 主题发起人 主题发起人 kuangwenwei
  • 开始时间 开始时间
K

kuangwenwei

Unregistered / Unconfirmed
GUEST, unregistred user!
我想抓取动态视频文件的第1帧并保存为BMP格式的文件,AVI格式的文件已经可以做到了,但其它格式(如MPEG2)还不行,不知诊坛里有没有已经实现过这样功能的高手,最好有源码
 
看你得AVI用什么编码了。
FFMPEG库可以解开大多数编码。
 
用DSPACK控件吧,里面有抓图的功能
只要DSPACK能播就能抓
看我回答的这个贴子
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3928162
 
有没有不用第三方控件,更简单的方法
 
试试这个好用不:
用directshow 的ISampleGrabber接口GetCurrentBuffer方法捕获帧

例子:
SampleGrabber: ISampleGrabber;


procedure TMainForm.OpenFile(const FileName: string);

var
PFileName: array [0..255] of WideChar;

Filter: IBaseFilter;

MediaType: TAM_MEDIA_TYPE;

begin

CoCreateInstance(CLSID_FilterGraph, nil, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, GraphBuilder);


CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, Filter);

Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);

GraphBuilder.AddFilter(Filter, 'Grabber');

Filter:=nil;

ZeroMemory(@MediaType, SizeOf(TAM_MEDIA_TYPE));

MediaType.majortype:=MEDIATYPE_Video;

MediaType.subtype:=MEDIASUBTYPE_RGB24;

MediaType.formattype:=FORMAT_VideoInfo;

SampleGrabber.SetMediaType(MediaType);

SampleGrabber.SetBufferSamples(True);


StringToWideChar(FileName, PFileName, 255);

GraphBuilder.RenderFile(PFileName, nil);


GraphBuilder.QueryInterface(IID_IVideoWindow, VideoWindow);

VideoWindow.put_Owner(DisplayPanel.Handle);

VideoWindow.put_WindowStyle(WS_CHILD or WS_CLIPSIBLINGS);

VideoWindow.put_Visible(True);

DisplayPanelResize(nil);


GraphBuilder.QueryInterface(IID_IMediaSeeking, MediaSeek);

MediaSeek.SetTimeFormat(Time_Format_Frame);


GraphBuilder.QueryInterface(IID_IMediaControl, MediaControl);


GraphBuilder.QueryInterface(IID_IMediaEventEx, MediaEvent);

MediaEvent.SetNotifyWindow(Handle, WM_GraphNotify, 0);

end;




procedure TMainForm.SpeedButton7Click(Sender: TObject);

var
MediaType: TAM_MEDIA_TYPE;

VideoInfoHeader: TVideoInfoHeader;

BitmapInfo: TBitmapInfo;

Bitmap: HBitmap;

Buffer: Pointer;

BufferSize: Integer;

begin

SampleGrabber.GetConnectedMediaType(MediaType);


ZeroMemory(@VideoInfoHeader, SizeOf(TVideoInfoHeader));

CopyMemory(@VideoInfoHeader, MediaType.pbFormat, SizeOf(VideoInfoHeader));


ZeroMemory(@BitmapInfo, SizeOf(TBitmapInfo));

CopyMemory(@BitmapInfo, @VideoInfoHeader.bmiHeader, SizeOf(VideoInfoHeader.bmiHeader));


Bitmap:=CreateDIBSection(0, BitmapInfo, DIB_RGB_COLORS, Buffer, 0, 0);

SampleGrabber.GetCurrentBuffer(BufferSize, Buffer);


Image1.Picture.Bitmap.Handle:=Bitmap
end;
 
to madeagle,
编译不通过,是不是还要装第三方控件?
我加载了DirectShow.pas 版本是8.1 的都不行
 
提示哪错了?不用装第三方控件
我没测试,一下帮你测一下
 
to madeagle,

能否发一个可以编译通过的程序给我,上面的程序编译通不过,谢了
我的邮箱:kww2002@sina.com
 
变量没定义:
undeclared identifier:'CoCreateInstance'
undeclared identifier:'CLSCTX_INPROC_SERVER'
undeclared identifier:'GraphBuilder'

.....
..
.
.
 
use ActiveX,directshow9
 
to madeagle

我这边还是编译不过,能否发一个directshow9给我?
我的邮箱:kww2002@sina.com
 
8也可以呀,DSPACK包里有directshow9!
我这儿没有,网上很多呀,编译通不过就看看他的类型在哪个包里,USE上就行了
正常装完DIRECTOSHOW的包就能通过了,去网上搜下吧,很多
 
http://www.directshow.cn/SDK/DX9SDK.rar
用 XUNLEI下,最简单还是用DSPACK,这玩意儿没有太简单的,呵呵
用DIRECTSHOW装的东西还多呢
 
还是不能编译通过,我用的是dspack23
 
这几天大富翁被挂马了吧?我的机器中毒了
最近几天没上,那你就下个200兆那个吧,装完应该差不多
 
后退
顶部