C# 使用ffmpeg讀取監控影片流

坤机嘎嘎嘎發表於2024-05-06
  • 編譯環境
  • Visual Studio 2022
  • .Net Framework 4.7.2
  • x64
  • 需要開啟允許不安全程式碼(專案屬性->生成->允許不安全程式碼)

之前使用OpenCVSharp寫的一個拉流,在伺服器上跑不起來。於是換了這個使用FFmpeg.AutoGen的。

參考博文:用C#做一個 拉流播放器 - 搖光Summer - 部落格園 (cnblogs.com)

之前看的使用FFmpeg需要安裝FFmpeg來使用FFmpeg自帶的dll檔案。這個部落格直接提供了dll的下載方式。下載下來之後就可以直接使用了。非常方便。

首先將下載的dll全部放入到debug資料夾下。然後呼叫註冊程式碼

            FFmpegBinariesHelper.RegisterFFmpegBinaries();//註冊ffmpeg
            SetupLogging();//設定日誌級別

例項化影片解碼器

videoStreamDecoder = new VideoStreamDecoder(url);

按幀讀取流

 private unsafe void DecodeAllFramesToImages()
        {
            var info = videoStreamDecoder.GetContextInfo();
            var sourceSize = videoStreamDecoder.FrameSize;
            var sourcePixelFormat = videoStreamDecoder.PixelFormat;
            var destinationSize = sourceSize;
            var destinationPixelFormat = AVPixelFormat.AV_PIX_FMT_BGR24;
            var vfc = new VideoFrameConverter(sourceSize, sourcePixelFormat, destinationSize, destinationPixelFormat);
            while (CanRead)
            {
                bool success = videoStreamDecoder.TryDecodeNextFrame(out var farme);
                if (success)
                {
                    var cFarme = vfc.Convert(farme);
                    using (var bitmap = new Bitmap(cFarme.width, cFarme.height, cFarme.linesize[0], PixelFormat.Format24bppRgb, (IntPtr)cFarme.data[0]))
                    {
                        _Image = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat);
                        Graphics g = picBefore.CreateGraphics();
                        g.SmoothingMode = SmoothingMode.HighSpeed;
                        g.DrawImage(bitmap, 0, 0, (int)picBefore.Size.Width, (int)picBefore.Size.Height); //在窗體的畫布中繪畫出記憶體中的影像
                    }
                }
                else
                {
                    Console.WriteLine("獲取圖片失敗");
                }
            }
        }

相關文章