- 1fps.video là công cụ chia sẻ màn hình dựa trên liên kết, khởi chạy ngay bằng một binary duy nhất, phù hợp cho kiểu cộng tác cần xem màn hình hơn là họp, như lập trình viên, đội IT và chuyên gia bảo mật
- Dựa trên giả định rằng FPS thấp thường là đủ cho cộng tác lập trình, công cụ này giảm mức sử dụng CPU, bộ nhớ và mạng, đồng thời giảm tải cho laptop cũ
- Màn hình được chia sẻ ở 1 FPS, nhưng nhờ theo dõi con trỏ dựa trên WebSocket, chuyển động con trỏ được hiển thị gần như 30 FPS, bổ trợ cho các phần trình diễn cần độ chính xác
- Cung cấp mã hóa đầu cuối, trong đó khóa được tạo ở phía client nằm sau dấu
#trong URL và không được gửi đến backend - Tập trung vào các phiên dài và chia sẻ lưu lượng thấp thông qua hỗ trợ nhiều màn hình, điều chỉnh chất lượng ảnh/kích thước capture, và bỏ qua việc gửi màn hình khi không có thay đổi
Cách chia sẻ màn hình 1 FPS
- 1fps.video là công cụ giúp bắt đầu chia sẻ màn hình nhanh chóng; có thể tải binary tại Download
- Đối tượng chính là lập trình viên, đội IT, chuyên gia bảo mật và người dùng thích cộng tác không họp
- Chia sẻ màn hình FPS thấp dựa trên giả định rằng nó thường đủ cho hầu hết công việc cộng tác, đặc biệt với lập trình viên dành nhiều thời gian để viết code
- Cách này tập trung vào việc giảm tài nguyên và lưu lượng
- Không cần âm thanh, thúc đẩy văn hóa không họp
- Giảm đáng kể mức sử dụng CPU, bộ nhớ và mạng
- Laptop cũ cũng có thể hoạt động tốt hơn trong khi chia sẻ màn hình
- Thân thiện với môi trường hơn nhờ mức sử dụng tài nguyên thấp
- Môi trường chia sẻ có thể được điều chỉnh theo điều kiện mạng
- Hỗ trợ chia sẻ nhiều màn hình
- Có thể điều chỉnh chất lượng ảnh để tối ưu hóa lưu lượng sử dụng
- Trên màn hình lớn, có thể điều chỉnh kích thước capture màn hình để giảm thêm lưu lượng
- Sử dụng so sánh màn hình thông minh để tránh truyền dữ liệu không cần thiết khi màn hình không thay đổi
Bảo mật, quyền riêng tư và mô hình chia sẻ
- Công cụ này cho rằng 1 FPS là đủ cho hầu hết công việc coding và phát triển, còn chuyển động con trỏ được cung cấp gần như 30 FPS nhờ theo dõi dựa trên WebSocket
- Phù hợp với người dùng hướng nội và người làm việc từ xa muốn chỉ chia sẻ màn hình mà không cần cuộc gọi âm thanh hay video
- Có thể dùng cùng các ứng dụng chat nhóm hiện có, và các tùy chọn nhiều màn hình, chất lượng ảnh, kích thước màn hình giúp điều chỉnh trải nghiệm chia sẻ theo tình trạng mạng
- Cấu trúc quyền riêng tư và bảo mật dựa trên liên kết và quản lý khóa phía client
- Toàn bộ dữ liệu được mã hóa đầu cuối
- Khóa mã hóa được tạo ở phía client và không được gửi lên server
- Khóa được đưa vào sau dấu
#trong URL nên không được chuyển đến backend - Chỉ những người có liên kết đầy đủ mới có thể truy cập màn hình được chia sẻ
- Tối thiểu hóa truyền dữ liệu bằng so sánh màn hình để tăng cường quyền riêng tư
- Hiện đang thực hiện mã hóa tọa độ con trỏ
- Mã nguồn được cung cấp tại Source Code
1 bình luận
Ý kiến trên Hacker News
Làm tốt khi công bố dự án. Ý tưởng rất hay và tối giản đến đáng ngạc nhiên, nhưng nhìn vào mã nguồn thì thấy một số lỗi về mật mã học, nên không nên dùng trong các tình huống mà mã hóa là phần cốt lõi
[0]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L99
[1]: https://github.com/1fpsvideo/1fps/blob/main/1fps.go#L287
[2]: https://eprint.iacr.org/2016/475.pdf
[3]: https://soatok.blog/2020/05/13/why-aes-gcm-sucks/
Trong trường hợp này, tôi tò mò lý do chính để không chỉ bảo sửa vấn đề nonce là do các cạm bẫy khi triển khai, hay nó còn liên quan tinh tế hơn đến những vấn đề chung được nêu trong các bài viết trên
Nhìn một cách ngây thơ thì AES-GCM được dùng ở nhiều nơi như TLS hay SRTP, nên người không rành mật mã học có thể nghĩ đây là lựa chọn tốt
Nhìn mã thì có vẻ nó chụp ảnh màn hình (.jpg) mỗi giây rồi gửi đi. Tôi tò mò liệu cách này có thực sự tiết kiệm băng thông hơn nén video hiện đại vốn tái sử dụng thông tin từ khung hình trước không
Tôi đã ghi một video 1 phút cảnh chỉnh sửa mã trong VS Code ở 1440p 10fps, mã hóa AV1, và nó có kích thước chỉ khoảng một nửa so với 60 ảnh chụp màn hình JPEG của cùng màn hình đó. Nếu có số liệu thử nghiệm thì tôi rất muốn xem
Ảnh chụp màn hình chiếm khá nhiều dung lượng đĩa, và khi thấy giữa các ảnh gần như không có gì thay đổi, tôi nghĩ ra một thuật toán chỉ lưu phần khác biệt so với ảnh sau. Vài phút sau tôi nhận ra mình đang phát minh lại nén video
Vì vậy tôi dùng ffmpeg để đổi chuỗi ảnh thành mp4, và kích thước tệp giảm khoảng 95%. Tôi dùng ImageMagick để nhúng tên tệp timestamp vào ảnh, nên về cơ bản có lẽ đã tái tạo chức năng của TimeSnapper Classic chỉ bằng 2 lệnh
Một bên là mức dùng CPU, bên kia là mạng. Theo tôi, mạng thì rẻ còn mã hóa video thì đắt. Tôi không có bằng chứng, chỉ có thử nghiệm cục bộ, nhưng bắt đầu đo đạc thật sự là ý tưởng rất hay
Cũng có ý tưởng khác là quét màn hình và chỉ gửi những phần đã thay đổi. Chỉ cần gửi một nửa màn hình thì về mặt mạng có lẽ đã có thể thắng mã hóa video. Tuy nhiên thuật toán diff phải rất nhanh. 1280x720 là 914400 pixel, mỗi pixel 4 byte thì phải xử lý 3,49MB thông tin mỗi giây
Tôi cũng tò mò hiệu quả mã hóa video và chi phí tạo 60 ảnh JPEG. Hai thứ đó có tương đương nhau không?
Nếu muốn thì làm cả hai chắc cũng dễ, nhưng tôi không rõ có đáng chịu thêm phiền phức không. Tôi đồng ý rằng nếu mở rộng quy mô trên cùng một IP thì cách này có thể trở nên quá tải
Thích
Quy trình làm việc của chúng tôi được thiết kế theo hướng loại bỏ nhu cầu về văn phòng và hạ tầng kỹ thuật. Chúng tôi stream theo thời gian thực timeline output, tức kết quả dựng video, và có kênh liên lạc mở. Phần lớn thành viên trong nhóm khá hướng nội nên dùng kiểu push-to-talk, và nếu không cần thảo luận toàn nhóm thì thường chỉ để lại ghi chú trong chat
Những giải pháp thô sơ đôi khi lại dễ được chấp nhận hơn
Use case của chia sẻ màn hình không có audio là gì? Tôi không chắc khi nào nó hữu ích. Dù sao thì chẳng phải vẫn phải giao tiếp với đối phương theo cách nào đó sao?
Trong các cuộc họp dài, đôi khi vẫn cần chia sẻ màn hình liên tục. Có lúc tôi muốn code hơn là ngồi nghe cuộc họp 1–2 tiếng
Và nó cũng hợp với những người không thích audio như tôi. Tôi có nhiều sinh viên muốn giúp, nhưng không muốn phải kèm cả audio. Voice chat của tôi không phải là tài nguyên dễ song song hóa
Nó có vẻ giống chat bằng văn bản kèm gửi screenshot hơn là “chia sẻ màn hình trong cuộc gọi thoại”. Tôi hiểu vì sao có người thích như vậy
Về đoạn “mệt mỏi với chia sẻ màn hình vì Google Meet giới hạn 1 giờ, Zoom giới hạn 40 phút”, jitsi[0] là một lựa chọn họp video mã nguồn mở[1] dựa trên WebRTC. Nó khá đầy đủ tính năng để thay thế những thứ như Zoom, Google Meet, Slack
Có thể dùng trên trang chính, hoặc tự host nếu muốn
[0]: https://meet.jit.si/
[1]: https://github.com/jitsi
[1] https://github.com/strukturag/nextcloud-spreed-signaling
Sẽ thú vị nếu xây dựng một heuristic để chọn frame nào sẽ dùng. Việc luôn chọn bừa frame mới nhất nhiều khả năng không phải tối ưu; có thể tốt hơn nếu chọn frame ít chuyển động, không có animation đang chạy, hoặc có các chỉ số tương tự
Nếu muốn cầu kỳ hơn, có thể phân tích theo từng cửa sổ rồi tạo một dạng tổng hợp cho toàn bộ frame
Ý tưởng hay, và tôi nghe nói trong cờ vua có khái niệm tương tự gọi là quiescence search[1], nhưng có lẽ không đáng công
[0] https://old.reddit.com/r/Android/comments/11nzrb0/samsung_sp...
[1] https://en.wikipedia.org/wiki/Quiescence_search
Dù vậy nghe vẫn là một ý tưởng tuyệt vời và một bài toán thú vị
Gặp lỗi biên dịch ở
github.com/go-vgo/robotgobáo thiếuX11/extensions/XTest.hhttps://github.com/go-vgo/robotgo?tab=readme-ov-file#require...
Có một điều kiện tiên quyết không được ghi trên trang. Trên Mint 22, tôi phải cài gói libxtst-dev
robotgocó vài vấn đề trên Windows nên hiện tôi đang xem xét một số phầnHôm nay tôi đang tìm đúng thứ như thế này. Tôi đang monitor từ xa một sự kiện thử nghiệm vật lý, mà để Google Meet đang ghi hình mở suốt thì rất lộn xộn, nhưng vẫn cần text chat cho giao diện
Trông như một giao diện tối giản rất tốt. Nếu có hứng, có thể tôi sẽ thử gắn thêm dạng persistence nào đó cho chat
Ngoài ra, có thể hiểu rằng phần văn bản hoặc âm thanh đồng bộ sẽ được thực hiện ở nơi khác, như gọi điện thoại hoặc mô tả bằng text trên Slack không?
Với nhu cầu của tôi, Moonlight Game Streaming gần như đã thay thế VNC. Chỉ cần các tính năng như truyền file, chia sẻ clipboard tốt hơn nữa là được
Có vấn đề với việc theo dõi con trỏ. Không rõ có phải vì tôi dùng nhiều màn hình không
Trong ảnh này, vòng tròn mới là vị trí con trỏ thực tế https://i.imgur.com/TvzskjS.png