代码之家  ›  专栏  ›  技术社区  ›  sdaau

Linux:通过网络的屏幕桌面视频捕获和VNC帧速率

  •  30
  • sdaau  · 技术社区  · 15 年前

    不好意思看到这一排文字-tl;dr:

    • VNC连接的帧速率是多少(以帧/秒为单位),或者更确切地说,是谁决定的:客户机还是服务器?
    • 对于桌面屏幕捕获有任何其他建议-但是“正确的时间编码”/使用不合适的帧速率(具有稳定的时间段);并且有可能获得未压缩(或无损)图像序列?

    简单地说,我遇到了一个典型的问题:我有时会开发硬件,并想录制一段视频 二者都 在PC上输入的命令(“桌面捕获”), 硬件响应(“实时视频”)。在我了解具体细节之前,下面是一大块介绍。

    介绍/语境

    目前我的策略是用摄像机记录硬件测试过程。( 作为“直播”视频 )-同时进行桌面捕获。摄像机产生一个29.97(30)fps的mpeg-2.avi视频;我想以与视频相同的帧速率获得一个PNG图像序列的桌面捕获。那么,我的想法是:如果两个视频的帧速率相同,那么我可以简单地

    • 将桌面捕获的开始时间与“实时”视频中的匹配点对齐
    • 建立一个 picture-in-picture ,桌面截图的缩小版本-作为覆盖-放在“实时”视频的顶部
      • (其中“实时”视频屏幕的一部分用作带有“桌面捕获”覆盖的视觉同步源)
    • 导出“最终”组合视频,适当压缩以用于Internet

    原则上,我想人们可以使用命令行工具,比如 ffmpeg 对于这个过程,我更喜欢使用一个GUI来查找两个视频的对齐起点。

    最后,我还想实现的是,在导出“最终”视频时保持最高质量:“实时”视频在相机外时已经被压缩,这意味着当它通过theora.ogv编解码器时会进一步降级-这就是为什么我要保留原始视频,并使用类似命令行的命令来生成如果需要不同的压缩/分辨率,请重新编写“最终”视频。这也是我喜欢将“桌面捕获”视频作为PNG序列的原因(尽管我猜任何未压缩的格式都可以做到):我采取措施“调整”桌面,因此没有太多的渐变,无损编码(即PNG)将是合适的。

    桌面捕获选项

    嗯,在Ubuntu Lucid下,这个过程中有很多问题,我目前使用的是Ubuntu Lucid。( 你可以读到我的一些痛苦 10.04: Video overlay/composite editing with Theora ogv - Ubuntu Forums )然而,其中一个关键问题是假设,两个传入视频的帧速率是相等的-实际上,通常桌面捕获的帧速率较低;更糟糕的是,通常帧是 不同步 .

    因此,这就需要坐在视频编辑器前,手动剪切和编辑帧级不到一秒钟的剪辑,这就需要 小时 工作的最后是什么A 5 分钟 视频。另一方面,如果两个视频(“直播”和“拍摄”)。 具有相同的帧速率和同步:原则上,在视频编辑器中查找开始同步点不需要超过几分钟,而“合并”视频处理的其余部分可以通过单个命令行进行处理。这就是为什么在这篇文章中,我想把重点放在 桌面捕捉 部分。

    据我所知,只有少数 可行的 (而不是 5 Ways to Screencast Your Linux Desktop )Linux/Ubuntu中桌面捕获的备选方案(注意,我通常使用笔记本电脑作为桌面捕获的目标):

    1. 让您的目标PC(笔记本电脑)在其vga输出上克隆桌面;使用vga组合或vga-to-s-video硬件从vga获取视频信号;使用另一台PC上的视频捕获卡获取视频
    2. 使用 recordMyDesktop 在目标PC上
    3. 建立一个 VNC server ( vi no 关于Ubuntu;或 vncserver )在要捕获的目标PC上;使用VNC捕获软件(例如 vncrec )在另一台PC上获取/记录VNC流( 然后可以转换成视频 )
    4. 使用 FFMPEG x11grab
    5. DMA

    recordMyDesktop

    No xorg.conf (is) found in /etc/X11 (Ubuntu 10.04) sudo Xorg -configure

    compiz doesn't get saved

    /tmp/rMD-session-7247

    setup Samba gvfs

    recordmydesktop --workdir /home/user/.gvfs/test\ on\ 192.168.1.100/capture/ --no-sound --quick-subsampling --fps 30 --overwrite -o capture.ogv 
    

    capture.ogv

    recordmydesktop --rescue /home/user/.gvfs/test\ on\ 192.168.1.100/capture/rMD-session-7247/
    

    --on-the-fly-encoding

    --fps N

    recordmydesktop --fps 25
    ...
    Saved 2983 frames in a total of 6023 requests
    ...
    

    video playback is too fast

    vncrec vino vino configuration

    vncrec-twibright/README vncrec/sockets.c

    void print_movie_frames_up_to_time(struct timeval tv)
    {
      static double framerate;
      ....
      memcpy(out, bufoutptr, buffered);
      if (appData.record)
        {
          writeLogHeader (); /* Writes the timestamp */
          fwrite (bufoutptr, 1, buffered, vncLog);
        }
    

    vncrec/sockets.c writeLogHeader gettimeofday

    wired network connection is broken

    VNCast MultiVNC

    netcat

    # 'target'
    ffmpeg -f x11grab -b 8000k -r 30 -s 800x600 -i :0.0 -f rawvideo - | nc 192.168.1.100 5678
    # 'recorder'
    nc -l 0.0.0.0 5678 > raw.video  #
    

    ffplay

    # 'target'
    ffmpeg -f x11grab -b 500k -r 30 -s 800x600 -i :0.0 -f yuv4mpegpipe -pix_fmt yuv444p - | nc 192.168.1.100 5678
    # 'recorder'
    nc -l 0.0.0.0 5678 | ffmpeg -i - /path/to/samplimg%03d.png
    

    yuv4mpegpipe



    1. Experiences Producing a Screencast on Linux for CryptoTE - idlebox.net
    2. The VideoLAN Forums • View topic - VNC Client input support (like screen://)
    3. VNCServer throttles user inpt for slow client - Kyprianou, Mark - com.realvnc.vnc-list - MarkMail
    4. Linux FAQ - X Windows: How do I Display and Control a Remote Desktop using VNC
    5. How much bandwidth does VNC require? RealVNC - Frequently asked questions
    6. x11vnc: a VNC server for real X displays
    7. HowtoRecordVNC (an X11 session) - Debian Wiki
    8. Alternative To gtk-RecordMyDesktop in Ubuntu
    9. (Ffmpeg-user) How do I use pipes in ffmpeg
    10. (ffmpeg-devel) (PATCH) Fix segfault in x11grab when drawing Cursor on Xservers that don't support the XFixes extension
    1 回复  |  直到 10 年前
        1
  •  16
  •   kanaka    10 年前