- 編譯環境
- 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("獲取圖片失敗"); } } }