Delphi7 下基于SDL2+FFMPEG 实现USB摄像头播放及拍照

目录

 

简述:

准备工作

获取视频设备类表

FFMPEG视频解码

视频播放

拍照

Demo下载



简述:

    delphi7 下进行USB摄像头开发网上的办法一般两种1。基于AVICAP32的windowsAPI 2.基于DSPack 控件。本文将介绍利用FFMPEG+SDL2实现USB摄像头的播放及拍照。

实现效果图如下

准备工作

    注:以下所需资源可以直接从我的网盘下载。

链接:https://pan.baidu.com/s/1IoJvgI8Y5_3DqhCGTvs4Cw
提取码:pdga

  1.  FFMPEG Delphi7 的DLL封装及头文件。这里利用了FFVCL对FFMPEG的封装。可以在  其官网下载FFVCL – Delphi FFmpeg VCL Components(Video Encoder and Video Player)。可以从我的网盘下载。
  2. SDL2 Delphi7的DLL封装及头文件。可以在官网Simple DirectMedia Layer - Homepage下载。也可以从我的网盘下载。
  3. 因为FFMPEG枚举视频设备列表时对中文的不友好。而有些媒体设备的名称为中文,因此采用DSP控件中DirectShow9实现。可以从我的网盘下载。也可以自行百度下载。

获取视频设备类表

         这里借助DSPACK,因为方便。当然也可以直接使用COM访问DirectShow。必须引用的单元文件DSUtil,DirectShow9,ActiveX,mmsystem。

        主要方法:

unit rocmediadev;

interface
uses
  classes,DSUtil,DirectShow9,ActiveX,mmsystem;
type
   
  //媒体格式定义
  TRocMediaFormat = class
  End;
  //视频媒体格式
  TVideoFormat=class(TRocMediaFormat)
  private
    FWidth:Integer;    //视频分辨率
    FHeight:Integer;   //视频分辨率
    FAvgTimePerFrame:Integer; //每帧时间
    FBitRate:Integer;         //码率
  public
    procedure  setFormat(const w,h,atpf,b:Integer);
    constructor Create(const w,h,atpf,b:Integer);
  published
    property Width:Integer read FWidth;
    property Height:Integer read FHeight;
    property AvgTimePerFrame:Integer read FAvgTimePerFrame;
    property BitRate:Integer read FBitRate;
  End;

  //音频媒体格式
  TAudioFormat=class(TRocMediaFormat)
  private
    FAudioFormat:TWAVEFORMATEX;
  public
    procedure  setFormat(const fmt:TWAVEFORMATEX);
    constructor Create(const fmt:TWAVEFORMATEX);
  published
    property AudioFormat:TWAVEFORMATEX read FAudioFormat;
  End;
  
  //设备媒体格式列表
  TRocMediaFormats=class(TList)
  private
    function getFormats(const index: Integer): TRocMediaFormat;
  public
    procedure Add(const frm:TRocMediaFormat);overload;
    procedure Clear;override;
    property  Formats[const index:Integer]:TRocMediaFormat read getFormats;
  End;

  //媒体设备
  TRocMediaDevice=class
  private
    FfriendlyName:String;
    FmonikerName:String;
    FFormats:TRocMediaFormats;
    procedure DsGetOptionDevice(moniker:IMoniker);
  public
    constructor Create(const friendlyName:String;const monikerName:String;const moniker:IMoniker);
    destructor  destroy;override;
  published
    property Formats:TRocMediaFormats read FFormats;
    property FriendlyName:String read FfriendlyName;
    property MonikerName:String read FmonikerName; 
  End;
 
  //设备媒体管理类
  TRocMediaDeviceManager=class(TList)
  private
    function getDevices(const Index: Integer): TRocMediaDevice;
  protected
     procedure DsGetInputDevices(guidValue:TGUID);
  public
     procedure Clear;override;
     property  Devices[const Index:Integer]:TRocMediaDevice read getDevices;
  End;

  //视频媒体管理类
  TRocVideoDeviceManager=class(TRocMediaDeviceManager)
  public
    constructor Create;
  End;
  
  //音频频媒体管理类
  TRocAudioDeviceManager=class(TRocMediaDeviceManager)
  public
    constructor Create;
  End;



implementation



{ TVideoFormat }

constructor TVideoFormat.Create(const w, h, atpf, b: Integer);
begin
  setFormat(w,h,atpf,b);
end;

procedure TVideoFormat.setFormat(const w, h, atpf, b: Integer);
begin
   FWidth  := w;
   FHeight := h;
   FAvgTimePerFrame := atpf;
   FBitRate := b;
end;

{ TAudioFormat }

constructor TAudioFormat.Create(const fmt: TWAVEFORMATEX);
begin
  setFormat(fmt);
end;

procedure TAudioFormat.setFormat(const fmt: TWAVEFORMATEX);
begin
  FAudioFormat := fmt;
end;

{ TRocMediaFormats }

procedure TRocMediaFormats.Add(const frm: TRocMediaFormat);
begin
  inherited Add(frm);
end;

procedure TRocMediaFormats.Clear;
var
  i:Integer;
begin
  for i:=Count-1 downto 0 do
  Begin
    Formats[i].Free;
    inherited Delete(i);
  End;
  inherited;
end;

function TRocMediaFormats.getFormats(
  const index: Integer): TRocMediaFormat;
begin
  result:= TRocMediaFormat(inherited Items[index]);
end;

{ TRocMediaDevice }

constructor TRocMediaDevice.Create(const friendlyName:String;const monikerName:String;const moniker:IMoniker);
begin
  FfriendlyName := friendlyName;
  FmonikerName  := monikerName;
  
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红锅巴

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值