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;
即可。