我们可以在同一个进程中托管多个 vnc 服务器(使用 LibVNCServer 库)吗?

Can we host multiple vnc servers (using LibVNCServer library) in the same process?

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;
}