public Bitmap TransformToBitmap(IDecodedVideoFrame decodedFrame) { var managedArray = TransformFrame(decodedFrame, _pictureSize); var im = CopyDataToBitmap(managedArray, _pictureSize); return(im); }
private void DecodeTask() { H264VideoPayloadParser parser = new H264VideoPayloadParser(new RtspClientSharp.Codecs.Video.H264CodecInfo()); FFmpegVideoDecoder decoder = FFmpegVideoDecoder.CreateDecoder(FFmpegVideoCodecId.H264); parser.FrameGenerated += (frame) => { lock (m_decoderLock) { IDecodedVideoFrame decodedFrame = decoder.TryDecode((RawVideoFrame)frame); if (decodedFrame != null) { m_lastDecodedFrame = decodedFrame; FrameReceived?.Invoke(this, decodedFrame); } else { Log.e(TAG, "Failed to decode frame"); } } }; while (!m_CancelToken.Token.IsCancellationRequested) { try { Payload nextFramePayload = m_payloadQueue.Receive(m_CancelToken.Token); parser.Parse(new TimeSpan(1), new ArraySegment <byte>(nextFramePayload.Data.GetBuffer(), (int)nextFramePayload.Data.Position, (int)nextFramePayload.Data.Remaining()), true); } catch (OperationCanceledException) { break; } } }
private void StopCapture(bool bNotifyRemote, bool bNotifyGUI) { if (State == EState.NONE) { return; } if (bNotifyRemote) { m_captureServer?.SendStopCapture(); } State = EState.NONE; m_startScreenCaptureTCS?.TrySetResult(false); m_startScreenCaptureTCS = null; m_CancelToken?.Cancel(); if (bNotifyGUI) { ScreenCaptureCancelled?.Invoke(this, new EventArgs()); } if (m_captureServer != null) { m_captureServer.ReceivedScreenCapture -= OnScreenCaptureReceivedEvent; } m_lastDecodedFrame = null; m_transferRateList.Clear(); m_nTransferRate = 0; }
private static void RtspClient_FrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); IDecodedVideoFrame decodedFrame = decoder.TryDecode(rawVideoFrame); if (decodedFrame != null) { var _FrameType = rawFrame is RawH264IFrame ? "IFrame" : "PFrame"; TransformParameters _transformParameters = new TransformParameters(RectangleF.Empty, new Size(STREAM_WIDTH, STREAM_HEIGHT), ScalingPolicy.Stretch, PixelFormat.Bgra32, ScalingQuality.FastBilinear); var pictureSize = STREAM_WIDTH * STREAM_HEIGHT; IntPtr unmanagedPointer = Marshal.AllocHGlobal(pictureSize * 4); decodedFrame.TransformTo(unmanagedPointer, STREAM_WIDTH * 4, _transformParameters); byte[] managedArray = new byte[pictureSize * 4]; Marshal.Copy(unmanagedPointer, managedArray, 0, pictureSize * 4); Marshal.FreeHGlobal(unmanagedPointer); Console.WriteLine($"Frame was successfully decoded! {_FrameType } Trying to save to JPG file..."); try { string mypath = "empty";//initialize //request.AddFile("f1", "http://*****:*****@"E:\learning\testphoto\image21.jpg", ImageFormat.Jpeg); im.Save(@mypath, ImageFormat.Jpeg); return; } if (isLinux) { // Change to your path mypath = Path.Combine(WebHostEnvironment.WebRootPath, "uploads/", "1", "image21.jpg");//linux path im.Save(@mypath, ImageFormat.Jpeg); return; } throw new PlatformNotSupportedException("Not supported OS platform!!"); } catch (Exception e) { Console.WriteLine($"Error saving to file: {e.Message}"); Debug.WriteLine($"Error saving to file: {e.Message}"); Debug.WriteLine($"Stack trace: {e.StackTrace}"); } } }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); if (!decoder.TryDecode(rawVideoFrame, out DecodedVideoFrameParameters decodedFrameParameters)) { return; } //long desiredSize = (long)rawFrame. << 32 | (uint)height; //long desiredSize = Interlocked.Read(ref _desiredSize); int targetWidth; int targetHeight; int bufferSize; //if (desiredSize == 0) //{ targetWidth = decodedFrameParameters.Width; targetHeight = decodedFrameParameters.Height; bufferSize = decodedFrameParameters.Height * ImageUtils.GetStride(decodedFrameParameters.Width, PixelFormat.Bgr24); //} //else //{ // targetWidth = (int)(desiredSize >> 32); // targetHeight = (int)desiredSize; // bufferSize = targetHeight * // ImageUtils.GetStride(targetWidth, PixelFormat.Bgr24); //} if (_decodedFrameBuffer.Length != bufferSize) { _decodedFrameBuffer = new byte[bufferSize]; } var bufferSegment = new ArraySegment <byte>(_decodedFrameBuffer); var postVideoDecodingParameters = new PostVideoDecodingParameters(RectangleF.Empty, new Size(targetWidth, targetHeight), ScalingPolicy.Stretch, PixelFormat.Bgr24, ScalingQuality.Bicubic); IDecodedVideoFrame decodedFrame = decoder.GetDecodedFrame(bufferSegment, postVideoDecodingParameters); FrameReceived?.Invoke(this, decodedFrame); }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); IDecodedVideoFrame decodedFrame = decoder.TryDecode(rawVideoFrame); if (decodedFrame != null) { FrameReceived?.Invoke(this, decodedFrame); } }
private static byte[] TransformFrame(IDecodedVideoFrame decodedFrame, Size pictureSize) { var transformParameters = new TransformParameters( RectangleF.Empty, pictureSize, ScalingPolicy.Stretch, FrameDecoderCore.PixelFormat.Bgra32, ScalingQuality.FastBilinear); var pictureArraySize = pictureSize.Width * pictureSize.Height * 4; var unmanagedPointer = Marshal.AllocHGlobal(pictureArraySize); decodedFrame.TransformTo(unmanagedPointer, pictureSize.Width * 4, transformParameters); var managedArray = new byte[pictureArraySize]; Marshal.Copy(unmanagedPointer, managedArray, 0, pictureArraySize); Marshal.FreeHGlobal(unmanagedPointer); return(managedArray); }
private void OnFrameReceived(object sender, IDecodedVideoFrame decodedFrame) { if (!decodedFrame.FrameParameters.Equals(_frameParameters)) { _frameParameters = decodedFrame.FrameParameters; _transformParameters = new TransformParameters(System.Drawing.RectangleF.Empty, new System.Drawing.Size(_frameParameters.Width, _frameParameters.Height), ScalingPolicy.Stretch, PixelFormat.Bgr24, ScalingQuality.FastBilinear); _cvBitmap = new Image <Bgr, byte>(_frameParameters.Width, _frameParameters.Height); FrameSizeChanged?.Invoke(this, new Tuple <double, double>(_frameParameters.Width, _frameParameters.Height)); } if (_yoloWrapper.IsYoloReady()) { decodedFrame.TransformTo(_cvBitmap.Mat.DataPointer, _cvBitmap.Mat.Cols * _cvBitmap.Mat.ElementSize, _transformParameters); _yoloWrapper.FrameIn(this, _cvBitmap.Mat); } }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } Console.WriteLine($"OnFrameReceived sender : {sender.GetType()}, rawFrame : {rawFrame.GetType()}"); FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); IDecodedVideoFrame decodedFrame = decoder.TryDecode(rawVideoFrame); if (decodedFrame != null) { FrameReceived?.Invoke(this, decodedFrame); } }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); if (!decoder.TryDecode(rawVideoFrame, out DecodedVideoFrameParameters decodedFrameParameters)) { return; } int targetWidth = decodedFrameParameters.Width; int targetHeight = decodedFrameParameters.Height; int bufferSize = decodedFrameParameters.Height * ImageUtils.GetStride(decodedFrameParameters.Width, PixelFormat.Bgr24); if (_decodedFrameBuffer.Length != bufferSize) { _decodedFrameBuffer = new byte[bufferSize]; } var bufferSegment = new ArraySegment <byte>(_decodedFrameBuffer); if (_postVideoDecodingParameters.TargetFrameSize.Width != targetWidth || _postVideoDecodingParameters.TargetFrameSize.Height != targetHeight) { _postVideoDecodingParameters = new PostVideoDecodingParameters(RectangleF.Empty, new Size(targetWidth, targetHeight), ScalingPolicy.Stretch, PixelFormat.Bgr24, ScalingQuality.Nearest); } IDecodedVideoFrame decodedFrame = decoder.GetDecodedFrame(bufferSegment, _postVideoDecodingParameters); FrameReceived?.Invoke(this, decodedFrame); }
private void OnFrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); if (!decoder.TryDecode(rawVideoFrame, out DecodedVideoFrameParameters decodedFrameParameters)) { return; } long desiredSize = Interlocked.Read(ref _desiredSize); int targetWidth; int targetHeight; if (desiredSize == 0) { targetWidth = decodedFrameParameters.Width; targetHeight = decodedFrameParameters.Height; } else { targetWidth = (int)(desiredSize >> 32); targetHeight = (int)desiredSize; } var postVideoDecodingParameters = new PostVideoDecodingParameters(RectangleF.Empty, new Size(targetWidth, targetHeight), ScalingPolicy.Stretch, PixelFormat.Bgr24, ScalingQuality.Bicubic); IDecodedVideoFrame decodedFrame = decoder.GetDecodedFrame(postVideoDecodingParameters); FrameReceived?.Invoke(this, decodedFrame); }
private static void RtspClient_FrameReceived(object sender, RawFrame rawFrame) { if (!(rawFrame is RawVideoFrame rawVideoFrame)) { return; } FFmpegVideoDecoder decoder = GetDecoderForFrame(rawVideoFrame); IDecodedVideoFrame decodedFrame = decoder.TryDecode(rawVideoFrame); if (decodedFrame != null) { var _FrameType = rawFrame is RawH264IFrame ? "IFrame" : "PFrame"; //myCode DateTime currentTime = DateTime.Now; Console.WriteLine($"{currentTime} ::Frame is {_FrameType }..."); //string strConn = @"Data Source=E:\work\db\ipframes.db"; string strConn = @"Data Source = " + DBPath; try { using (SQLiteConnection conn = new SQLiteConnection(strConn)) { conn.Open(); if (_FrameType == "IFrame") { string sql = "INSERT Into Frames VALUES( 1, 0, datetime('now', 'localtime'))"; using (SQLiteCommand cmd = new SQLiteCommand(sql, conn)) { cmd.ExecuteNonQuery(); } } else { string sql = "INSERT Into Frames VALUES( 0, 1, datetime('now', 'localtime'))"; using (SQLiteCommand cmd = new SQLiteCommand(sql, conn)) { cmd.ExecuteNonQuery(); } } conn.Close(); } } catch (Exception e) { Console.WriteLine($"Error saving to file: {e.Message}"); Debug.WriteLine($"Error saving to file: {e.Message}"); Debug.WriteLine($"Stack trace: {e.StackTrace}"); } //original /* * TransformParameters _transformParameters = new TransformParameters(RectangleF.Empty, * new Size(STREAM_WIDTH, STREAM_HEIGHT), * ScalingPolicy.Stretch, PixelFormat.Bgra32, ScalingQuality.FastBilinear); * * var pictureSize = STREAM_WIDTH* STREAM_HEIGHT; * IntPtr unmanagedPointer = Marshal.AllocHGlobal(pictureSize*4); * * decodedFrame.TransformTo(unmanagedPointer, STREAM_WIDTH*4, _transformParameters); * byte[] managedArray = new byte[pictureSize*4]; * Marshal.Copy(unmanagedPointer, managedArray, 0, pictureSize*4); * Marshal.FreeHGlobal(unmanagedPointer); * Console.WriteLine($"Frame was successfully decoded! {_FrameType } Trying to save to JPG file..."); * try * { * var im = CopyDataToBitmap(managedArray); * if (isWindows) * { * // Change to your path * im.Save(@"E:\TestPhoto\image21.jpg", ImageFormat.Jpeg); * return; * } * if (isLinux) * { * // Change to your path * im.Save(@"/home/alex/image21.jpg", ImageFormat.Jpeg); * return; * } * throw new PlatformNotSupportedException("Not supported OS platform!!"); * } * catch (Exception e) * { * Console.WriteLine($"Error saving to file: {e.Message}"); * Debug.WriteLine($"Error saving to file: {e.Message}"); * Debug.WriteLine($"Stack trace: {e.StackTrace}"); * } */ } }