DirectShow之接口实战篇(三)

王朝delphi·作者佚名  2006-01-08
宽屏版  字体: |||超大  

DirectShow之接口实战篇(三)

播放速度的设定

需要使用ImediaPosition的方法。

MediaPosition.put_Rate(1);//正常

MediaPosition.put_Rate(0.25);//慢速

MediaPosition.put_Rate(2);//快速

单帧播放控制

需要使用IvideoFrameStep的方法

VideoFrameStep.Step(1, nil);

音量控制

需要使用IbasicAudio的方法

增加音量:

BasicAudio.get_Volume (&volume);//得到音量

volume:= volume +volumestep;

BasicAudio.put_Volume (volume);//增加一定的音量的分贝

减小音量:

BasicAudio.get_Volume (&volume); //得到音量

volume:= volume -volumestep;

BasicAudio.putVolume (volume); //减小一定音量的分贝

显示放大缩小控制

只需改变Edit1的大小,然后使用IvideoWindow接口方法即可

VideoWindow.SetWindowPosition(0, 0, Edit1.Width, Edit1.Height);

单帧捕获,抓图

其实很多接口都提供了此功能,但是我更倾向于使用IsampleGrabber接口来实现,相对来说,效率高些。

这个控制起来做的工作稍微多些,首先,在打开文件的时候

var MediaType: TAM_MEDIA_TYPE;

ZeroMemory(@MediaType, SizeOf(TAM_MEDIA_TYPE));

MediaType.majortype := MEDIATYPE_Video;//视频流

MediaType.subtype := MEDIASUBTYPE_RGB24;//24位图象

MediaType.formattype := FORMAT_VideoInfo;

SampleGrabber.SetMediaType(MediaType);//关联接口

SampleGrabber.SetBufferSamples(True);

然后在抓图按钮事件中如下操作

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;

即可。

在这里,先总结这么多,希望对大家有所帮助,这些只是DirectX的一个皮毛,它可以实现的功能十分强大,我也只是把我在实际中的遇到的问题总结出来供大家参考,后面的工作还很多,我想我会逐步的更深入的总结这方面的经验发表出来与大家分享,好了,DirectShow接口施展篇到这里该完结了,如果大家有补充或者想法,请发表出来以便我总结整理,谢谢大家。

完结

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有