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;}