www.pudn.com > AVideoCapture.rar > MainUnt.pas


unit MainUnt; 
 
interface 
 
uses 
  Windows, Messages, Sysutils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, ExtCtrls, StdCtrls, OleCtrls, SFLIVESERVERLib_TLB, Menus, 
  CoolTrayIcon, RainButton, RainComboBox, RainCheckBox, RainForm, DB, 
  ADODB, ScktComp, ComCtrls, ImgList; 
 
type 
  TMain = class(TForm) 
    GroupBox1: TGroupBox; 
    RunModel: TRadioGroup; 
    GroupBox3: TGroupBox; 
    Label11: TLabel; 
    Label10: TLabel; 
    TrayIcon: TCoolTrayIcon; 
    GroupBox2: TGroupBox; 
    Label8: TLabel; 
    Label9: TLabel; 
    Label19: TLabel; 
    Label20: TLabel; 
    RainForm1: TRainForm; 
    Teacherch: TRainCheckBox; 
    BeginBtn: TRainButton; 
    StopBtn: TRainButton; 
    TVFormat: TRainComboBox; 
    VideoBox: TRainComboBox; 
    VideoSource: TRainComboBox; 
    OtherCBox: TRainComboBox; 
    OVideoSource: TRainComboBox; 
    OVFormat: TRainComboBox; 
    Otherch: TRainCheckBox; 
    SaveDialog: TSaveDialog; 
    ClientSocket: TClientSocket; 
    Bevel2: TBevel; 
    QueryTimer: TTimer; 
    ImageList: TImageList; 
    TrayIconPopupMenu: TPopupMenu; 
    TrayIconPopupMenuSet: TMenuItem; 
    TrayIconPopupMenuHide: TMenuItem; 
    TrayIconPopupMenuShow: TMenuItem; 
    TrayIconPopupMenuExit: TMenuItem; 
    LogoTimer: TTimer; 
    AutoCBox: TRainCheckBox; 
    ActiveTimer: TTimer; 
    UserPowerTimer: TTimer; 
    SaveBtn: TRainButton; 
    ServerBtn: TRainButton; 
    DesktopTimer: TTimer; 
    GroupBox4: TGroupBox; 
    Label23: TLabel; 
    ScreenModeBox: TRainComboBox; 
    Label6: TLabel; 
    ScreenQualityEdit: TEdit; 
    GroupBox5: TGroupBox; 
    Label4: TLabel; 
    VideoBps: TEdit; 
    Label5: TLabel; 
    AudioBps: TRainComboBox; 
    Label7: TLabel; 
    Label17: TLabel; 
    FpsEdit: TEdit; 
    Label18: TLabel; 
    Label1: TLabel; 
    GroupBox6: TGroupBox; 
    Label13: TLabel; 
    TSWWidth: TEdit; 
    Label14: TLabel; 
    TSWHeigth: TEdit; 
    Label15: TLabel; 
    CaptionEdit: TEdit; 
    Label21: TLabel; 
    RECCast: TRainCheckBox; 
    SaveNameEdit: TEdit; 
    Bevel5: TBevel; 
    procedure VideoBpsKeyPress(Sender: TObject; var Key: Char); 
    procedure CastAddrKeyPress(Sender: TObject; var Key: Char); 
    procedure FormCreate(Sender: TObject); 
    procedure ClientSocketConnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure ClientSocketDisconnect(Sender: TObject; 
      Socket: TCustomWinSocket); 
    procedure ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; 
      ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
    procedure ClientSocketRead(Sender: TObject; Socket: TCustomWinSocket); 
    procedure QueryTimerTimer(Sender: TObject); 
    procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
    procedure TrayIconPopupMenuClick(Sender: TObject); 
    procedure TrayIconClick(Sender: TObject); 
    procedure ComBoxDropDown(Sender: TObject); 
    procedure LogoTimerTimer(Sender: TObject); 
    procedure ActiveTimerTimer(Sender: TObject); 
    procedure UserPowerTimerTimer(Sender: TObject); 
    procedure StopCastTimerTimer(Sender: TObject); 
    procedure StopSaveFileTimerTimer(Sender: TObject); 
    procedure TextMoveTimerTimer(Sender: TObject); 
    procedure RainBtnClick(Sender: TObject); 
    procedure DesktopTimerTimer(Sender: TObject); 
    procedure CheckBoxClick(Sender: TObject); 
  private 
    { Private declarations } 
  public 
    { Public declarations } 
    procedure MyStopDesktopCast(); 
    procedure MyBeginDesktopCast(); 
  end; 
 
var 
  Main: TMain; 
implementation 
 
uses UserPowerUnt, LiveSrvCastUnt, AVideoStatusUnt, AVideoFunctionUnt, LogonUnt, OptionsSetUnt, CastOprUnt, SockUnt; 
 
{$R *.dfm} 
 
procedure PowerOff(Force: Boolean = False); 
var 
  hToken: THandle; 
  tkp: TTokenPrivileges; 
  tkpo: TTokenPrivileges; 
  zero: DWORD; 
begin 
  if Win32Platform = VER_PLATFORM_WIN32_NT then {// we've got to do a whole buch of things}  begin 
    zero := 0; 
    if not OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) then begin 
      MessageBox(0, 'PowerOff Error', 'OpenProcessToken() Failed', MB_OK); 
      Exit; 
    end; // if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken) 
 
    // SE_SHUTDOWN_NAME 
    if not LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[0].Luid) then begin 
      MessageBox(0, 'PowerOff Error', 'LookupPrivilegeValue() Failed', MB_OK); 
      Exit; 
    end; // if not LookupPrivilegeValue( nil, 'SeShutdownPrivilege' , tkp.Privileges[0].Luid ) 
    tkp.PrivilegeCount := 1; 
    tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED; 
    AdjustTokenPrivileges(hToken, False, tkp, SizeOf(TTokenPrivileges), tkpo, zero); 
    if Boolean(GetLastError()) then begin 
      MessageBox(0, 'PowerOff Error', 'AdjustTokenPrivileges() Failed', MB_OK); 
      Exit; 
    end // if Boolean( GetLastError() ) 
    else if Force then 
      ExitWindowsEx(EWX_POWEROFF, 1) 
    else ExitWindowsEx(EWX_REBOOT, 1); 
  end // if OSVersion = 'Windows NT' 
  else // just shut the machine down 
    if Force then ExitWindowsEx(EWX_POWEROFF, 1) 
    else ExitWindowsEx(EWX_REBOOT, 1); 
end; 
 
procedure TMain.RainBtnClick(Sender: TObject); 
begin 
  case TRainButton(Sender).tag of 
    1: begin //文件录制 
        SaveDialog.filename := SaveNameEdit.Text; 
        if SaveDialog.Execute then 
          if SaveDialog.filename = SaveNameEdit.Text then 
            Exit 
          else 
            SaveNameEdit.Text := SaveDialog.filename; 
        LiveSrvCast.LiveSrv.SaveFileName[0] := SaveNameEdit.Text; 
      end; 
    2: MyBeginDesktopCast; //开始广播 
    3: MyStopDesktopCast; //停止广播 
    4: MyLocSerOpr_Allow; //服务器托管 
  end; 
end; 
 
procedure TMain.VideoBpsKeyPress(Sender: TObject; var Key: Char); 
begin 
  if not (Key in ['0'..'9', #8]) then Key := #0; 
end; 
 
procedure TMain.CastAddrKeyPress(Sender: TObject; var Key: Char); 
begin 
  if not (Key in ['0'..'9', #8, #46]) then Key := #0; 
end; 
 
procedure TMain.FormCreate(Sender: TObject); 
var 
  i: Integer; 
begin 
  MemFile := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, SizeOf(TGoData), 'AVideoCapture'); 
  Godata := MapViewOfFile(MemFile, FILE_MAP_WRITE, 0, 0, 0); 
  if MemFile = 0 then //只运行一个实例 
    FillChar(Godata^, SizeOf(TGoData), 0); 
  Godata^.TargetWnd := Handle; 
  //只运行一个实例 
  Desktop := False; //默认操作权交由远程服务器 
  TrayIconHint(2); 
  //Sleep(sleeptimer); 
  TrayIconPopupMenuSet.Enabled := False; 
  for i := 0 to 2 do 
    FilesList[i] := Tstringlist.Create; 
  AppliInitialize; //程序初始化 
  Share_Path := Tstringlist.Create; 
  Left := (Screen.Width - Width) div 2; 
  TrayIcon.MinimizeToTray := True; //最小化及关闭图标时进入系统托盘 
  ActiveTimer.Enabled := True; 
end; 
 
procedure TMain.MyStopDesktopCast(); 
begin 
  myStopCast('0'); 
  LiveSrvCast.LiveSrv.StopPreview(1); 
  BeginBtn.Enabled := True; 
  ServerBtn.Enabled := True; 
  StopBtn.Enabled := False; 
  RECCast.Checked := False; 
  LiveSrvCast.close; 
  DesktopTimer.Enabled := True; 
  sendcommand(SocketClient, desktopstatus, ''); 
end; 
 
procedure TMain.MyBeginDesktopCast(); 
begin 
  if (VideoBox.ItemIndex >= 0) and (VideoSource.ItemIndex >= 0) then 
    LiveSrvCast.MainVideoMItem.Enabled := True; 
  if (OtherCBox.ItemIndex >= 0) and (OVideoSource.ItemIndex >= 0) then 
    LiveSrvCast.SubVideoMItem.Enabled := True; 
  try 
    with LiveSrvCast.LiveSrv do begin 
      if (MultiAddr[0] <> '') and (MultiPort[0] < 0) then 
        RunMode[0] := RunModel.ItemIndex 
      else begin 
        RunModel.ItemIndex := 0; 
        RunMode[0] := 0; 
      end; 
      VideoBitRate[0] := StrToInt(VideoBps.Text); 
      AudioBitRate[0] := StrToInt(AudioBps.Text); 
      CapVideoDevice[0] := 100; 
      SetCapScreenMode(0, ScreenModeBox.ItemIndex, StrToInt(ScreenQualityEdit.Text)); 
      SetCapScreenSetting(0, 0, StrToInt(FpsEdit.Text), 0, 0, 0); 
      CapAudioDevice[0] := 0; 
      sendvideo[0] := True; 
      sendaudio[0] := True; 
      showaudio[0] := True; 
      if BeginCast(0) then begin 
        BeginBtn.Enabled := False; 
        ServerBtn.Enabled := False; 
        StopBtn.Enabled := True; 
        MySetForm(0, LiveSrvCast.LiveSrv, TVFormat.Text, 25); 
        //if RECCast.Checked then 
        //SaveFileName[0] := SaveNameEdit.Text; 
        close; 
        Logon.CaptionPa.Caption := CaptionEdit.Text; 
        Logon.Show; 
        LogoTimer.Enabled := True; 
        if Teacherch.Checked then begin 
          CastFileName[1] := ''; //设置广播文件路径 不广播文件 为空运行之前 
          CapVideoDevice[1] := VideoBox.ItemIndex; // 指定视频卡 - 1 不捕捉,100桌面 运行之前 
          CapAudioDevice[1] := -1; // 指定视频卡 - 1 ~ 10 - 1 不捕捉 运行之前 
          ShowVideo[1] := True; //显示画面 运行之前 
          VideoSource[1] := Main.VideoSource.ItemIndex; //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间 
          SaveFileName[1] := ''; // ExtractFileDir(Application.ExeName) + '\aas.asf'; //长度255 为0不录像,反之要录像 任何时间 
          RunMode[1] := 0; //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前 
          LiveSrvCast.Width := StrToInt(TSWWidth.Text) + 8; 
          LiveSrvCast.Height := StrToInt(TSWHeigth.Text) + 8; 
          MySetForm(1, LiveSrvCast.LiveSrv, TVFormat.Text, 25); 
          SetWndSize(1, 0, 0, Width, Height); 
          if StartPreview(1, -1) then 
            teachvideo := True; 
        end 
        else 
          LiveSrvCast.Show; 
      end; 
      DesktopTimer.Enabled := False; 
      sendcommand(SocketClient, desktopstatus, IntToStr(RunMode[0])); 
    end; 
  except 
    Application.MessageBox('请设置好相关参数', '参数不完全', mb_okcancel); 
    Exit; 
  end; 
end; 
 
procedure TMain.ClientSocketConnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  TrayIconHint(0); 
  QueryTimer.Enabled := False; 
  sendcommand(SocketClient, Enter, IntToStr(cardcount)); 
  TrayIconHint(7); 
end; 
 
procedure TMain.ClientSocketDisconnect(Sender: TObject; 
  Socket: TCustomWinSocket); 
var 
  i: Integer; 
begin 
  TrayIconHint(6); 
  for i := 0 to 2 do 
    //if LiveSrvCast.LiveSrv.IsChannelRunning(i) then //查询频道是否正在运行中任何时间有效 
    myStopCast(IntToStr(i)); 
  QueryTimer.Enabled := True; 
end; 
 
procedure TMain.ClientSocketError(Sender: TObject; Socket: TCustomWinSocket; 
  ErrorEvent: TErrorEvent; var ErrorCode: Integer); 
var 
  i: Integer; 
begin 
  TrayIconHint(6); 
  for i := 0 to 2 do 
    //if LiveSrvCast.LiveSrv.IsChannelRunning(i) then //查询频道是否正在运行中任何时间有效 
    myStopCast(IntToStr(i)); //停止广播 
  ClientSocket.Active := False; 
  QueryTimer.Enabled := True; 
  ErrorCode := 0; 
end; 
 
procedure TMain.ClientSocketRead(Sender: TObject; 
  Socket: TCustomWinSocket); 
begin 
  Command_Deal(ClientSocket.Socket.ReceiveText); 
end; 
 
procedure TMain.QueryTimerTimer(Sender: TObject); 
begin 
  try 
    ClientSocket.open; {打开Internet WinSocket控件ClientSocket使用Socket技术传送数据的客户端} 
  except 
    ClientSocket.close; 
    TrayIconHint(6); 
  end; 
end; 
 
procedure TMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
  CanClose := False; 
  TrayIcon.Hidemainform; //进入系统托盘 
end; 
 
procedure TMain.TrayIconPopupMenuClick(Sender: TObject); 
begin 
  try 
    case TMenuItem(Sender).tag of 
      4: TrayIcon.Hidemainform; //隐藏程序界面 
      1: ShwMainForm; //显示程序界面 
      2: appliexit; //退出应用程序 
      3: OptionsSet.ShowModal; //设置 
    end; 
  except 
  end; 
end; 
 
procedure TMain.TrayIconClick(Sender: TObject); 
begin 
  if Visible = True then 
    TrayIcon.Hidemainform //隐藏程序界面 
  else ShwMainForm; //显示程序界面 
end; 
 
procedure TMain.ComBoxDropDown(Sender: TObject); 
var 
  i: Integer; 
begin 
  case TRainComboBox(Sender).tag of 
    1, 4: begin //增加视频卡 
        TRainComboBox(Sender).Items.Clear; 
        for i := 0 to 2 do 
          if videoCard[i].Name <> '' then 
            TRainComboBox(Sender).Items.Add(videoCard[i].Name); 
      end; 
    2: begin //增加视频源——主教 
        TRainComboBox(Sender).Items.Clear; 
        for i := 0 to 9 do 
          if (VideoBox.ItemIndex >= 0) and (videoCard[VideoBox.ItemIndex].Source[i] <> '') then 
            TRainComboBox(Sender).Items.Add(videoCard[VideoBox.ItemIndex].Source[i]); 
      end; 
    5: begin //增加视频源——辅助 
        TRainComboBox(Sender).Items.Clear; 
        for i := 0 to 9 do 
          if (OtherCBox.ItemIndex >= 0) and (videoCard[OtherCBox.ItemIndex].Source[i] <> '') then 
            TRainComboBox(Sender).Items.Add(videoCard[OtherCBox.ItemIndex].Source[i]); 
      end; 
    8: begin //增加本地IP 
        TRainComboBox(Sender).Items.Clear; 
        for i := 0 to 2 do 
          if localIPSrc[i].Addr <> '' then 
            TRainComboBox(Sender).Items.Add(localIPSrc[i].Addr); 
      end; 
  end; 
end; 
 
procedure TMain.LogoTimerTimer(Sender: TObject); 
begin 
  LogoTimer.Enabled := False; 
  Logon.close; 
  if teachvideo = True then begin 
    LiveSrvCast.Top := 0; 
    LiveSrvCast.Left := Screen.Width - LiveSrvCast.Width; 
    LiveSrvCast.Show; 
  end; 
end; 
 
procedure TMain.ActiveTimerTimer(Sender: TObject); 
begin 
  ActiveTimer.Enabled := False; 
  try 
    GetAVideoCardsource(LiveSrvCast.LiveSrv); 
    TrayIconHint(1); //获取音视频卡及源信息 
  except 
    Main.TrayIcon.Hidemainform; 
    Main.ActiveTimer.Enabled := True; 
    TrayIconHint(15); 
    Exit; 
  end; 
  try 
    GetLocalIP; 
    TrayIconHint(5); //获取本地IP 
    TrayIcon.Hidemainform; 
  except 
    Main.TrayIcon.Hidemainform; 
    Main.ActiveTimer.Enabled := True; 
    TrayIconHint(16); 
    Exit; 
  end; 
  try 
    ClientSocket.open; //打开Socket,连接服务器 
  except 
    ClientSocket.close; 
    QueryTimer.Enabled := True; 
    TrayIconHint(6); 
  end; 
end; 
 
procedure TMain.UserPowerTimerTimer(Sender: TObject); 
begin 
  UserPowerTimerevent(); 
end; 
 
procedure TMain.StopSaveFileTimerTimer(Sender: TObject); 
begin 
  MyStopSaveFile(IntToStr(TTimer(Sender).tag - 10)); 
end; 
 
procedure TMain.StopCastTimerTimer(Sender: TObject); 
begin 
  myStopCast(IntToStr(TTimer(Sender).tag - 20)); 
end; 
 
procedure TMain.TextMoveTimerTimer(Sender: TObject); 
begin 
  MyTextMove(IntToStr(TTimer(Sender).tag - 30)); 
end; 
 
procedure TMain.DesktopTimerTimer(Sender: TObject); 
begin 
  MyLocSerOpr_Allow; 
end; 
 
procedure TMain.CheckBoxClick(Sender: TObject); 
begin 
  case TRainCheckBox(Sender).tag of 
    1: begin //自动调整位置 
        if AutoCBox.Checked then begin 
          TSWWidth.Enabled := True; 
          TSWHeigth.Enabled := True; 
        end 
        else begin 
          TSWWidth.Enabled := False; 
          TSWHeigth.Enabled := False; 
        end; 
      end; 
    2: begin //录制文件 
        if RECCast.Checked then begin 
          SaveBtn.Enabled := True; 
          SaveNameEdit.Text := ExtractFileDir(Application.ExeName) + '\SaveFiles\' + DateToStr(Date) + '--' + FormatDateTime('hh-mm-ss', Now) + '.asf'; 
        end 
        else begin 
          SaveBtn.Enabled := False; 
          SaveNameEdit.Text := ''; 
        end; 
        LiveSrvCast.LiveSrv.SaveFileName[0] := SaveNameEdit.Text; 
      end; 
    3: begin //主教视频 
        if Teacherch.Checked then begin 
          VideoBox.Enabled := True; 
          VideoSource.Enabled := True; 
          TVFormat.Enabled := True; 
        end 
        else begin 
          LiveSrvCast.LiveSrv.CapVideoDevice[1] := -1; 
          VideoBox.Enabled := False; 
          VideoSource.Enabled := False; 
          TVFormat.Enabled := False; 
        end; 
      end; 
    4: begin //附加视频 
        if Otherch.Checked then begin 
          OtherCBox.Enabled := True; 
          OVideoSource.Enabled := True; 
          OVFormat.Enabled := True; 
        end 
        else begin 
          LiveSrvCast.LiveSrv.CapVideoDevice[2] := -1; 
          OtherCBox.Enabled := False; 
          OVideoSource.Enabled := False; 
          OVFormat.Enabled := False; 
        end; 
      end; 
  end; 
end; 
 
end.