目录
简述:
delphi7 下进行USB摄像头开发网上的办法一般两种1。基于AVICAP32的windowsAPI 2.基于DSPack 控件。本文将介绍利用FFMPEG+SDL2实现USB摄像头的播放及拍照。
实现效果图如下
准备工作
注:以下所需资源可以直接从我的网盘下载。
链接:https://pan.baidu.com/s/1IoJvgI8Y5_3DqhCGTvs4Cw
提取码:pdga
- FFMPEG Delphi7 的DLL封装及头文件。这里利用了FFVCL对FFMPEG的封装。可以在 其官网下载FFVCL – Delphi FFmpeg VCL Components(Video Encoder and Video Player)。可以从我的网盘下载。
- SDL2 Delphi7的DLL封装及头文件。可以在官网Simple DirectMedia Layer - Homepage下载。也可以从我的网盘下载。
- 因为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;