2012-06-05 106 views
1

我试图创建一个视频流,通过捕获和jpeg图像转换成base64字符串,然后发送它使用websockets(Nodejs和socket.io)在HTML5画布上绘图。这是捕获屏幕,并使用SocketIO4Net库发送它在C#代码:通过Web套接字快速发送base64字符串?

Client directSocket = new Client("http://IPHERE"); 
directSocket.Connect(); 

private void timer1_Tick(object sender, EventArgs e) 
{ 
    Rectangle bounds = Screen.GetBounds(Point.Empty); 
    Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height); 

    using (Graphics g = Graphics.FromImage(bitmap)) 
    { 
     g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size); 
    } 

    pictureBox1.Image = bitmap; 

    // Convert the pictureBox into a byte[] array 
    System.IO.MemoryStream stream = new System.IO.MemoryStream(); 
    pictureBox1.Image.Save(stream, System.Drawing.Imaging.ImageFormat.Jpeg); 
    byte[] imageBytes = stream.ToArray(); 

    // Convert byte[] to Base64 string 
    string base64String = Convert.ToBase64String(imageBytes); 

    // Send using SocketIO4Net 
    directSocket.Emit("send", new { message = base64String }); 
} 

这工作正常和base64String发送到发射它的节点服务器。这是客户端JavaScript代码:

var socket = io.connect('IPHERE'); 

socket.on('receive', function (data) { 
    var canvas = document.getElementById('canvas'); 
    var context = canvas.getContext('2d'); 

    var img = new Image(); 
    img.onload = function() { 
     context.drawImage(img, 0, 0, canvas.width, canvas.height); 
    }; 

    img.src = "data:image/jpeg;base64," + data.message.message; 
}); 

我的问题是,base64String大,没有发出足够快的客户接受它,并在画布上显示图像。我不确定它是否是我的节点服务器(这是一个便宜的VPS),或者如果字符串太大。是否可以压缩base64String,然后在收到它时将其发送给解压缩对象?或者有另一种方法可以做到这一点?谢谢您的帮助。

回答

1

您可以尝试将图像保存为质量较低的jpg图像。您可以使用Save覆盖,该覆盖接受编码器和编码器参数。

+0

谢谢。这有效,但我希望保持图像的质量。有没有办法做到这一点,并发送速度? –

+0

你将不得不平衡速度和质量。如果连接速度够快,您可以实施一些措施来计算是否从服务器获得足够的FPS,然后提高质量。 –

+0

非常有用!今天要试试这个! –

0

如果您只需要支持现代浏览器,请使用画布元素并通过原始字节发送该数据。使用ImageData对象将数据推送到canvas元素。

有关如何创建ImageData对象的更多信息,请参阅MDN文章"Pixel manipulation with canvas"

0

lyesterday我用c#测试它 - base64 - websocket - 连接到gwt(java脚本)img对象。我在内联网中使用它,流的性能很好。但是如果你测试它,你会在Firefox中看到内存泄漏。因为Firefox缓存所有图像。在我的情况下每秒10张图片。一张图片200kb。 这个弱我测试画布部分。

相关问题