void timer_Tick(object sender, EventArgs e) { currentImage = receiver.GetDevice("192.168.168.55").LatestImage; if (currentImage != previousImage) { fpsCalc++; previousImage = currentImage; if (pb.Image != null) { pb.Image.Dispose(); } MemoryStream ms = new MemoryStream(currentImage); Image img = Bitmap.FromStream(ms); lblVideoData.Text = img.Width + "x" + img.Height; pb.Image = img; } if (nextFpsSecond < DateTime.Now) { lblFrameRate.Text = fpsCalc.ToString(); fpsCalc = 0; nextFpsSecond = DateTime.Now.AddSeconds(1); } // Unfortunately, I could not get audio to play using the NAudio library, so this test application only plays back video. }
public override void handleGETRequest(HttpProcessor p) { try { string requestedPage = Uri.UnescapeDataString(p.request_url.AbsolutePath.TrimStart('/')); string[] requestedPath = p.request_url.Segments; string requestedDevice = requestedPath[1].TrimStart('/').TrimEnd('/'); string requestedMedia = requestedPath[2].TrimStart('/').TrimEnd('/'); if (requestedMedia == "image.jpg") { byte[] latestImage = receiver.GetDevice(requestedDevice).LatestImage; if (latestImage == null) { latestImage = new byte[0]; } p.writeSuccess("image/jpeg", latestImage.Length); p.outputStream.Flush(); p.rawOutputStream.Write(latestImage, 0, latestImage.Length); } else if (requestedMedia.EndsWith("image.mjpg")) { p.tcpClient.ReceiveBufferSize = 4; p.tcpClient.SendBufferSize = 4; Console.WriteLine("Beginning mjpg stream"); p.writeSuccess("multipart/x-mixed-replace;boundary=hdmiextender"); byte[] previousImage = null; byte[] currentImage; while (!this.stopRequested) { try { currentImage = receiver.GetDevice(requestedDevice).LatestImage; if (currentImage == previousImage) { Thread.Sleep(1); } else { previousImage = currentImage; p.outputStream.WriteLine("--hdmiextender"); p.outputStream.WriteLine("Content-Type: image/jpeg"); p.outputStream.WriteLine("Content-Length: " + currentImage.Length); p.outputStream.WriteLine(); p.outputStream.Flush(); p.rawOutputStream.Write(currentImage, 0, currentImage.Length); p.rawOutputStream.Flush(); p.outputStream.WriteLine(); p.outputStream.Flush(); } } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } break; } } Console.WriteLine("Ending mjpg stream"); } else if (requestedMedia == "audio.wav") { Console.WriteLine("Beginning audio stream"); int?audioRegistrationId = null; try { ConcurrentQueue <byte[]> audioData = new ConcurrentQueue <byte[]>(); audioRegistrationId = receiver.GetDevice(requestedDevice).RegisterAudioListener(audioData); p.writeSuccess("audio/x-wav"); p.outputStream.Flush(); byte[] buffer; while (!this.stopRequested) { while (audioData.TryDequeue(out buffer)) { p.rawOutputStream.Write(buffer, 0, buffer.Length); } Thread.Sleep(1); } } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } } finally { Console.WriteLine("Ending audio stream"); if (audioRegistrationId != null) { receiver.GetDevice(requestedDevice).UnregisterAudioListener(audioRegistrationId.Value); } } } else if (requestedPage == "raw.html") { p.writeSuccess(); p.outputStream.Write(@"<html> <head> <title>Raw MJPEG view</title> <style> body { background-color: Black; } </style> </head> <body> <img src=""image.mjpg"" /> </body> </html>"); } } catch (Exception ex) { if (!p.isOrdinaryDisconnectException(ex)) { Logger.Debug(ex); } } }