C#在套接字上发送屏幕差异的最佳方法

时间:2018-03-05 10:23:02

标签: c# screensharing

我正在开展屏幕共享项目。我只在套接字上发送屏幕差异,比较前一个和实际的缓冲区。它工作

我使用Format16bppRgb555向客户端发送8到9 FPS以减少Bitmap的整体字节大小

byte[] wholescreensize= new byte[1360 * 768 * 2];// Its around 2 Mb
  

我的问题是全屏更改时。

     

我使用以下功能获得大约45-60 kb的PNG图像

     

45kb * 10(FPS)= 450kb

     

可以减少超过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);
}

My Questing是在这种情况下减少字节的最佳方法。

1 个答案:

答案 0 :(得分:2)

视频流基本上就是你正在做的事情;现代视频压缩算法有很多增强功能。也许他们可以跟踪或移动工件,或以其他方式扭曲所述工件作为其功能的一部分。也许他们可以逐步构建流式传输数据,这样静态项最终会获得更多细节(类似于渐进式jpeg图像)。他们同时做很多事情。您可以尝试进一步研究它们,并从中获取灵感,或者您可以选择并使用它们。

这就是说,这里的许多人似乎更喜欢使用现成的视频压缩库的解决方案。特别是如果你担心流媒体带宽。

如果您不想使用现有的视频库,那么您必须决定要投入多少精力,以及您希望消耗更多带宽而不是其他必要的麻烦。