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). Они делают много всего одновременно. Вы можете попытаться исследовать их дальше и черпать вдохновение из них, или вы можете выбрать и использовать один.

Это означает, что многие здесь предпочитают использовать легкодоступную библиотеку сжатия видео. Особенно, если вы беспокоитесь о пропускной способности потоковой передачи.

Если вы не хотите использовать существующую библиотеку видео, то вам нужно решить, сколько усилий вы хотите приложить, в сравнении с тем, насколько небрежным вы хотите быть, потребляя большую пропускную способность, чем это необходимо.

Другие вопросы по тегам