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


unit LiveSrvCastUnt; 
 
interface 
 
uses 
  Windows, Messages, Sysutils, Variants, Classes, Graphics, Controls, Forms, 
  Dialogs, OleCtrls, SFLIVESERVERLib_TLB, ExtCtrls, Menus, Inifiles; 
 
type 
  TLiveSrvCast = class(TForm) 
    Panel1: TPanel; 
    LiveSrv: TSFLiveServer; 
    LiveSrvPopMenu: TPopupMenu; 
    MainVideoMItem: TMenuItem; 
    SubVideoMItem: TMenuItem; 
    MainSource1MItem: TMenuItem; 
    MainSource2MItem: TMenuItem; 
    MainSource3MItem: TMenuItem; 
    SubSource1MItem: TMenuItem; 
    SubSource2MItem: TMenuItem; 
    SubSource3MItem: TMenuItem; 
    AudeoMItem: TMenuItem; 
    SubAudeoSource0MItem: TMenuItem; 
    SubAudeoSource1MItem: TMenuItem; 
    SubAudeoSource2MItem: TMenuItem; 
    SubAudeoSource3MItem: TMenuItem; 
    StopCastMItem: TMenuItem; 
    MainSource4MItem: TMenuItem; 
    MainSource5MItem: TMenuItem; 
    SubSource4MItem: TMenuItem; 
    SubSource5MItem: TMenuItem; 
    SubAudeoSource4MItem: TMenuItem; 
    SubAudeoSource5MItem: TMenuItem; 
    SubAudeoSource6MItem: TMenuItem; 
    MainSource6MItem: TMenuItem; 
    MainSource7MItem: TMenuItem; 
    MainSource8MItem: TMenuItem; 
    MainSource9MItem: TMenuItem; 
    MainSource10MItem: TMenuItem; 
    SubSource6MItem: TMenuItem; 
    SubSource7MItem: TMenuItem; 
    SubSource8MItem: TMenuItem; 
    SubSource9MItem: TMenuItem; 
    SubSource10MItem: TMenuItem; 
    SubAudeoSource7MItem: TMenuItem; 
    SubAudeoSource8MItem: TMenuItem; 
    SubAudeoSource9MItem: TMenuItem; 
    procedure FormResize(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    procedure Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, 
      Y: Integer); 
    procedure Panel1MouseDown(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure Panel1MouseUp(Sender: TObject; Button: TMouseButton; 
      Shift: TShiftState; X, Y: Integer); 
    procedure VideoMItemClick(Sender: TObject); 
    procedure AudeoMItemClick(Sender: TObject); 
    procedure LiveSrvCatchFileEnd(ASender: TObject; nChannelNO: Smallint); 
    procedure StopCastMItemClick(Sender: TObject); 
    procedure LiveSrvPopMenuChange(Sender: TObject; Source: TMenuItem; 
      Rebuild: Boolean); 
  private 
    { Private declarations } 
  public 
    procedure AppMessageHandler(var msg: TMsg; 
      var Handled: Boolean); 
    { Public declarations } 
  end; 
 
var 
  LiveSrvCast: TLiveSrvCast; 
  IsFirst: Boolean; 
  ReSetSize: Boolean; 
  ReSizeData: Tpoint; 
  ReSizeMode, ReSizeMode2: Integer; 
  OtherOK: Boolean; 
  BsId: Integer; 
 
implementation 
 
uses MainUnt, LogonUnt, AVideoFunctionUnt, AVideoStatusUnt, CastOprUnt, UserPowerUnt; 
 
{$R *.dfm} 
 
procedure TLiveSrvCast.AppMessageHandler(var msg: TMsg; 
  var Handled: Boolean); 
var 
  X, Y: Integer; 
begin 
  if (msg.hwnd = LiveSrv.Handle) then 
    if msg.message = WM_LBUTTONDOWN then begin 
      ReleaseCapture; 
      SendMessage(Handle, WM_SYSCOMMAND, $F012, 0); 
    end 
    else if msg.message = WM_MouseMove then begin 
      X := msg.pt.X - self.Left; 
      Y := msg.pt.Y - self.Top; 
      if Main.AutoCBox.Checked then 
        if (Y > Round(X * (Height / Width))) and (Y < Height - Round(X * (Height / Width))) 
          or (Y > Round((Width - X) * (Height / Width))) and (Y < Height - Round((Width - X) * (Height / Width))) then {//上下动}  begin 
          if Top = 0 then 
            Top := Screen.Height - self.Height - 25 
          else Top := 0; 
        end 
        else if (X > Round(Y * (Width / Height))) and (X < Width - Round(Y * (Width / Height))) 
          or (X > Round((Height - Y) * (Width / Height))) and (X < Width - Round((Height - Y) * (Width / Height))) then {//左右动}  begin 
          if Left = 0 then 
            Left := Screen.Width - self.Width 
          else Left := 0; 
        end; 
    end; 
  inherited; 
end; 
 
procedure TLiveSrvCast.FormResize(Sender: TObject); 
begin 
  LiveSrv.SetWndSize(1, 0, 0, self.LiveSrv.Width, self.LiveSrv.Height); 
end; 
 
procedure TLiveSrvCast.FormCreate(Sender: TObject); 
begin 
  BsId := GlobalAddAtom('hotkey'); 
  RegisterHotKey(Handle, BsId, 0, 123); 
  ReSetSize := False; 
  IsFirst := True; 
  SetWindowPos(self.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE); 
end; 
 
procedure TLiveSrvCast.Panel1MouseMove(Sender: TObject; Shift: TShiftState; X, 
  Y: Integer); 
begin 
  if (X in [0, 1, 3, 4]) and (Y in [0, 1, 3, 4]) then begin 
    Panel1.Cursor := crSizeNWSE; 
    ReSizeMode := 1; 
  end 
  else if (X in [0, 1, 3, 4]) and (Y > Panel1.Height - 4) then begin 
    ReSizeMode := 2; 
    Panel1.Cursor := crSizeNESW; 
  end 
  else if (X in [0, 1, 3, 4]) and (not (Y > Panel1.Height - 4)) then begin 
    ReSizeMode := 3; 
    Panel1.Cursor := crSizeWE; 
  end 
  else if (X > Panel1.Width - 4) and (Y in [0, 1, 3, 4]) then begin 
    ReSizeMode := 4; 
    Panel1.Cursor := crSizeNESW; 
  end 
  else if (X > Panel1.Width - 4) and (Y > Panel1.Height - 4) then begin 
    ReSizeMode := 5; 
    Panel1.Cursor := crSizeNWSE; 
  end 
  else if (X > Panel1.Width - 4) and (not (Y > Panel1.Height - 4)) then begin 
    ReSizeMode := 6; 
    Panel1.Cursor := crSizeWE; 
  end 
  else if (Y in [0, 1, 3, 4]) and (not (X > Panel1.Width - 4)) then begin 
    ReSizeMode := 7; 
    Panel1.Cursor := crSizeNS 
  end 
  else if (Y > Panel1.Height - 4) and (not (X > Panel1.Width - 4)) then begin 
    ReSizeMode := 8; 
    Panel1.Cursor := crSizeNS; 
  end 
  else Panel1.Cursor := crSizeAll; 
end; 
 
procedure TLiveSrvCast.Panel1MouseDown(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if Panel1.Cursor = crSizeAll then begin 
    ReleaseCapture; 
    SendMessage(Handle, WM_SYSCOMMAND, $F012, 0); 
    ReSetSize := False; 
  end 
  else begin 
    ReSetSize := True; 
    ReSizeMode2 := ReSizeMode; 
    ReSizeData.X := X; 
    ReSizeData.Y := Y; 
  end; 
end; 
 
procedure TLiveSrvCast.Panel1MouseUp(Sender: TObject; Button: TMouseButton; 
  Shift: TShiftState; X, Y: Integer); 
begin 
  if ReSetSize then 
    case ReSizeMode2 of 
      1: begin 
          Width := Width + (0 - X); 
          Left := Left + X; 
          Height := Height + (0 - Y); 
          Top := Top + Y; 
        end; 
      2: begin 
          Width := Width + (0 - X); 
          Left := Left + X; 
          Height := Height + (Y - Panel1.Height); 
        end; 
      3: begin 
          Width := Width + (0 - X); 
          Left := Left + X; 
        end; 
      4: begin 
          Width := Width + (X - Panel1.Width); 
          Height := Height + (0 - Y); 
          Top := Top + Y; 
        end; 
      5: begin 
          Width := Width + (X - Panel1.Width); 
          Height := Height + (Y - Panel1.Height) 
        end; 
      6: Width := Width + (X - Panel1.Width); 
      7: begin 
          Height := Height + (0 - Y); 
          Top := Top + Y; 
        end; 
      8: Height := Height + (Y - Panel1.Height); 
    end; 
end; 
 
procedure TLiveSrvCast.VideoMItemClick(Sender: TObject); 
var 
  MItem: array[0..1] of TMenuItem; 
  i: Integer; 
begin 
  try 
    for i := 0 to 2 do begin 
      MItem[0] := FindComponent('MainSource' + IntToStr(i + 1) + 'MItem') as TMenuItem; 
      if MItem[0] <> nil then 
        MItem[0].Checked := False; 
      MItem[1] := FindComponent('SubSource' + IntToStr(i + 1) + 'MItem') as TMenuItem; 
      if MItem[1] <> nil then 
        MItem[1].Checked := False; 
    end; 
    TMenuItem(Sender).Checked := True; 
    with LiveSrv do begin 
      if IsChannelPreviewing(1) then 
        StopPreview(1); 
      SetWndSize(1, 0, 0, Width, Height); 
      CastFileName[1] := ''; //设置广播文件路径 不广播文件 为空运行之前 
      CapAudioDevice[1] := -1; // 指定音频卡 - 1 ~ 10 - 1 不捕捉 运行之前 
      ShowVideo[1] := True; //显示画面 运行之前 
      SaveFileName[1] := ''; // ExtractFileDir(Application.ExeName) + '\aas.asf'; //长度255 为0不录像,反之要录像 任何时间 
      RunMode[1] := 0; //运行模式 0 只监听 1 只组播 2 组播&监听 运行之前 
      ShowVideo[1] := True; 
      MySetForm(1, LiveSrvCast.LiveSrv, Main.TVFormat.Text, 25); 
      case TMenuItem(Sender).tag of 
        11..20: begin 
            CapVideoDevice[1] := Main.VideoBox.ItemIndex; // 指定视频卡 - 1 不捕捉,100桌面 运行之前 
            Main.VideoSource.ItemIndex := TMenuItem(Sender).tag - 11; 
            VideoSource[1] := Main.VideoSource.ItemIndex; //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间 
          end; 
        21..30: begin 
            CapVideoDevice[1] := Main.OtherCBox.ItemIndex; // 指定视频卡 - 1 不捕捉,100桌面 运行之前 
            Main.OVideoSource.ItemIndex := TMenuItem(Sender).tag - 21; 
            VideoSource[1] := Main.OVideoSource.ItemIndex; //视频来源 - 10 不设置,只查看是否使用老式接口 任何时间 
          end; 
      end; 
      StartPreview(1, -1); 
    end; 
  except 
    Application.MessageBox('请检测视频卡是否支持这些端口.', '设置未成功', mb_okcancel); 
    Exit; 
  end; 
end; 
 
procedure TLiveSrvCast.AudeoMItemClick(Sender: TObject); 
var 
  i: Integer; 
  MItem: TMenuItem; 
begin 
  try 
    LiveSrv.AudioSource[0] := TMenuItem(Sender).tag - 31; 
    for i := 0 to 9 do begin 
      MItem := FindComponent('SubAudeoSource' + IntToStr(i) + 'MItem') as TMenuItem; 
      if MItem <> nil then 
        MItem.Checked := False; 
    end; 
    TMenuItem(Sender).Checked := True 
  except 
    Application.MessageBox('请检测音频卡是否支持这些端口.', '设置未成功', mb_okcancel); 
    Exit; 
  end; 
end; 
 
procedure TLiveSrvCast.LiveSrvCatchFileEnd(ASender: TObject; 
  nChannelNO: Smallint); 
var 
  StopCastTimer: TTimer; 
begin 
  with Main do 
    StopCastTimer := FindComponent('StopCast' + IntToStr(nChannelNO) + 'Timer') as TTimer; 
  if StopCastTimer.Enabled then begin 
    if FilesId[nChannelNO] < FilesList[nChannelNO].Count - 1 then 
      FilesId[nChannelNO] := FilesId[nChannelNO] + 1 
    else if FilesId[nChannelNO] = FilesList[nChannelNO].Count - 1 then 
      if If_RePlay[nChannelNO] then 
        FilesId[nChannelNO] := 0 
      else Exit; 
    Sleep(5000); 
    LiveSrv.CastFileName[nChannelNO] := FilesList[nChannelNO].Strings[FilesId[nChannelNO]]; 
    LiveSrv.BeginCast(nChannelNO); 
  end; 
end; 
 
procedure TLiveSrvCast.StopCastMItemClick(Sender: TObject); 
begin 
  Main.MyStopDesktopCast; 
end; 
 
procedure TLiveSrvCast.LiveSrvPopMenuChange(Sender: TObject; 
  Source: TMenuItem; Rebuild: Boolean); 
var 
  i: Integer; 
  MItem: array[0..2, 0..9] of TMenuItem; 
begin 
  try 
    if Main.Teacherch.Checked and (Main.VideoBox.ItemIndex >= 0) then begin 
      MainVideoMItem.Enabled := True; 
      for i := 0 to 9 do begin 
        MItem[0, i] := FindComponent('MainSource' + IntToStr(i + 1) + 'MItem') as TMenuItem; 
        if (MItem[0, i] <> nil) and (videoCard[Main.VideoBox.ItemIndex].Source[i] <> '') then begin 
          MItem[0, i].Enabled := True; 
          MItem[0, i].Caption := videoCard[Main.VideoBox.ItemIndex].Source[i]; 
        end 
        else MItem[0, i].Enabled := False 
      end; 
    end 
    else if not Main.Teacherch.Checked then 
      MainVideoMItem.Enabled := False; 
    if Main.Otherch.Checked and (Main.OtherCBox.ItemIndex >= 0) then begin 
      SubVideoMItem.Enabled := True; 
      for i := 0 to 9 do begin 
        MItem[1, i] := FindComponent('SubSource' + IntToStr(i + 1) + 'MItem') as TMenuItem; 
        if (MItem[1, i] <> nil) and (videoCard[Main.OtherCBox.ItemIndex].Source[i] <> '') then begin 
          MItem[1, i].Enabled := True; 
          MItem[1, i].Caption := videoCard[Main.OtherCBox.ItemIndex].Source[i]; 
        end 
        else MItem[1, i].Enabled := False; 
      end; 
    end 
    else if not Main.Otherch.Checked then 
      SubVideoMItem.Enabled := False; 
    for i := 0 to 9 do begin 
      MItem[2, i] := FindComponent('SubAudeoSource' + IntToStr(i) + 'MItem') as TMenuItem; 
      if (MItem[2, i] <> nil) and (audeoCard[0].Source[i] <> '') then begin 
        MItem[2, i].Enabled := True; 
        MItem[2, i].Caption := audeoCard[0].Source[i]; 
      end 
      else 
        MItem[2, i].Enabled := False; 
    end; 
  except 
  end; 
end; 
 
end.