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

时间:2014-06-10 12:49:00

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

我一直在检查将实时帧转换为视频。我发现(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?有没有可能在背景中写它? 请给我建议。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

使用例如ConcurrentQueue来缓冲一个线程上的活动帧(En-queue)而没有延迟,而其他线程可以以它可以的速度保存这些帧(De-queue)。这样你就不会丢帧了。

显然你会对RAM产生压力,并且在停止实时视频后你会在保存线程结束时遇到延迟。