Я создаю видеопоток MJPEG в основном приложении dotnet.Который я чем могу просмотреть из хрома.Я получил следующую настройку:
Я получаю растровые изображения как необработанные данные с IntPtr
, который я затем оборачиваю в объект Bitmap
, используя следующий код:
private void UpdateBitmap(IntPtr memoryPointer, int height, int width, int v)
{
if (this.currentImage == null)
this.currentImage = new Bitmap(width, height, width * v, PixelFormat.Format24bppRgb, memoryPointer);
var data = this.currentImage.LockBits(new Rectangle(0, 0, this.currentImage.Width, this.currentImage.Height), ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
CopyMemory(data.Scan0, memoryPointer, (uint) (data.Height * data.Stride));
this.currentImage.UnlockBits(data);
}
[DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
public static extern void CopyMemory(IntPtr destination, IntPtr source, uint length);
После созданияраспакованный растрв Chrome я могу просматривать живое изображение, как и ожидалось.Но у меня задержка составляет около 300 мс (сервер и клиент находятся на одной машине).
Я измеряю время, необходимое для обработки изображения, из события низкого уровня, которое передает мне точку памяти на Flush
вызов моего PushStreamResult
, это занимает около 12 мс.
Если я вставлю изображение в элемент управления WinForms, такой задержки не будет, что означает, что сама камера не вызывает задержку.
Как можно уменьшить задержку живого изображениядо 50 мс?Подход, использующий PushStreamResult, способен решить эту проблему?