Files
robospot-camera-finder/StreamViewer.cs

145 lines
4.9 KiB
C#

using LibVLCSharp.Shared;
using System.Net;
namespace robospot_camera_finder
{
public partial class StreamViewer : Form
{
public LibVLC _libVLC;
public MediaPlayer _mp;
MainForm.Camera camera;
int max_zoom_pulse = 9999;
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;
}
}
}
}