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("获取图片失败"); } } }