首页 > 解决方案 > 我们可以在同一个进程中托管多个 vnc 服务器(使用 LibVNCServer 库)吗?

问题描述

在 LibVNCServer 库中有一个名为 camera.c 的示例,它捕获相机快照并每隔一段时间填充 vnc 服务器使用的帧缓冲区。我的要求是对 mpeg 传输流(许多来源而不是像相机这样的单一来源)做同样的事情。因此,每个传输流需要一个 vnc 服务器。

我在 RFB 协议中读到,我们可以在从 5900 (5900+x) 开始的端口上的同一主机上托管多个 vnc 服务器。但是,最好在同一进程中托管多个 vnc 服务器,这样可以避免 vnc 服务器和生成数据的进程之间不需要的 I/O。

LibVNCServer 是否支持该用例,还是我必须为每个视频流启动一个 vnc 服务器进程?

注意:我浏览了库,看到 rfbScreenInfoPtr 到处循环,不是静态的。但无法断定 LibVNCServer 是否是线程安全的,因为我不熟悉 C。

标签: cvnc-serverrfb-protocol

解决方案


我尝试编写一个具有服务器端缩减能力的 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;
}

推荐阅读