C# Лучший подход для отправки разницы экрана через сокет
Я работаю над проектом совместного использования экрана. Я посылаю только различия экрана по сравнению с сокетом, сравнивающим предыдущий и фактический буфер. Это работает
Я отправляю клиенту 8-9 FPS, используя Format16bppRgb555
уменьшить общий размер в байтах
byte[] wholescreensize= new byte[1360 * 768 * 2];// Its around 2 Mb
Моя проблема в том, когда полный экран меняется.
Я получаю около 45-60 Кб изображения PNG, используя функцию ниже
45 КБ * 10 (FPS) = 450 КБ
Можно уменьшить за 45 кб.
Я не заинтересован в снижении 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);
}
Мой квестинг - это лучший подход для уменьшения байтов в таком сценарии.
1 ответ
Потоковое видео по сути то, что вы делаете; и современные алгоритмы сжатия видео имеют множество улучшений. Возможно, они могут отслеживать или перемещать артефакт, или иным образом искажать указанный артефакт как часть их функциональности. Возможно, они могут передавать данные в прогрессивном режиме, так что статические элементы в конечном итоге приобретают больше деталей (аналогично прогрессивным изображениям в формате JPEG). Они делают много всего одновременно. Вы можете попытаться исследовать их дальше и черпать вдохновение из них, или вы можете выбрать и использовать один.
Это означает, что многие здесь предпочитают использовать легкодоступную библиотеку сжатия видео. Особенно, если вы беспокоитесь о пропускной способности потоковой передачи.
Если вы не хотите использовать существующую библиотеку видео, то вам нужно решить, сколько усилий вы хотите приложить, в сравнении с тем, насколько небрежным вы хотите быть, потребляя большую пропускную способность, чем это необходимо.