www.pudn.com > AVideoCapture.rar > AVideoStatusUnt.pas
unit AVideoStatusUnt;
interface
uses
MainUnt, Windows, Controls, Classes, Inifiles, SockUnt;
type
T_SockData = record //自定义的发送和接收类型
GetData: string; //收到的数据
PutData: string; //要发送的数据
PutPointer: Integer; //发送数据的指针
end;
type
TGoData = record
TargetWnd: hwnd;
ghHook: HHook;
end;
PGoData = ^TGoData;
TAudeoCard = record //音频卡
ID: string;
Name: string;
Source: array[0..9] of string; //音频源
AudeoSrcList: string; //音源列表 对应数据库格式 Stereo Mix/$/麦克/$/CD/$/Aux/Phone/$/线路/$/Wave/$/
end;
TVideoCard = record //视频卡
ID: string;
Name: string;
Source: array[0..9] of string; //视频源
VideoSrcList: string; //视频源列表 对应数据库格式 Video SVideo/$/Video Composite/$/Video Composite/$/
end;
TLocalIPSrc = record //本地IP
Addr: string;
Port: string;
end;
type
TMyRes_Data = record
ResSrvName: string; //资源服务器名称
SrvIndex: Integer;
ResSrv_ID: int64; //当前资源服务器ID
ResParentDir_Id: int64; //当前资源路径ID
ResFullPath: string; //当前资源全路径
Share_Path: string; //共享路径名
Res_Type: Byte; //资源类型
User_Name: WideString; //FTP用户名
User_Passwd: WideString; //FTP用户密码
end;
const
BuffSize = 8192; //缓冲大小
{*** 格式定义 ***}
SubItemOpr = '|';
ChNoOpr = ':>';
SubValueOpr = '->';
{*** 操作数据库 ***}
SQLEnd = '/S/';
FieldEnd = '|!'; //分隔字符串
RecordEnd = '/D/'; //分隔记录
DBSrcEnd = '/$/';
OperParEnd = '/C/';
AddRec = '1'; //添加新记录
Select_EditRec = '0'; //查询或修改记录(含有数据,则修改)
DeleteRec = '-1'; //删除记录
{接口格式:通讯协议TCP
采集端初始设置:
本地IP地址:192.168.0.2
端口:8092
服务器IP地址:192.168.0.1
端口:9908}
{命令格式:命令前缀 命令 命令结束 参数 参数结束}
Operate_Data = 'Operate_Data-'; //操作数据库
SocketClient = 'AVideoCapture-'; //命令前缀:区别 采集端 - > 服务器 服务器 - > 采集端
SocketServer = 'SRV-'; //命令:Cmd
OverStr = '/*/'; //命令结束//参数:Par 频道:数值 ->转换 |多项分隔
DataEnd = 'DataEnd' + #13; //参数结束
Back = 'Back_';
Status = 'Status' + OverStr; //频道运行状态
PowerOff = 'PowerOff' + OverStr; //关闭采集端 无参数//** PowerOff/*/DataEnd#13
Select_LiveChannels = 'Select_LiveChannels' + OverStr; //直播服务器采集卡/通道明细表
Opr_LiveChannels = 'Opr_LiveChannels' + OverStr; //操作修改采集卡/通道明细表 增加删除修改
Select_LiveServer = 'Select_LiveServer' + OverStr; //直播服务器属性表
Select_ResServer = 'Select_ResServer' + OverStr; //资源服务器属性表
Init_Set = 'Init_Set' + OverStr;
{发送格式:SendText(Sender + Cmd + par + DataEnd) **传递SendCommand(Cmd,par)}
{如:AVideoCapture-AV_CardSource/*//A/0:>C-MediaWave->,WaveMax,WaveMic,1:>AudeoFt->ABSDeo,|/V/0:>ConexantVideo->VideoSVideo,VideoComposite,|DataEnd#13
则:Sendcommand(AV_CardSource,AudeoSendStr+VideoSendStr)}
//Sender:前缀 -> AVideoCapture-
//**传递Cmd:命令+OverStr -> AV_CardSource/*/
//**传递Par:方式+参数 -> /A/0:>C-MediaWave->,WaveMax,WaveMic,1:>AudeoFt->ABSDeo,|/V/0:>ConexantVideo->VideoSVideo,VideoComposite,|
//DataEnd:参数结束 -> DataEnd#13
{AV_cardsource = 'AV_CardSource' + OverStr; //Cmd 所捕获的VA卡及其源
//**AVideoCapture-AV_CardSource/*//A/0:>C-MediaWave->,WaveMax,WaveMic,1:>AudeoFt->ABSDeo,|/V/0:>ConexantVideo->VideoSVideo,VideoComposite,|DataEnd#13
Wait = 'Wait' + OverStr; //返回停止直播等待状态 当有文件录制时,录制文件已停止,在处理录制文件时要求服务器等待的指令
//** AVideoCapture-Wait/*/2DataEnd#13
LiveSrv_ID = 'LiveSrv_ID' + OverStr; //取采集端在数据库资源中的ID号
//** AVideoCapture-LiveSrv_ID/*/DataEnd#13}
{*** 网络指令 采集端->服务器 ***}
Enter = 'Enter' + OverStr; //Cmd 直播站登录 如ClientSocket断线,则用来反复查询服务器是否在线//** AVideoCapture-Enter/*/5DataEnd#13 5为视频卡数
LocOpr_allow = 'LocOpr_Allow' + OverStr; //Cmd 本地交操作权给服务器//** AVideoCapture-LocOpr_Allow/*/DataEnd#13
locopr_query = 'LocOpr_Query' + OverStr; //Cmd 本地要求操作权//** AVideoCapture-LocOpr_Query/*/DataEnd#13
{*** 网络指令 服务器->采集端 ***}
Enter_Allow = 'Enter_Allow' + OverStr; //Cmd 登录确认 当客户端断线时,反复发送Enter来询问是否在线//** SRV-Enter_Allow/*/5DataEnd#13 5为采集端ID
SerOpr_Allow = 'SerOpr_Allow' + OverStr; //Cmd 服务器交操作权给本地 无参数//** SRV-SerOpr_Allow/*/DataEnd#13
SerOpr_Query = 'SerOpr_Query' + OverStr; //Cmd 服务器要求操作权 无参数//** SRV-SerOpr_Query/*/DataEnd#13
Reset = 'ReSet' + OverStr; //重启工采集端计算机//** SRV-Reset/*/DataEnd#13
ShutDown = 'ShutDown' + OverStr; //关闭工采集端计算机//** SRV-ShutDown/*/DataEnd#13
{*** 全部一起设置 ***}
Set_Options = 'Set_Options' + OverStr; //设置运行参数//** SRV-Set_Options/*/0:>MultiAddr->192.168.1.198|SetWndSizel->X,Y,Width,Heigh,|DataEnd#13
BeginCast = 'BeginTask' + OverStr; //开始现场直播 如果频道没有创建,则自动按已有设置创建频道并开始直播 任何时间//** SRV-BeginCast/*/0DataEnd#13
BeginFileCast = 'BeginFileTast' + OverStr; //开始文件直播
StopCast = 'StopTask' + OverStr; //停止直播不删除频道//** SRV-StopCast/*/0DataEnd#13
Query_Desktop = 'Query_Desktop' + OverStr; //查询桌面状态
Desktop_Quit = 'Desktop_Quit' + OverStr; //退出桌面直播
Desktop_FileSave = 'Desktop_FileSave' + OverStr; //已由本机启动录制文件,不接受服务器远程录制
desktopstatus = 'Desktop' + OverStr; //处于桌面捕捉状态//** SRV-Desktop/*/DataEnd#13
Query_ChannelStatus = 'Query_ChannelStatus' + OverStr; //查询频道运行状态 任何时间有效//** SRV-Query_ChannelStatus/*/1DataEnd#13
{*** 运行之前 ***}
TCPListenPort = 'TCPListenPort' + OverStr; //系统接入监听端口 - 1(默认)不使用TCP监听模式 任何 时间//** SRV-TCPListenPor/*/9908DataEnd#13 //特殊,针对所有频道
CapVideoDevice = 'VideoCap' + OverStr; // 是否采集视频(采集=1,不采集=0)指定视频卡 - 1 不捕捉,100桌面 运行之前//** SRV-CapVideoDevice/*/0:>0DataEnd#13
CapAudioDevice = 'AudioCap' + OverStr; //指定视频卡 - 1 ~ 10 - 1 不捕捉 运行之前//** SRV- CapAudioDevice/*/0:>0DataEnd#13
{*** Addr,IP ***}
MultiAddr = 'MultiAddr' + OverStr; //组播地址 运行之前//** SRV-MultiAddr/*/0:>224.1.1.1DataEnd#13
MultiPort = 'MultiPort' + OverStr; //组播端口 运行之前//** SRV-MultiPort/*/0:>8808DataEnd#13
SendIP = 'SendIP' + OverStr; //发送数据用的IP网卡 运行之前//** SRV-SendIP/*/192.168.1.198DataEnd#13
TcpSendPort = 'TcpSendPort' + OverStr; //远程接入模式时的发送数据端口 运行之前//** SRV- TcpSendPort /*/0:>8081 DataEnd#13
RunMode = 'CastMode' + OverStr; //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前//** SRV- RunMode /*/0:>2DataEnd#13
TaskTime = 'TaskTime' + OverStr; //播放时间
VideoBitRate = 'V_ml' + OverStr; //视频的压缩码流 1 ~ 6000(kbps)运行之前//** SRV- VideoBitRate /*/0:>1000DataEnd#13
AudioBitRate = 'A_ml' + OverStr; //音频的压缩码流 8, 16, 24, ...144(kbps)运行之前//** SRV- AudioBitRate /*/0:>32DataEnd#13
IsStereoAudio = 'IsStereo' + OverStr; //用立体声压缩音频 运行之前//** SRV- IsStereoAudio /*/0:>-1DataEnd#13
ShowVideo = 'ShowVideo' + OverStr; //播放画面 运行之前//** SRV- ShowVideo /*/0:>-1DataEnd#13
showaudio = 'ShowAudio' + OverStr; //播放声音 运行之前//** SRV- ShowAudio /*/0:>-1DataEnd#13
{*** 运行时 ***}
CheckTVSignal = 'CheckTVSignal' + OverStr; //检查指定电视台是否有信号//** SRV- CheckTVSignal /*/0:>1DataEnd#13//
{ChooseVideoFormat = 'ChooseVideoFormat' + OverStr; //选择已选视频捕捉设备的捕捉格式 返回2时老式接口//** SRV- ChooseVideoFormat /*/DataEnd#13}
SetVideoFormat = 'V_format_frames' + OverStr; //设置已选视频设备的捕捉格式//** SRV- SetVideoFormat /*/0:>11,12,13,DataEnd#13 11 Width 12 Height 13 nFrameRate
{*** 任何时候 ***}
VideoStandard = 'Standard_NO' + OverStr; //视频制式 任何时间//** SRV- VideoStandard /*/0:>0DataEnd#13
VideoSource = 'VideoSource' + OverStr; //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间//** SRV- VideoSource /*/0:>0DataEnd#13
AudioSource = 'AudioSource' + OverStr; //音频来源 任何时间//** SRV- AudioSource /*/0:>0DataEnd#13
sendvideo = 'SendVideo' + OverStr; //发送视频 任何时间//** SRV- SendVideo /*/0:>-1DataEnd#13
sendaudio = 'SendAudio' + OverStr; //发送音频 任何时间//** SRV- SendAudio /*/0:>-1DataEnd#13 -1 True 发送
ChannelDescribe = 'ChannelDescribe' + OverStr; //直播描述信息 长度0~100 任何时间//** SRV- ChannelDescribe /*/0:>DataEnd#13
ChooseVideoFormat = 'ChooseVideoFormat' + OverStr;
{*** 文件 ***}
CastFileName = 'FileList' + OverStr; //设置广播文件路径 不广播文件 为空运行之前 文件列表//** SRV- CastFileName /*/0:>\\192.168.1.112\Mediaroot\123.asf|\\192.168.1.112\Mediaroot\233.asfDataEnd#13
SaveFileName = 'Save_File' + OverStr; //长度255 为0不录像,反之要录像 任何时间//** SRV- SaveFileName /*/0:>E:\ABS\ABS.asfDataEnd#13
RecFileName = 'RecFileName' + OverStr; //录制文件全路径
FileSave = 'FileSave' + OverStr; //文件录制完成
RecTime = 'RecTime' + OverStr; //录制时长(秒)0一直录下去
Replay = 'Replay' + OverStr; //是否循环播放
StopSaveFile = 'Stop_Save' + OverStr; //停止录制文件
{*** 滚动字幕 ***}
TopText = 'TopText' + OverStr; //长度50 设置顶部文字//** SRV- TopText /*/0:> 通知DataEnd#13
BottomText = 'SendMsg' + OverStr; //长度255 设置底部文字 保留 暂没有实现//** SRV- BottomText /*/0:>全体老师开会DataEnd#13
BottomTextMode = 'BottomTextMode' + OverStr; //设置底部文字运动方式 0停放在右下角 1向左移动//** SRV- BottomTextMode /*/0:>0DataEnd#13
TextColor = 'TextColor' + OverStr; //RGB(…) 设置文字颜色 //** SRV- TextColor/*/0:>1250DataEnd#13
TextHeight = 'TextHeight' + OverStr; //l设置字体高度 保留,暂没有实现//** SRV- TextHeight /*/0:>12DataEnd#13
{*** 电视 ***}
TVChannel = 'CH_NO' + OverStr; //电视频道 任何时间//** SRV- TVChannel /*/0:>1DataEnd#13
TVAudioMode = 'TVAudioMode' + OverStr; //电视音频的模式 任何时间//** SRV- TVAudioMode /*/0:>0DataEnd#13
{*** 桌面捕捉 ***}
var
cardcount: Integer; //音视频卡总数
teachvideo: Boolean; //判断主教画面是否显示
Desktop: Boolean; //true时操作状态为本地,false时操作状态为远程服务器
Godata: PGoData;
MemFile: THandle; //此指针及句柄判断只运行一个实例
ReSetSize: Boolean;
ReSizeData: Tpoint;
ReSizeMode, ReSizeMode2: Integer; //调整窗体大小
audeoCard: array[0..2] of TAudeoCard; //音频卡
videoCard: array[0..2] of TVideoCard; //视频卡
localIPSrc: array[0..2] of TLocalIPSrc; //本地IP
appliini: Tinifile; //配置文件,程序目录下"程序名.ini"
iniphysicsname: string; //ini文件名
AVideoCapture_ID: Integer; //采集端ID
Share_Path: Tstringlist; //共享路径
//sleeptimer: Integer; //睡眠时间
FilesList: array[0..2] of Tstringlist; //播放文件列表
FilesId: array[0..2] of Integer; //当前播放ID
If_RePlay: array[0..2] of Boolean; //重复播放
CaptureWidth: array[0..2, 0..2] of Integer; //捕获格式宽、高
TempCaptureWidth: array[0..2] of Integer; //捕获格式宽 参数传递
iSpeed: Integer; //字幕滚动速度
iHeight: Integer; //字幕高度
MsgLength: Integer; //字幕长度
autoclose: Boolean;
implementation
uses CastOprUnt;
end.
{Pos(Substr,S:string): Integer;
返回字符串Substr在字符串S中的起始位置。从1开始,非从0开始算起
Copy(S:string; Index, Count: Integer): string;
返回字符串S从Index开始共Count个字符的串
Delete(S: string; Index, Count:Integer):String;
删除字符串S从Index开始共Count个字符的串}
{//***运行之前
GetVideoSupportSource //得到指定序号视频卡视频源名称,以 '|' 分隔
GetAudioSupportSource //得到指定序号音频卡音频源名称,以 '|' 分隔 Preview时此接口无效
GetLocalIPList //得到本机IP列表,IP间以 '|' 分隔。
CapVideoDevice // 指定视频卡 - 1 不捕捉,100桌面 运行之前
CapAudioDevice //指定视频卡 - 1 ~ 10 - 1 不捕捉 运行之前
//Addr,IP
MultiAddr //组播地址 运行之前
MultiPort //组播端口 运行之前
SendIP //发送数据用的IP网卡 运行之前
TcpSendPort //远程接入模式时的发送数据端口 运行之前
RunMode //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前
CastFileName //设置广播文件路径 不广播文件 为空运行之前
CreateChannel //创建频道但不开始运行 - 1 控件 0 新窗口 运行之前
VideoBitRate //视频的压缩码流 1 ~ 6000(kbps)运行之前
AudioBitRate //音频的压缩码流 8, 16, 24, ...144(kbps)运行之前
IsStereoAudio //用立体声压缩音频 运行之前
ShowVideo //播放画面 运行之前
ShowAudio //播放声音 运行之前
//***运行时
CheckTVSignal //检查指定电视台是否有信号
ChooseVideoFormat //选择已选视频捕捉设备的捕捉格式 返回2时老式接口
SetVideoFormat //设置已选视频设备的捕捉格式
//***任何时候
VideoStandard //视频制式 任何时间
videosource //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间
AudioSource //音频来源 任何时间
SendVideo //发送视频 任何时间
SendAudio //发送音频 任何时间
ChannelDescribe //直播描述信息 长度0~100 任何时间
SaveFileName //长度255 为0不录像,反之要录像 任何时间
TCPListenPort //系统接入监听端口 - 1(默认)不使用TCP监听模式 任何时间
BeginCast //开始直播 如果频道没有创建,则自动按已有设置创建频道并开始直播 任何时间
StartPreview //预览画面 lWndHandle预览画面窗口句柄, - 1 控件 0 弹出新窗口
DeleteChannel //删除频道 包括正在运行的频道
StopCast //停止直播不删除频道
StopPreview //停止预览
GetVideoFormate //得到视频格式
SetWndSize //设置显示窗口的位置和大小 lX横坐标,lY纵坐标,lWidth宽度,lHeight高度
GetWndSize //得到显示窗口的大小 * plX横坐标, * plY纵坐标, * plWidth宽度, * plHeight高度
IsChannelCreated //查询频道是否已经被创建
IsChannelRunning //查询频道是否正在运行中
IsChannelPreviewing //查询频道是否正在预览 广播文件时无效 任何时间
DelUser //删除一个已经接入的用户 lpszUserID用户ID号在用户接入时产生的唯一识别(用户接入事件)
//电视
TVChannel //电视频道 任何时间
TVAudioMode //电视音频的模式 任何时间
//桌面捕捉
SetCapScreenMode //桌面模式lCapScreenMode模式0有损帧1无损分块lCapScreenQuality有损压缩质量50~100
GetCapScreenMode //得到桌面捕捉模式 * plCapScreenMode桌面捕捉压缩模式 * plCapScreenQuality桌面压缩质量
SetCapScreenSetting //桌面捕捉参数 lCapScreenFPS最大帧率hwndCapl CapKeyFrames lCapBitCount, lReserve 须0
GetCapScreenSetting //得到桌面捕捉参数 }
{//现场直播
LiveSrv.CastFileName[0] := ''; //设置广播文件路径 不广播文件 为空运行之前
LiveSrv.CapVideoDevice[0] := 0; // 指定视频卡 - 1 不捕捉,100桌面 运行之前
LiveSrv.CapAudioDevice[0] := 0; // 指定频卡 - 1 ~ 10 - 1 不捕捉 运行之前
LiveSrv.VideoBitRate[0] := 2000; //视频的压缩码流 1 ~ 6000(kbps)运行之前
LiveSrv.AudioBitRate[0] := 24; //音频的压缩码流 8, 16, 24, ...144(kbps)运行之前
LiveSrv.IsStereoAudio[0] := true; //用立体声压缩音频 运行之前
LiveSrv.ShowVideo[0] := true; //显示画面 运行之前
LiveSrv.ShowAudio[0] := true; //播放声音 运行之前
LiveSrv.VideoSource[0] := 0; //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间
LiveSrv.AudioSource[0] := 0; //音频来源 任何时间
//LiveSrv.VideoStandard[0] := 4; //制式 任何时间
LiveSrv.TVChannel[0] := 0; //电视频道 任何时间
LiveSrv.TVAudioMode[0] := 0; //电视音频的模式 任何时间
LiveSrv.SendVideo[0] := true; //发送视频 任何时间
LiveSrv.SendAudio[0] := true; //发送音频 任何时间
LiveSrv.ChannelDescribe[0] := ''; //直播描述信息 长度0~100 任何时间
LiveSrv.SaveFileName[0] := ExtractFileDir(Application.ExeName) + '\aas.asf'; //长度255 为0不录像,反之要录像 任何时间
LiveSrv.SendIP[0] := '192.168.1.198'; //发送数据用的IP网卡 运行之前
LiveSrv.MultiAddr[0] := '224.1.1.4'; //组播地址 运行之前
LiveSrv.MultiPort[0] := 8090; //组播端口 运行之前
LiveSrv.RunMode[0] := 2; //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前
LiveSrv.TCPSendPort[0] := 8091; //远程接入模式时的发送数据端口 运行之前
LiveSrv.TCPListenPort := 8092; //系统接入监听端口 - 1(默认)不使用TCP监听模式 任何时间
//文件直播
LiveSrv.CastFileName[1] := ExtractFileDir(Application.ExeName) + '\test.asf'; //设置广播文件路径 不广播文件 为空运行之前
LiveSrv.ShowVideo[1] := true; //显示画面 运行之前
LiveSrv.ShowAudio[1] := true; //播放声音 运行之前
LiveSrv.SendVideo[1] := true; //发送视频 任何时间
LiveSrv.SendAudio[1] := true; //发送音频 任何时间
LiveSrv.SendIP[1] := '192.168.1.198'; //发送数据用的IP网卡 运行之前
LiveSrv.MultiAddr[1] := '224.1.1.4'; //组播地址 运行之前
LiveSrv.MultiPort[1] := 8090; //组播端口 运行之前
LiveSrv.RunMode[1] := 2; //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前
LiveSrv.TCPSendPort[1] := 8091; //远程接入模式时的发送数据端口 运行之前
LiveSrv.TCPListenPort := 8092; //系统接入监听端口 - 1(默认)不使用TCP监听模式 任何时间
//桌面直播
RunMode[2] := 2;
SendIP[2] := '192.168.1.198';
TCPSendPort[2] := 8091;
TCPListenPort := 8092;
MultiAddr[2] := '224.1.1.4';
MultiPort[2] := 8090;
VideoBitRate[2] := 2000;
CapVideoDevice[2] := 100;
SetCapScreenMode(0, 0, 75);
SetCapScreenSetting(0, 0, 10, 0, 0, 0);
CapAudioDevice[2] := 0;
AudioBitRate[2] := 32;}