private void FrameReceived(object sender, RtpStream.FrameReceivedEventArgs ea) { try { if (firstFrame) { Bitmap DrawImage = new Bitmap(video_width, video_height); EncoderParameter epQuality = new EncoderParameter(Encoder.Quality, video_quality); // Store the quality parameter in the list of encoder parameters EncoderParameters epParameters = new EncoderParameters(1); epParameters.Param[0] = epQuality; MemoryStream ms = new MemoryStream(); DrawImage.Save(ms, GetImageCodecInfo(ImageFormat.Jpeg), epParameters); Array.Copy(ms.GetBuffer(), 0, JpegHeader, 0, offset); firstFrame = false; } byte[] data = new byte[ea.Frame.Buffer.Length + offset]; Array.Copy(JpegHeader, data, JpegHeader.Length); Array.Copy(ea.Frame.Buffer, 0, data, offset, ea.Frame.Buffer.Length); System.IO.MemoryStream msImage = new MemoryStream(data); VsImage img = new VsImage((Bitmap)Image.FromStream(msImage)); int index = GetIndex(ea.RtpStream.IPAddress); if (index!= -1 && vsRtpStream[index] != null && vsRtpStream[index].FrameOut != null) { vsRtpStream[index].FrameOut(this, new VsImageEventArgs(img)); } img.Dispose(); img = null; } catch (Exception ex) { Console.WriteLine(ex.Message); } }
// Thread entry point public void WorkerThread() { byte[] buffer = new byte[bufSize]; // buffer to read stream HttpWebRequest req = null; WebResponse resp = null; Stream stream = null; Random rnd = new Random((int) DateTime.Now.Ticks); DateTime start; TimeSpan span; while (true) { int read, total = 0; try { start = DateTime.Now; // create request if (!preventCaching) { req = (HttpWebRequest) WebRequest.Create(source); } else { req = (HttpWebRequest) WebRequest.Create(source + ((source.IndexOf('?') == -1) ? '?' : '&') + "fake=" + rnd.Next().ToString()); } // set login and password if ((login != null) && (password != null) && (login != "")) req.Credentials = new NetworkCredential(login, password); // set connection group name if (useSeparateConnectionGroup) req.ConnectionGroupName = GetHashCode().ToString(); // get response resp = req.GetResponse(); // get response stream stream = resp.GetResponseStream(); // loop while (!stopEvent.WaitOne(0, true)) { // check total read if (total > bufSize - readSize) { total = 0; } // read next portion from stream if ((read = stream.Read(buffer, total, readSize)) == 0) break; total += read; // increment received bytes counter bytesReceived += read; } if (!stopEvent.WaitOne(0, true)) { // increment frames counter framesReceived++; // image at stop if (FrameOut != null) { Bitmap bmp = (Bitmap) Bitmap.FromStream(new MemoryStream(buffer, 0, total)); // notify client VsImage img = new VsImage(bmp); FrameOut(this, new VsImageEventArgs(img)); // release the image img.Dispose(); img = null; } } // wait for a while ? if (frameInterval > 0) { // times span span = DateTime.Now.Subtract(start); // miliseconds to sleep int msec = frameInterval - (int) span.TotalMilliseconds; while ((msec > 0) && (stopEvent.WaitOne(0, true) == false)) { // sleeping ... Thread.Sleep((msec < 100) ? msec : 100); msec -= 100; } } } catch (WebException ex) { System.Diagnostics.Debug.WriteLine("=============: " + ex.Message); // wait for a while before the next try Thread.Sleep(250); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("=============: " + ex.Message); } finally { // abort request if (req != null) { req.Abort(); req = null; } // close response stream if (stream != null) { stream.Close(); stream = null; } // close response if (resp != null) { resp.Close(); resp = null; } } // need to stop ? if (stopEvent.WaitOne(0, true)) break; } }
// Thread entry point public void WorkerThread() { byte[] buffer = new byte[bufSize]; // buffer to read stream while (true) { // reset reload event reloadEvent.Reset(); HttpWebRequest req = null; WebResponse resp = null; Stream stream = null; byte[] delimiter = null; byte[] delimiter2 = null; byte[] boundary = null; int boundaryLen, delimiterLen = 0, delimiter2Len = 0; int read, todo = 0, total = 0, pos = 0, align = 1; int start = 0, stop = 0; // align // 1 = searching for image start // 2 = searching for image end try { // create request req = (HttpWebRequest)WebRequest.Create(source); // set login and password if ((login != null) && (password != null) && (login != "")) req.Credentials = new NetworkCredential(login, password); // set connection group name if (useSeparateConnectionGroup) req.ConnectionGroupName = GetHashCode().ToString(); // get response resp = req.GetResponse(); // check content type string ct = resp.ContentType; if (ct.IndexOf("multipart/x-mixed-replace") == -1) throw new ApplicationException("Invalid URL"); // get boundary ASCIIEncoding encoding = new ASCIIEncoding(); boundary = encoding.GetBytes(ct.Substring(ct.IndexOf("boundary=", 0) + 9)); boundaryLen = boundary.Length; // get response stream stream = resp.GetResponseStream(); // loop while ((!stopEvent.WaitOne(0, true)) && (!reloadEvent.WaitOne(0, true))) { // check total read if (total > bufSize - readSize) { total = pos = todo = 0; } // read next portion from stream if ((read = stream.Read(buffer, total, readSize)) == 0) throw new ApplicationException(); total += read; todo += read; // increment received bytes counter bytesReceived += read; // does we know the delimiter ? if (delimiter == null) { // find boundary pos = ByteArrayUtils.Find(buffer, boundary, pos, todo); if (pos == -1) { // was not found todo = boundaryLen - 1; pos = total - todo; continue; } todo = total - pos; if (todo < 2) continue; // check new line delimiter type if (buffer[pos + boundaryLen] == 10) { delimiterLen = 2; delimiter = new byte[2] { 10, 10 }; delimiter2Len = 1; delimiter2 = new byte[1] { 10 }; } else { delimiterLen = 4; delimiter = new byte[4] { 13, 10, 13, 10 }; delimiter2Len = 2; delimiter2 = new byte[2] { 13, 10 }; } pos += boundaryLen + delimiter2Len; todo = total - pos; } // search for image if (align == 1) { start = ByteArrayUtils.Find(buffer, delimiter, pos, todo); if (start != -1) { // found delimiter start += delimiterLen; pos = start; todo = total - pos; align = 2; } else { // delimiter not found todo = delimiterLen - 1; pos = total - todo; } } // search for image end while ((align == 2) && (todo >= boundaryLen)) { stop = ByteArrayUtils.Find(buffer, boundary, pos, todo); if (stop != -1) { pos = stop; todo = total - pos; // increment frames counter framesReceived++; // image at stop if (FrameOut != null) { Bitmap bmp = (Bitmap)Bitmap.FromStream(new MemoryStream(buffer, start, stop - start)); VsImage img = new VsImage(bmp); // notify client FrameOut(this, new VsImageEventArgs(img)); // release the image img.Dispose(); img = null; } // shift array pos = stop + boundaryLen; todo = total - pos; Array.Copy(buffer, pos, buffer, 0, todo); total = todo; pos = 0; align = 1; } else { // delimiter not found todo = boundaryLen - 1; pos = total - todo; } } } } catch (WebException ex) { System.Diagnostics.Debug.WriteLine("=============: " + ex.Message); // wait for a while before the next try Thread.Sleep(250); } catch (ApplicationException ex) { System.Diagnostics.Debug.WriteLine("=============: " + ex.Message); // wait for a while before the next try Thread.Sleep(250); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine("=============: " + ex.Message); } finally { // abort request if (req != null) { req.Abort(); req = null; } // close response stream if (stream != null) { stream.Close(); stream = null; } // close response if (resp != null) { resp.Close(); resp = null; } } // need to stop ? if (stopEvent.WaitOne(0, true)) break; } }
// new frame protected void OnNewFrame(Bitmap image) { framesReceived++; if ((!stopEvent.WaitOne(0, true)) && (FrameOut != null)) { VsImage img = new VsImage(image); // notify client FrameOut(this, new VsImageEventArgs(img)); // release the image img.Dispose(); img = null; } }
// new frame protected void OnNewFrame(Bitmap image) { framesReceived++; if (FrameOut != null) { VsImage img = new VsImage(image); FrameOut(this, new VsImageEventArgs(img)); img.Dispose(); img = null; } }