c - 我们可以在同一个进程中托管多个 vnc 服务器(使用 LibVNCServer 库)吗?
问题描述
在 LibVNCServer 库中有一个名为 camera.c 的示例,它捕获相机快照并每隔一段时间填充 vnc 服务器使用的帧缓冲区。我的要求是对 mpeg 传输流(许多来源而不是像相机这样的单一来源)做同样的事情。因此,每个传输流需要一个 vnc 服务器。
我在 RFB 协议中读到,我们可以在从 5900 (5900+x) 开始的端口上的同一主机上托管多个 vnc 服务器。但是,最好在同一进程中托管多个 vnc 服务器,这样可以避免 vnc 服务器和生成数据的进程之间不需要的 I/O。
LibVNCServer 是否支持该用例,还是我必须为每个视频流启动一个 vnc 服务器进程?
注意:我浏览了库,看到 rfbScreenInfoPtr 到处循环,不是静态的。但无法断定 LibVNCServer 是否是线程安全的,因为我不熟悉 C。
解决方案
我尝试编写一个具有服务器端缩减能力的 vnc 服务器,它是一个源多流。
int main(int argc, char** argv)
{
...
rfbScreenInfoPtr rfbScreen_1080 = rfbGetScreen(&argc,argv,1920,1080,8,3,bpp);
rfbScreenInfoPtr rfbScreen_720 = rfbGetScreen(&argc,argv,1280,720,8,3,bpp);
rfbScreen_1080->frameBuffer = (char*)_aligned_malloc(1920*1080*bpp,256);
rfbScreen_720->frameBuffer = (char*)_aligned_malloc(1280*720*bpp,256);
rfbScreen_1080->progressiveSliceHeight = 1080/2;
rfbScreen_720->progressiveSliceHeight = 720/2;
rfbScreen_1080->cursor = rfbMakeXCursor(0,0,NULL,NULL);
rfbScreen_720->cursor = rfbMakeXCursor(0,0,NULL,NULL);
rfbScreen_1080->port = 5900;
rfbScreen_720->port = 5901;
rfbScreen_1080->alwaysShared = 1;
rfbScreen_720->alwaysShared = 1;
rfbInitServer(rfbScreen_1080);
rfbInitServer(rfbScreen_720);
int begin = clock();
while(rfbIsActive(rfbScreen_1080) || rfbIsActive(rfbScreen_720))
{
int end = clock();
if(end - begin >= UPDATE_INTERVAL)
{
//printf("%d\n",end-begin);
begin = clock()-(end - begin - UPDATE_INTERVAL);
CaptureScreen(rfbScreen_1080, rfbScreen_720);
rfbMarkRectAsModified(rfbScreen_1080,0,0,1920,1080);
rfbMarkRectAsModified(rfbScreen_720,0,0,1280,720);
}
rfbProcessEvents(rfbScreen_1080,40);
rfbProcessEvents(rfbScreen_720,40);
//Sleep(1);
}
...
}
void CaptureScreen(rfbScreenInfoPtr rfbScreen1, rfbScreenInfoPtr rfbScreen2)
{
//capture screen to bmp, resize and copy data to rfbScreen->frameBuffer;
}