LeeChange请进,有问题向你请教,也请大家帮忙(100分)

  • 主题发起人 主题发起人 u2m
  • 开始时间 开始时间
U

u2m

Unregistered / Unconfirmed
GUEST, unregistred user!
DirectShow的抓图接口太占资源,我把它单提出来,没有放在初始化接口的时候一并初始化它,否则资源占的很厉害,我提出来之后,关键一句报错了,不知原因,帮忙看看。
用的directshow9.0接口,不过和8.1接口只是那个类型变了个名字而已
type
// DirectShow Media Player.
TDSMP = record
Initialized: boolean;

// DirectShow stuff.
GraphBuilder: IGraphBuilder;
MediaControl: IMediaControl;
MediaSeeking: IMediaSeeking;
MediaPosition: IMediaPosition;
MediaEventEx: IMediaEvent;
BasicAudio: IBasicAudio;
BasicVideo: IBasicVideo;
VideoWindow: IVideoWindow;
SampleGrabber: ISampleGrabber;
VideoFrameStep: IVideoFrameStep;
//AMVideoProcAmp:IAMVideoProcAmp;
// Video info.
VideoAvail: boolean;
VideoWidth: integer;
VideoHeight: integer;
VideoBitRate: integer;
VideoFPS: single;
end;


procedure TFrmPlay.Capture1Frame(var _dsmp: TDSMP);
var
Filter: IBaseFilter;
MediaType: TAMMediaType;
VideoInfoHeader: TVideoInfoHeader;
BitmapInfo: TBitmapInfo;
Bitmap: HBitmap;
Buffer: Pointer;
BufferSize: Integer;
strtime: string;
PicFileName: string;
begin

strtime := FormatDateTime('yymmddhhnnss', now);
PicFileName := 'D:/' + '1.bmp';
with _dsmpdo

begin

if failed(CoCreateInstance(CLSID_SampleGrabber, nil, CLSCTX_INPROC_SERVER,
IID_IBaseFilter, Filter)) then
exit;

Filter.QueryInterface(IID_ISampleGrabber, SampleGrabber);
GraphBuilder.AddFilter(Filter, 'Grabber');

Filter := nil;
ZeroMemory(@MediaType, SizeOf(TAMMediaType));
MediaType.majortype := MEDIATYPE_Video;
MediaType.subtype := MEDIASUBTYPE_RGB24;
MediaType.formattype := FORMAT_VideoInfo;
SampleGrabber.SetMediaType(MediaType);
SampleGrabber.SetBufferSamples(True);

SampleGrabber.GetConnectedMediaType(MediaType);
ZeroMemory(@VideoInfoHeader, SizeOf(TVideoInfoHeader));
//执行后,下句报错,pbFormat为nil
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);

frmPicBrowse.imgBrowse.Picture.Bitmap.Handle := Bitmap;
frmPicBrowse.imgBrowse.Picture.SaveToFile(PicFileName);
frmPicBrowse.Show;
end;

end;
 
一开始就初始化吧,在Filter Graph运行中改变结构是很罗嗦的,决非上面的代码那么简单,而且不是所有的动态改动都能实现。
 
LeeChange:一开始初始化很占资源的,我现在要实现的是多路同时回放,如果只是1,2路的话还勉强可以,但多了就不行了,这个接口占资源很厉害。没有其他办法吗/
 
你一定要这么做,就给你指条路吧.
找到SampleGrabber前的OutPin,
用QueryInterface在他上面获得IPinFlowControl接口,调用此接口的Block方法阻塞数据流.
用AddFilter加入Grabber,设置他的Pin的MediaType,
在Graph上获得IGraphConfig接口,调用他的Reconnect方法连接Grabber.
再次调用Block重新开启数据流.
 
还是不大清楚,可否给个例子参考参考
 
总是达不到抓图成功的结果,不是抓出来的是黑色的就是出错。
各位谁能给出一个正确的抓图函数来,要求等到调用抓图的时候才初始化那个接口。
 
我是来听训的!:)
 
各位,帮忙了
 
后退
顶部