【问题标题】:Can we host multiple vnc servers (using LibVNCServer library) in the same process?我们可以在同一个进程中托管多个 vnc 服务器(使用 LibVNCServer 库)吗?
【发布时间】:2018-11-29 03:19:35
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c vnc-server rfb-protocol


    【解决方案1】:

    我尝试写一个vnc服务器,具有server-side-downscale能力,它是一个源多流。

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

    【讨论】:

    • 感谢您的回复!如果这有效,它解决了我的问题。我会尽力告诉你。
    猜你喜欢
    • 2013-03-17
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2017-06-15
    • 2015-04-09
    相关资源
    最近更新 更多