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



我正在从事屏幕共享项目。我只通过套接字发送屏幕差异,比较以前的缓冲区和实际缓冲区。它工作

我使用 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 图像(。 他们同时做很多事情。 您可以尝试进一步研究它们,并从中获取灵感,或者您可以选择并使用它们。

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

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

相关内容

  • 没有找到相关文章

最新更新