using LibVLCSharp.Shared; using System.Net; namespace robospot_camera_finder { public partial class StreamViewer : Form { public LibVLC _libVLC; public MediaPlayer _mp; MainForm.Camera camera; const int MAX_ZOOM_PULSE = 9999; const int MIN_ZOOM_PULSE = 10; bool zoomTestSeqFlag = false; public StreamViewer(MainForm.Camera cam, MainForm mainForm) { InitializeComponent(); _libVLC = new LibVLC(); _mp = new MediaPlayer(_libVLC); camera = cam; this.Text = camera.camera_name; if (!cam.camera_ip.StartsWith("10.")) { MessageBox.Show("Camera is not on the 10.0.0.0/8 network, the RoboSpot might not find it.", "Wrong IP", MessageBoxButtons.OK, MessageBoxIcon.Warning); } string rtsp_link = "rtsp://" + camera.camera_ip + "/profile2/media.smp"; updateZoomSlider(); tbRtspLink.Text = rtsp_link; videoView.MediaPlayer = _mp; var media = new Media(_libVLC, new Uri(rtsp_link)); media.AddOption(":network-caching=25"); _mp.Play(media); media.Dispose(); } private void updateZoomSlider() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + camera.camera_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=query&action=view&Query=Zoom"); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); string text; using (var sr = new StreamReader(response.GetResponseStream())) { text = sr.ReadToEnd(); } string[] resp_lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); string zoom_value = resp_lines[1].Substring(resp_lines[1].LastIndexOf('=') + 1); tbZoom.Value = int.Parse(zoom_value); } private void sendZoomValue(string zoom_pulse) { // clamp values to allowed range if (int.Parse(zoom_pulse) < MIN_ZOOM_PULSE) { zoom_pulse = MIN_ZOOM_PULSE.ToString(); } if (int.Parse(zoom_pulse) > MAX_ZOOM_PULSE) { zoom_pulse = MAX_ZOOM_PULSE.ToString(); } HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + camera.camera_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=absolute&action=control&ZoomPulse=" + zoom_pulse); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); } private void sendZoomValueManual(string zoom_value) { HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://" + camera.camera_ip + "/stw-cgi/ptzcontrol.cgi?msubmenu=continuous&NormalizedSpeed=True&action=control&Channel=0&Zoom=" + zoom_value); request.Credentials = new NetworkCredential(MainForm.cam_username, MainForm.cam_password); HttpWebResponse response = (HttpWebResponse)request.GetResponse(); } private void StreamViewer_FormClosed(object sender, FormClosedEventArgs e) { _mp.Stop(); _mp.Dispose(); _libVLC.Dispose(); } private void tbZoom_KeyUp(object sender, KeyEventArgs e) { sendZoomValue(tbZoom.Value.ToString()); } private void tbZoom_MouseUp(object sender, MouseEventArgs e) { sendZoomValue(tbZoom.Value.ToString()); } private void timerUpdateZoom_Tick(object sender, EventArgs e) { updateZoomSlider(); } private void btnZoomMax_Click(object sender, EventArgs e) { tbZoom.Value = MAX_ZOOM_PULSE; sendZoomValue(tbZoom.Value.ToString()); } private void btnZoomMin_Click(object sender, EventArgs e) { tbZoom.Value = MIN_ZOOM_PULSE; sendZoomValue(tbZoom.Value.ToString()); } private void cbTestZoom_CheckedChanged(object sender, EventArgs e) { if (cbTestZoom.Checked) { timerZoomTestSeq.Start(); } else { timerZoomTestSeq.Stop(); } } private void timerZoomTestSeq_Tick(object sender, EventArgs e) { if (zoomTestSeqFlag) { tbZoom.Value = MIN_ZOOM_PULSE; sendZoomValue(tbZoom.Value.ToString()); zoomTestSeqFlag = false; } else { tbZoom.Value = MAX_ZOOM_PULSE; sendZoomValue(tbZoom.Value.ToString()); zoomTestSeqFlag = true; } } } }