我正在开展屏幕共享项目。我只在套接字上发送屏幕差异,比较前一个和实际的缓冲区。它工作
我使用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是在这种情况下减少字节的最佳方法。
答案 0 :(得分:2)
视频流基本上就是你正在做的事情;现代视频压缩算法有很多增强功能。也许他们可以跟踪或移动工件,或以其他方式扭曲所述工件作为其功能的一部分。也许他们可以逐步构建流式传输数据,这样静态项最终会获得更多细节(类似于渐进式jpeg图像)。他们同时做很多事情。您可以尝试进一步研究它们,并从中获取灵感,或者您可以选择并使用它们。
这就是说,这里的许多人似乎更喜欢使用现成的视频压缩库的解决方案。特别是如果你担心流媒体带宽。
如果您不想使用现有的视频库,那么您必须决定要投入多少精力,以及您希望消耗更多带宽而不是其他必要的麻烦。