using LibVLCSharp.Shared; using System.Net; namespace robospot_camera_finder { public partial class StreamViewer : Form { public LibVLC _libVLC; public MediaPlayer _mp; string cam_ip = ""; int max_zoom_pulse = 9999; int min_zoom_pulse = 10; bool zoomTestSeqFlag = false; public StreamViewer(string name, string ip, MainForm.Camera camera, MainForm mainForm) { InitializeComponent(); _libVLC = new LibVLC(); _mp = new MediaPlayer(_libVLC); cam_ip = ip; this.Text = name; if (!cam_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://" + 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://" + cam_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://" + cam_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://" + cam_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; } } } }