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

对不起,文字墙-TL;博士:

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

简单地说,我面临一个典型的问题:我有时开发硬件,并希望录制一段视频,其中既显示在PC上输入的命令(“桌面捕获”),也显示硬件的响应(“实时视频”)。在我谈到具体细节之前,下面是一段介绍。
&nbsp
&nbsp

简介/背景

目前,我的策略是使用摄像机记录硬件测试过程(作为“实时”视频)),同时进行桌面捕获。摄像机产生29.97(30)FPS的MPEG-2.AVI视频;我想以与视频相同的帧速率将桌面捕获作为PNG的图像序列。这样的想法是:如果两个视频的帧速率相同;那我就可以

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

原则上,我想我们可以使用像ffmpeg这样的命令行工具来完成这个过程;但是,我更愿意使用GUI来查找两个视频的对齐起点

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

桌面捕获选项

在我目前使用的UbuntuLucid下,这个过程有很多麻烦(,你可以在10.04:Theora ogv-UbuntuForums视频叠加/复合编辑中阅读我的一些痛苦经历)。然而,关键问题之一是假设两个传入视频的帧速率相等——实际上,通常桌面捕获的帧速率较低;更糟糕的是,帧通常是不同步的

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

据我所知,在Linux/Ubuntu中,只有少数几种可行的桌面捕获方法(与5种屏幕播放Linux桌面的方法相反)(注意,我通常使用笔记本电脑作为桌面捕获的目标):

  1. 让您的目标PC(笔记本电脑)在其VGA输出上克隆桌面;使用VGA-to-composite或VGA-to-S-video硬件从VGA获取视频信号;使用不同PC上的视频捕获卡捕获视频
  2. 在目标PC上使用recordMyDesktop
  3. 在要捕获的目标PC上设置VNC服务器(Ubuntu上的vino;或vncserver);在不同的PC上使用VNC捕获软件(如vncrec)捕获/记录VNC流(,随后可转换为视频)
  4. ffmpegx11grab选项一起使用
  5. *(在目标PC上使用某种工具,直接将桌面图像帧从图形卡帧缓冲存储器DMA传输到网络适配器存储器

请注意,上述方法的有用性受到我的使用环境的限制:我想要捕获的目标PC通常运行软件(使用经过测试的硬件),可以在海量数据中移动;关于描述这样一个系统,你能说的最好的话就是“几乎不稳定”:(我猜这与玩家在想要获得一个要求很高的游戏的视频捕获时所面临的问题类似。一旦我开始使用类似于recordMyDesktop的东西,它也会占用大量资源,并希望在本地硬盘上进行捕获,我马上就会遇到严重的内核崩溃(通常不会生成vmcore)

因此,在我的上下文中,我通常会假设有一台第二台计算机参与运行“目标”PC桌面的捕获和录制。除此之外,到目前为止,我可以看到上述选项的利弊,如下所示

(桌面准备)

对于下面讨论的所有方法,我倾向于提前“准备”桌面:

  • 删除桌面背景和图标
  • 通过系统/首选项/监视器将分辨率设置为800×600(gnome桌面属性
  • 将颜色深度更改为16 bpp(使用根“的xdpyinfo | grep”进行检查)

。。。为了最小化桌面捕获软件的负载。注意,在Ubuntu上更改颜色深度需要更改xorg.conf;但是,“在/etc/X11(Ubuntu 10.04)中找不到xorg.conf”,因此您可能需要首先运行sudoxorg-configure

为了降低图形资源使用率,我通常会禁用compiz——或者更确切地说,我会将“系统/首选项/外观/视觉效果”设置为“无”。但是,在我尝试通过将“视觉效果”设置为“正常”(未保存的)来启用compiz)后,我可以注意到LCD屏幕上的窗口重新绘制的速度要快得多;所以我把它保持这样,也是为了桌面捕获。我觉得这有点奇怪:更多的效果怎么会导致更快的屏幕刷新?它看起来不像是由于一个专有的驱动程序(该卡是“英特尔公司N10系列集成图形控制器””,Ubuntu在切换到compiz)时没有提供任何专有的驱动程序选项-尽管,可能是所有的模糊和效果都欺骗了我的眼睛:)

克隆VGA

嗯,这是最昂贵的选择(因为它不仅需要额外购买一个,还需要购买两个硬件:VGA转换器和视频采集卡);并且主要适用于笔记本电脑(既有屏幕,又有额外的VGA输出——对于台式电脑,可能还需要购买额外的图形卡或VGA克隆硬件)

但是,它也是不需要目标PC的任何附加软件的唯一选项(因此使用目标CPU的0%处理能力),也是唯一一个可以提供30 fps的真实、未校准帧率的视频的选项(因为它是由单独的硬件执行的——尽管假设单个硬件之间存在的时钟域失调可以忽略不计)

事实上,由于我已经拥有了像采集卡这样的东西,我已经投资了一个VGA转换器,希望它最终能让我制作出最终的“合并”只需5分钟寻找对齐点和一条命令行的视频;但我还不知道这个过程是否能按预期工作。我还想知道,在800x600,30 fps的速度下,将桌面捕获为未压缩视频的可能性有多大

recordMyDesktop

好吧,如果您在没有任何参数的情况下运行recordMyDesktop,它首先从捕获开始(看起来像什么)原始图像数据,如/tmp/rMD-session-7247文件夹中;当您按Ctrl-C中断后,它会将此原始图像数据编码为.ogv。显然,在与我的测试软件相同的硬盘上获取大图像数据(也移动大量数据)通常是导致instacrash的原因:)

因此,我试图做的是设置Samba在网络上共享一个驱动器;然后在目标PC上,我将连接到此驱动器,并指示recordMyDesktop使用此网络驱动器(通过gvfs)作为其临时文件位置:

recordmydesktop--workdir/home/user/.gvfs/test\on\192.168.1.100/capture/--无声音--快速子采样--fps 30--覆盖--o capture.ogv

请注意,虽然此命令将使用临时文件的网络位置(从而使recordMyDesktop可以与我的软件并行运行)-但只要按Ctrl-C,它将开始编码并直接在目标的本地硬盘上保存capture.ogv(不过,在那一点上,我真的不在乎:))

我对recordMyDesktop的第一个困扰是,你不能指示它保留临时文件,也不能避免对它们进行编码:你可以使用Ctrl+Alt+p暂停,或者在第一个文件之后快速点击Ctrl-C,使其崩溃;然后会留下临时文件(如果第二次没有足够快地按Ctrl-C,程序将“清理缓存…”)。然后你可以跑,比如说:

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

。。。以转换原始临时数据。然而,莫

发表评论