高分求怎样从wmv文件里取出某一帧保存为图片 ( 积分: 300 )

  • 主题发起人 主题发起人 chzi826
  • 开始时间 开始时间
C

chzi826

Unregistered / Unconfirmed
GUEST, unregistred user!
望有源码,或是通过某些控件取到也行,那些边播放边保存的方法就不需要了
 
望有源码,或是通过某些控件取到也行,那些边播放边保存的方法就不需要了
 
DSPack是一套封装了完整的DirectX多媒体功能的Delphi控件,里面的详细的例子,请查阅!
 
能不能说得详细些,这个控件我也在用的。
 
unit main;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DSUtil, StdCtrls, DSPack, DirectShow9, Menus, ExtCtrls;

type
TVideoForm = class(TForm)
FilterGraph: TFilterGraph;
VideoWindow: TVideoWindow;
MainMenu1: TMainMenu;
Devices: TMenuItem;
Filter: TFilter;
Image: TImage;
SampleGrabber: TSampleGrabber;
SnapShot: TButton;
CallBack: TCheckBox;
procedure FormCreate(Sender: TObject);
procedure FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
procedure SnapShotClick(Sender: TObject);
procedure SampleGrabberBuffer(sender: TObject;
SampleTime:do
uble;
pBuffer: PByte;
BufferLen: Integer);
private
public
procedure OnSelectDevice(sender: TObject);
end;


var
VideoForm: TVideoForm;
SysDev: TSysDevEnum;
implementation

{$R *.dfm}

procedure TVideoForm.FormCreate(Sender: TObject);
var
i: integer;
Device: TMenuItem;
begin

SysDev:= TSysDevEnum.Create(CLSID_VideoInputDeviceCategory);
if SysDev.CountFilters > 0 then

for i := 0 to SysDev.CountFilters - 1do

begin

Device := TMenuItem.Create(Devices);
Device.Caption := SysDev.Filters.FriendlyName;
Device.Tag := i;
Device.OnClick := OnSelectDevice;
Devices.Add(Device);
end;

end;


procedure TVideoForm.OnSelectDevice(sender: TObject);
begin

FilterGraph.ClearGraph;
FilterGraph.Active := false;
Filter.BaseFilter.Moniker := SysDev.GetMoniker(TMenuItem(Sender).tag);
FilterGraph.Active := true;
with FilterGraph as ICaptureGraphBuilder2do

RenderStream(@PIN_CATEGORY_PREVIEW, nil, Filter as IBaseFilter, SampleGrabber as IBaseFilter, VideoWindow as IbaseFilter);
FilterGraph.Play;
end;


procedure TVideoForm.FormCloseQuery(Sender: TObject;
var CanClose: Boolean);
begin

SysDev.Free;
FilterGraph.ClearGraph;
FilterGraph.Active := false;
end;


procedure TVideoForm.SnapShotClick(Sender: TObject);
begin

[red] SampleGrabber.GetBitmap(Image.Picture.Bitmap);[/red]
end;


procedure TVideoForm.SampleGrabberBuffer(sender: TObject;
SampleTime:do
uble;
pBuffer: PByte;
BufferLen: Integer);
begin

if CallBack.Checked then

begin

Image.Canvas.Lock;
try
[red] SampleGrabber.GetBitmap(Image.Picture.Bitmap, pBuffer, BufferLen);[/red]
finally
Image.Canvas.Unlock;
end;

end;

end;


end.
 
favinc
这个例子我试过,但并不是我想要的,我需要的是在不播放的情况下能从文件里提取一帧来保存为图片。
 
不播放,意味着文件未经初始化,那么想从里面准确地取出任意一帧那是不太现实的事。
你可以用dspack来打开该文件,然后正常初始化,但播放时可不让图像显示出来。
我至今没见过不播放的情况下能这样取得到的,包括著名的EO,豪杰等媒体文件转换工具,它们也是一边播放一边转换的。

好好想想。
 
他的要求只有视频编辑工具可以了,比如sony的vegas,adodb公司的premier等来做了。
 
不是吧。。。。。就真的没一点办法了?
 
给你个思路,视频文件都应该有头,用以说明一帧的大小、位置、压缩方法等信息,分析后定位就可以了吗,呵呵乱说,仅供参考:)
 
提供一个思路
wmv文件是asf格式的文件,你需要根据asf文件格式解释整个文件,
还有你所说的某一帧,我不知道是指什么,如果你不观看你怎么知道是那帧,
这个某一帧是怎么得到的,怎么表示这一帧
根据这一帧的特征 找到这一帧在文件里的位置,找到相关的关键帧,通过相关的关键帧解释成人类可以看到的画面然后就可以吧画面截屏保存,
不知道对不对能不能实现,如果实现了说一声,怎么实现的
 
WMV是ASF格式的文件是不错 ASF有很多版本的说
难道那么多版本的解码都要手动写一下??

直接取出来的方法估计难度非常的大 并且不实用

可以打开一个资源管理器 找到一个都是WMV的目录 缩略图察看
你会发现打开的速度非常的慢 微软也是一样用播放器打开 截图的。。。
 
多人接受答案了。
 
后退
顶部