我正在从事屏幕共享项目。我只通过套接字发送屏幕差异,比较以前的缓冲区和实际缓冲区。它工作
我使用 Format16bppRgb555
向客户端发送 8 到 9 FPS 以减小位图的整体字节大小
byte[] wholescreensize= new byte[1360 * 768 * 2];// Its around 2 Mb
我的问题是全屏更改时。
我使用以下功能获得了大约 45-60 kb 的 PNG 图像
45kb * 10 (FPS( = 450 kb
可以减少到 45 kb 以上。
我对降低 FPS 不感兴趣,因为它是实时屏幕共享应用程序。
JPEG压缩或LZ4/GZIP也没有太大区别,因为PNG图像已经压缩
private void SendImgDiffToClient(byte[] contents,Rectangle rectangle)
{
//Converting Small Portion to Bitmap.Bcoz Image.FromStrem not working here error Parameter is not Valid
byte[] byteArrayout = new byte[contents.Length];
var bitmap = new Bitmap(rectangle.Width, rectangle.Height, PixelFormat.Format16bppRgb555);
var bitmap_data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.WriteOnly, PixelFormat.Format16bppRgb555);
Marshal.Copy(contents, 0, bitmap_data.Scan0, byteArrayout.Length);
bitmap.UnlockBits(bitmap_data);
//Converting Small Bitmap to Png Byte Array and Sending to Client
using (MemoryStream ms = new MemoryStream())
{
Image msImage = (Image)bitmap;
msImage.Save(ms, ImageFormat.Png);
msImage.Dispose();
byteArrayout = ms.ToArray();
}
SendtoClient(byteArrayout);
}
我的探索是在这种情况下减少字节的最佳方法。
视频流本质上是你正在做的事情;现代视频压缩算法有很多增强功能。 也许他们可以跟踪或移动工件,或以其他方式扭曲所述工件作为其功能的一部分。 也许他们可以以逐步构建的方式流式传输数据,以便静态项目最终获得更多细节(类似于渐进式 jpeg 图像(。 他们同时做很多事情。 您可以尝试进一步研究它们,并从中获取灵感,或者您可以选择并使用它们。
也就是说,这里的许多人似乎更喜欢使用现成的视频压缩库的解决方案。 特别是如果您担心流媒体带宽。
如果您不想使用现有的视频库,那么您必须决定要投入多少精力,而不是您希望消耗比其他必要带宽更多的带宽。