【问题标题】:c# what is the best way to record live frames as Videoc#将实时帧记录为视频的最佳方法是什么
【发布时间】:2014-06-10 12:48:59
【问题描述】:

我一直在检查将实时帧转换为视频。我发现 (NReco.VideoConverter) ffmpeg lib 将实时帧转换为视频,但问题是将每个帧写入 ConvertLiveMediaTask (异步实时媒体任务转换)需要时间。

我有一个从 IpCamera 提供(原始)帧 (1920x1080) (25fps) 的事件。每当我得到框架时,我都会执行以下操作

//Image availbale event fired
//...

//...
// Record video is true
if(record)
{
//////////////############# Time taking part ##############//////////////////////
var bd = frameBmp.LockBits(new Rectangle(0, 0, frameBmp.Width, frameBmp.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);                        
  var buf = new byte[bd.Stride * frameBmp.Height];                       
  Marshal.Copy(bd.Scan0, buf, 0, buf.Length);
  // write to ConvertLiveMediaTask
  convertLiveMediaTask.Write(buf, 0, buf.Length); // ffMpegTask
  frameBmp.UnlockBits(bd);
//////////////////////////////////////////////////////////////////////////////////
}

由于上述部分花费了很多时间,我正在失去框架。

//Stop recording
convertLiveMediaTask.Stop(); //ffMpegTask

停止录制,这部分我使用了 BackgroundWorker,因为将媒体保存到文件需要太多时间。
我的问题是如何以更快的方式将帧写入 ConvertLiveMediaTask?有没有可能在后台写它? 请给我建议。

【问题讨论】:

    标签: c# ffmpeg live background-process video-recording


    【解决方案1】:

    我敢肯定,由于全高清分辨率(NReco.VideoConverter 是 FFMpeg 的包装器),FFMpeg 编码和压缩原始位图(如果您使用 h264 或类似的东西对它们进行编码)需要花费大部分时间。您必须知道,FullHD 的实时编码是非常消耗 CPU 的任务;如果您的计算机无法做到这一点,您可以尝试使用 FFMPeg 编码参数(降低视频质量/压缩比等)或使用需要较少 CPU 资源的编码器。

    【讨论】:

      【解决方案2】:

      如果您需要录制一些限时的直播,您可以将视频捕获和压缩/保存分成两个线程。

      例如使用 ConcurrentQueue 在一个线程上缓冲实时帧(En-queue),而不会延迟,而其他线程可以以它可以的速度保存这些帧(De-queue)。这样您就不会丢失框架。

      显然,您会对 RAM 造成压力,并且在停止实时视频后,您在保存线程完成时会有延迟。

      【讨论】:

        猜你喜欢
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 2010-10-20
        • 2011-04-05
        • 1970-01-01
        • 2016-03-20
        • 2020-08-13
        • 2022-10-08
        相关资源
        最近更新 更多