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

时间:2018-06-20 05:10:50

标签: c vnc-server rfb-protocol

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

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

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

注意:我浏览了该库,发现rfbScreenInfoPtr在各处流通并且不是静态的。但是由于我不熟悉C语言,因此无法得出LibVNCServer是否是线程安全的结论。

1 个答案:

答案 0 :(得分:2)

我试图编写具有服务器端向下缩放功能的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;
}