我有一个通过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
时更新,但我不知道如何在视频中保存该流。
谢谢。
答案 0 :(得分:0)
首先:我不知道webrtc的工作原理,但是我可以向您解释如何处理图像以将其保存到文件中。
好吧,让我们开始:您目前只有来自lib的全尺寸位图。只要您不关心文件大小,并且只想显示“最新”框架,就可以了。要将多个帧存储到一个我们称为“视频”的文件中,您需要一个编码器来一起处理这些帧。
复杂的事情很简单:编码器拍摄2帧,分别称为帧A和B,然后以仅保存从帧A到帧B的更改的方式对其进行压缩。这样可以节省很多的存储空间,因为在视频中,我们只希望看到从一帧到另一帧的“变化”。那里有很多编码器,但是大多数情况下您可以看到ffmpeg,它非常流行,并且有很多c#包装器,因此请看一下。
摘要:要将2-x图像变成“视频”,您可以使用编码器对它们进行处理,该编码器以视频播放器可以播放的格式处理图像。