VNC를 들어보신 적이 있으신가요?


VNC에 관해서는 위키백과에 이렇게 나와있군요.

VNC(Virtual Network Computing, 가상 네트워크 컴퓨팅)는 컴퓨터 환경에서 RFB 프로토콜을 이용하여 원격으로 다른 컴퓨터를 제어하는 그래픽 데스크톱 공유 시스템이다. 자판마우스 이벤트를 한 컴퓨터에서 다른 컴퓨터로 전송시켜서 네트워크를 거쳐 그래픽 화면을 갱신하는 방식을 제공한다.

VNC와 RFB는 미국과 다른 국가들에서 RealVNC Ltd.의 등록 상표이다

https://ko.wikipedia.org/wiki/VNC


쉽게 말해서 그냥 원격에서 컴퓨터를 조작하기 위한 수많은 기술중 하나인겁니다.


마이크로소프트는 여기에 대응하는 RDP라는 프로토콜을 만들었고 우리가 익히 아는 TeamViewer나 SplashTop같은 프로그램도 RFB를 변형하거나 자체적으로 프로토콜을 만들어서 서비스합니다.


보통 사람들에겐 VNC아이콘보다 이 아이콘이 더 친숙할지도 모르겠다. 이 아이콘의 정체는 Teamviewer의 아이콘



하지만 Teamviewer든 SplashTop이든 VNC든 RDP든 모두 공통적인 문제가 있는데 바로 반응속도가 더럽게 느리다는 것입니다.


VNC를 써본 사람들은 하나같이 이야기하는 것이 마우스 클릭하고 1초 프로그램 실행되는 것 보는데 1초 실수로 클릭을 하면 딜레이가 걸려서 한참뒤에 반응이 오니 관리하는 것 외에는 영 쓸만한 것이 못 된다고 하더군요.


그게 어쩔 수 없던것이 VNC가 사용하는 RFB프로토콜은 JPG로 캡쳐한뒤에 네크워크로 보내고 이를 다시 화면에 띄우는 옛날 웹캡이 쓰던 MJPEG방식과 거의 흡사한 방식을 사용합니다. 문제는 JPG인코딩이 CPU를 통해서 하기 때문에 그렇게 빠르지 않고 이를 디코딩하는 것도 사실 그렇게 빠르지 않다는 것입니다.


JPG가 빠르지 않다고? 하시는 분들은 DSLR에서 RAW이미지를 JPG로 인코딩할 때 생각보다 저장시간이 걸린다는 것을 생각해주셔야 합니다. (사진쪽 종사자들은 포토샵에서 결과물 뽑아낼 때 생각보다 시간이 걸린다는 것을 알고있지요. 이쪽 종사자들은 JPG로 뽑지 않고 보통 비손실 압축인 PNG로 뽑긴합니다만...) 우리가 흔히 사용하는 모니터가 60Hz인 점을 생각해주세요. 제가 위에서 말한 JPG인코딩-디코딩이 최소 1/60초안에 끝나야 합니다. 사실 요즘 CPU에 640x480정도의 해상도라면 그 정도는 충분히 가능하지만 데스크탑의 해상도가 점점 더 좋아지는 관계로 VNC의 속도는 예나지금이나 큰 차이가 나지를 않습니다. 그래서 TurboVNC라는 libjpeg-turbo를 사용하는 서버와 클라이언트가 나왔지만 서버와 클라이언트 둘 다 TurboVNC를 사용하지 않으면 다른 것이 하나도 없는 상황이 됩니다.


이런 복잡한 상황을 한큐에 해결할 수 있는 물건이 오픈소스로 공개되었으니 그것이 바로 JSMPEG-VNC입니다.

https://github.com/phoboslab/jsmpeg-vnc


어느정도 성능인지는 한번 보시지요.



Mac에서 Windows용 게임을 하고 있습니다. 심지어 클라이언트도 따로 없이 브라우저를 이용합니다.


그럼 jsmpeg는 뭔가 했더니 같은 곳에서 만들어낸 Javascript기반 MPEG동영상 재생 웹소켓입니다. 쉽게말해서 별도의 코덱따윈 갖다버리고 자바스크립트로 직접 MPEG를 디코딩하는 수준에 이른 것이지요. 요즘 브라우저는 asm.js를 위시해서 자바스크립트를 네이티브로 컴파일해서 사용하니까 직접 웹소켓으로 작업이 가능해진 것입니다.


예상도 못한 수준의 물건이 나왔는데요. 크기도 엄청 작은데 수준은 장난이 아닙니다. 서버 실행도 간단한데요.

jsmpeg-vnc.exe "desktop"


이렇게 하면 데스크탑 전체가 실행되며


jsmpeg-vnc.exe -s 크기 "cursor"


이렇게 하면 마우스를 따라 화면이 캡쳐됩니다.


동영상 마지막에보면 스마트폰으로 조작을 하는 모습을 볼 수 있는데 하이브리드 앱형태로 만들거나 웹페이지를 모바일에 맞게 만들어서 사용하면 똑같이 만들어 쓸 수 있습니다. 예전에 제가 소개했던 Liquidsky와 비슷하게 쓸 수 있는 것이지요.


그런데 현재 링크에 걸린 서버프로그램은 오직 Windows만 지원합니다. 하지만 이런 좋은 원격제어 프로그램을 Windows에서만 쓰긴 아깝지요. Linux도 원격제어 수요는 상당히 많기 때문에(보통 SSH와 터미널 작업으로 때우기는 하지만) 이쪽은 없나 살펴봤습니다.


있네요.

https://github.com/thesauri/jsmpeg-vnc-linux


Cusor를 따라가는 기능은 아직 포팅이 되지 않았지만 사실 그건 중요하지 않고 desktop 전체를 캡쳐하는 것은 포팅이 되었다고 합니다.


Windows의 그래픽 API를 X11로 포팅했다고 합니다.


이런 것을 찾아냈으니 한 번 해봐야겠는데요.


....그건 자고 일어나서 주말에 한번 해보지요.


build-essential

libavcodec-dev

libavutil-dev

libx11-dev

zlib1g-dev

libswscale-dev

libwebsockets-dev

libxtst-dev


이 패키지가 필요한 듯 합니다. 해당 프로젝트 관리자가 설명이 좀 부족합니다...


컴파일이 제대로 안 되네요...


일단 메일을 날려봐야겠습니다.


,