将位图流以c#方式发送到视频?

时间:2018-12-29 18:28:23

标签: c# video bitmap stream

我有一个通过webrtc库接收视频流的代码,该代码在其功能中将其显示在PictureBox中,我的问题是..如何将该视频流从PictureBox传递到视频在我的计算机上?

public unsafe void OnRenderRemote(byte* yuv, uint w, uint h)
{
    lock (pictureBoxRemote)
    {
        if (0 == encoderRemote.EncodeI420toBGR24(yuv, w, h, ref bgrBuffremote, true))
        {
            if (remoteImg == null)  
            {    
                var bufHandle = GCHandle.Alloc(bgrBuffremote, GCHandleType.Pinned);
                remoteImg = new Bitmap((int)w, (int)h, (int)w * 3, PixelFormat.Format24bppRgb, bufHandle.AddrOfPinnedObject()); 
            }
        }
    }

    try
    {
        Invoke(renderRemote, this);
    }
    catch // don't throw on form exit
    {
    }
}

此代码通过webrtc接收流,并将其转换为图像,然后显示在PictureBox中,调用此函数..我的问题是:

如何保存remoteImg图像的数组或缓冲区,以便可以将其写入计算机上的视频文件?

尝试做这样的事情:

FileWriter.Open ("C:\\Users\\assa\\record.avi", (int) w, (int) h, (int) w * 3, VideoCodec.Default, 5000000);
FileWriter.WriteVideoFrame (remoteImg);

但仅保存单个捕获而不保存视频,是否有任何方法可以使用OnRenderRemote功能(如上所述)保存流的图像,以便将其保存在视频中?

OnRenderRemote仅在每次调用PictureBox时更新,但我不知道如何在视频中保存该流。

谢谢。

1 个答案:

答案 0 :(得分:0)

首先:我不知道webrtc的工作原理,但是我可以向您解释如何处理图像以将其保存到文件中。

好吧,让我们开始:您目前只有来自lib的全尺寸位图。只要您不关心文件大小,并且只想显示“最新”框架,就可以了。要将多个帧存储到一个我们称为“视频”的文件中,您需要一个编码器来一起处理这些帧。

复杂的事情很简单:编码器拍摄2帧,分别称为帧A和B,然后以仅保存从帧A到帧B的更改的方式对其进行压缩。这样可以节省很多的存储空间,因为在视频中,我们只希望看到从一帧到另一帧的“变化”。那里有很多编码器,但是大多数情况下您可以看到ffmpeg,它非常流行,并且有很多c#包装器,因此请看一下。

摘要:要将2-x图像变成“视频”,您可以使用编码器对它们进行处理,该编码器以视频播放器可以播放的格式处理图像。