C# 使用ffmpeg读取监控视频流

  • 编译环境
  • 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("获取图片失败");
                }
            }
        }

 

posted @ 2024-05-06 09:57  坤机嘎嘎嘎  阅读(215)  评论(0编辑  收藏  举报