繁体   English   中英

c#-将实时帧录制为视频的最佳方法是什么

[英]c# what is the best way to record live frames as Video

我一直在检查以将实时帧转换为视频。 而且我发现(NReco.VideoConverter)ffmpeg库可以将实时帧转换为Video,但是问题是将每个帧写入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? 有没有可能在后台编写它? 请给我建议。

我敢肯定,由于FullHD分辨率(NReco.VideoConverter是FFMpeg的包装器),大多数时间都需要通过FFMpeg对原始位图进行编码和压缩(如果使用h264或类似的方式进行编码)。 您必须知道FullHD的实时编码是非常消耗CPU的任务。 如果您的计算机无法执行此操作,则可以尝试使用FFMPeg编码参数(降低视频质量/压缩比等)或使用需要较少CPU资源的编码器。

如果您需要录制一些有限时间的实时流,则可以将视频捕获和压缩/保存分为两个线程。

例如,使用ConcurrentQueue在一个线程上无延迟地缓冲实时帧(入队),而其他线程可以按其可能的速度保存这些帧(出队)。 这样您就不会松动框架。

显然,您会在RAM上感到紧张,并且在停止实况视频之后,保存线程完成时也会有延迟。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM