fix: 压缩RDP实时画面传输
- 将原始RGBA位图压缩为PNG后通过WebSocket发送 - 降低低带宽代理链路下的RDP首帧延迟 - 增加位图压缩与异常数据测试
This commit is contained in:
1 parent
699560a270
commit
7a1680884d
3 files changed
+115
-1
No files matched your search
@@ -0,0 +1,48 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/base64"
|
||||
"fmt"
|
||||
"image"
|
||||
"image/png"
|
||||
|
||||
rdpengine "ezops/pkg/rdp"
|
||||
|
||||
"github.com/gorilla/websocket"
|
||||
)
|
||||
|
||||
// encodeRDPBitmapPNG 将实时 RGBA 脏矩形压缩为 PNG,避免原始整帧占满低带宽 WebSocket。 // Logan.Li
|
||||
func encodeRDPBitmapPNG(frame rdpengine.ServerFrame) (rdpengine.ServerFrame, error) {
|
||||
if frame.Type != "bitmap" || len(frame.RGBA) == 0 {
|
||||
return frame, nil
|
||||
}
|
||||
if frame.Width <= 0 || frame.Height <= 0 {
|
||||
return rdpengine.ServerFrame{}, fmt.Errorf("RDP 位图尺寸无效: %dx%d", frame.Width, frame.Height)
|
||||
}
|
||||
required := frame.Width * frame.Height * 4
|
||||
if len(frame.RGBA) < required {
|
||||
return rdpengine.ServerFrame{}, fmt.Errorf("RDP 位图数据不足: got=%d want=%d", len(frame.RGBA), required)
|
||||
}
|
||||
|
||||
img := image.NewRGBA(image.Rect(0, 0, frame.Width, frame.Height))
|
||||
copy(img.Pix, frame.RGBA[:required])
|
||||
var buf bytes.Buffer
|
||||
encoder := png.Encoder{CompressionLevel: png.BestSpeed}
|
||||
if err := encoder.Encode(&buf, img); err != nil {
|
||||
return rdpengine.ServerFrame{}, fmt.Errorf("压缩 RDP 位图失败: %w", err)
|
||||
}
|
||||
|
||||
frame.Image = "data:image/png;base64," + base64.StdEncoding.EncodeToString(buf.Bytes())
|
||||
frame.RGBA = nil
|
||||
return frame, nil
|
||||
}
|
||||
|
||||
// writeCompressedRDPBitmap 发送浏览器已支持的 JSON PNG 帧,兼容现有前端绘制逻辑。 // Logan.Li
|
||||
func writeCompressedRDPBitmap(conn *websocket.Conn, frame rdpengine.ServerFrame) error {
|
||||
encoded, err := encodeRDPBitmapPNG(frame)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return conn.WriteJSON(encoded)
|
||||
}
|
||||
Reference in new issue
Block a user