首页 > 学院 > 开发设计 > 正文

DirectShow之接口实战篇(三)

2019-11-18 18:35:11
字体:
来源:转载
供稿:网友
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;
即可。

上一篇:DirectShow之接口实战篇(二)

下一篇:通过原代码学习TComponent类的机制(1)

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
学习交流
热门图片

新闻热点

疑难解答

图片精选

网友关注