如何从MPG文件(VCD2.0)抽取单幅BMP/JPG图像?(200分)

  • 主题发起人 主题发起人 xijan
  • 开始时间 开始时间
X

xijan

Unregistered / Unconfirmed
GUEST, unregistred user!
如何从MPG文件(VCD2.0)抽取单幅BMP/JPG图像?
我知道AVI格式的方法,不知道MPG格式的方法。请大侠指教。
 
下载一个 DSPack 控件吧,里面有例子可以直接执行VCD,DVD,MPEG4,AVI,MPG等等,可以直接
截取图片。下载地址:
http://www.progdigy.com
 
To ZhiHuaLi:
我下载了DSPack1.5,安装后没说明不会用,其中Demo 也打不开。
仔细看了一下其中的DrictDraw.pas,头晕了半天。
我想在用MediaPlayer中播放VCD时取出任意一幅图像,用屏幕截取不行。
不知道超级解霸是如何实现。
 
用回调函数
看msdn把
 
用DS吧,我有控件的.
 
To LeeChange:
Lee大虾:请指教DS控件的应用!
 
用Premiere即可。
 
利用函数SurfaceFromBMP
Example
if SurfaceFromBMP(Bitmap, WorkPicSurface, WorkPicDesc, true) then

begin

if ScrachPicture then

BitMap.SaveToFile(bmpfilename);
 
to WGWANGANG,
虽然我还不懂surface,本人正努力学习DirectX及DSPack1.5......
 
to WGWANGANG,
我在DirectShow/MSDN中都没有找到以下函数,
if SurfaceFromBMP(Bitmap, WorkPicSurface, WorkPicDesc, true) then

if ScrachPicture then

能不能详细一点?

 
要用directshow了,建立 file source filter, 然后 render file
自己创建一个 ISamplegrab 的实例,然后在 graph 中枚举到 Video Render,
把 Samplegrab 插入到Video Render 之前。然后run ,SampleGrab的 Onsample 就
来了,你就可以保存每一个视频画面了。 
 
to:GGCAT
我的程序原理如下:
CoCreateInstance(CLSID_FilterGraph,NIL,CLSCTX_INPROC,IID_IGraphBuilder,dsGraphBuilder;
dsGraphBuilder.QueryInterface(IID_IMediaControl,dsMediaControl);
dsGraphBuilder.QueryInterface(IID_IMediaSeeking,dsMediaSeeking;
dsGraphBuilder.QueryInterface(IID_IBasicAudio,dsBasicAudio);
dsGraphBuilder.QueryInterface(IID_IBasicVideo,dsBasicVideo);
dsGraphBuilder.QueryInterface(IID_IVideoWindow,dsVideoWindow);
//
CoCreateInstance(CLSID_FilterGraph,NIL,CLSCTX_INPROC_SERVER,IID_IBaseFilter,dsBaseFilter);
//
dsBaseFilter.QueryInterface(IID_ISampleGrabber, dsSampleGrabber);
ZeroMemory(@mt,sizeof(TAM_MEDIA_TYPE));
mt.majortype:= MEDIATYPE_Video;
mt.subtype:= MEDIASUBTYPE_RGB24;
mt.formattype:= FORMAT_VideoInfo;
dsSampleGrabber.SetMediaType(mt);
dsGraphBuilder.AddFilter(dsBaseFilter,'Grabber');
If dsGraphBuilder.RenderFile(@UnicodeFileName,nil) = S_OK then
begin

If Assigned(dsSampleGrabber) then
begin

dsSampleGrabber.SetBufferSamples(TRUE);// 设立样例缓冲区
dsSampleGrabber.SetOneShot(TRUE);// 设立单步模式。
end;


但是(按照DirectShow中的说明)创建IID_IBaseFilter出错(其他正确,可以正常回放MPEG文件),
请教什么原因。
另外,如何保存为BMP文件:
procedure TMainForm.GrabButtonClick(Sender: TObject);
var
hBitmap : THANDLE;
MediaType: TAM_MEDIA_TYPE
BITMAPINFO: TBitmapInfo;
pVideoHeader: ^TVIDEOINFOHEADER;
buf : Pointer;
begin

dsSampleGrabber.GetConnectedMediaType(MediaType);
// 获取一个指向视频头的指针。
pVideoHeader:= MediaType.pbFormat;
// 视频头包含位图信息。// 将它拷贝到BITMAPINFO结构。
ZeroMemory(@BitmapInfo, sizeof(BitmapInfo));
CopyMemory(@BitmapInfo.bmiHeader, @(pVideoHeader.bmiHeader), sizeof(BITMAPINFOHEADER));
// 从位图头创建一个DIB并取得指向缓冲区的指针。
hBitmap:= CreateDIBSection(0, TBITMAPINFO(BitmapInfo), DIB_RGB_COLORS, buf, NULL, 0);
// 将图象拷贝到缓冲区。
dsSampleGrabber.GetCurrentBuffer(0,buf);
// ????????????SaveToFile('c:/test.bmp');???????????????
end;


 
经过摸索,基本了解DirectShow。创建IID_IBaseFilter出错的原因:必须安装DX8。
重点感谢:zhihuali,GGCAT。 有机会再请教。
 
学、习。中! 时间太久,结束吧! 散分!
 
后退
顶部