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

2024-05-07

抱歉,文字墙很长 - TL;DR:

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

简而言之 - 我面临一个典型的问题:我有时开发硬件,并想录制一个视频来显示both在 PC 上输入的命令(“桌面捕获”),and硬件的响应(“实时视频”)。在介绍具体细节之前,先进行一段介绍。
 

简介/背景

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

  • 将桌面捕获的开始时间与“实时”视频中的匹配点对齐
  • Set up a picture-in-picture http://en.wikipedia.org/wiki/Picture-in-picture, where a scaled down version of the desktop capture is put - as overlay - on top of the 'live' video
    • (其中“实时”视频上的屏幕部分用作与“桌面捕获”覆盖层的视觉同步源)
  • 导出“最终”组合视频,并针对互联网进行适当压缩

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

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

桌面捕捉选项

嗯,这个过程在我目前使用的Ubuntu Lucid下有很多麻烦(你可以阅读我的一些磨难10.04:使用 Theora ogv 进行视频叠加/合成编辑 - Ubuntu 论坛 http://ubuntuforums.org/showthread.php?t=1541822)。然而,关键问题之一是假设两个传入视频的帧速率相等 - 实际上,通常桌面捕获的帧速率较低;更糟糕的是,很多时候框架是不同步.

那么,这需要坐在视频编辑器前,在帧级别手动剪切和编辑不到一秒的剪辑 - 需要hours最终的工作量为 5minute视频。另一方面,如果两个视频(“实时”和“捕获”)did具有相同的帧速率和同步:原则上,您不需要超过几分钟的时间来在视频编辑器中查找开始同步点 - 并且“合并”视频处理的其余部分可以通过单个命令行来处理。这就是为什么在这篇文章中,我想重点关注桌面捕捉 part.

据我所知,只有少数viable(相对于截屏 Linux 桌面的 5 种方法 http://www.linuxhaxor.net/?p=815) Linux / Ubuntu 中桌面捕获的替代方案(注意,我通常使用笔记本电脑作为桌面捕获的目标):

  1. 让您的目标 PC(笔记本电脑)在其 VGA 输出上克隆桌面;使用 VGA 转复合或 VGA 转 S 视频硬件从 VGA 获取视频信号;在另一台电脑上使用视频采集卡来抓取视频
  2. Use 记录我的桌面 http://recordmydesktop.sourceforge.net/about.php在目标电脑上
  3. 设置一个VNC服务器 http://bobpeers.com/linux/vnc (vi https://help.ubuntu.com/community/VNC/Servers#vinono http://www.debianadmin.com/remote-desktop-sharing-in-ubuntu.html在Ubuntu上;或者虚拟网络服务器 http://www.realvnc.com/products/free/4.1/man/vncserver.html) 在要捕获的目标 PC 上;使用VNC抓包软件(如vncrec https://wiki.ubuntu.com/ScreenCasts/VNCREC#twibright%20version)在另一台 PC 上抓取/记录 VNC 流(随后可以将其转换为视频).
  4. Use ffmpeg with x11grab option
  5. *(在目标电脑上使用一些工具,这会做DMA http://en.wikipedia.org/wiki/Direct_memory_access直接传输桌面图像帧 - 从显卡帧缓冲存储器到网络适配器存储器)

请注意,上述方法的实用性受到我的使用环境的限制:我想要捕获的目标 PC 通常运行移动大量数据的软件(利用测试的硬件);关于描述这样一个系统,你最好的说法是“勉强稳定”:)我猜这与游戏玩家在想要获得要求较高的游戏的视频捕获时所面临的问题类似。一旦我开始使用类似的东西recordMyDesktop,它也使用相当多的资源并希望在本地硬盘上捕获 - 我立即遇到严重的内核崩溃(通常没有生成 vmcore)。

因此,在我的背景下,我通常确实假设参与second计算机 - 运行“目标”PC 桌面的捕获和记录。除此之外,到目前为止我所看到的上述选项的优缺点如下。

(桌面准备)

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

  • 删除桌面背景和图标
  • 通过系统/首选项/监视器将分辨率设置为 800x600 (gnome-desktop-properties)
  • 更改颜色深度 http://ubuntuforums.org/showthread.php?t=1476572低至 16 bpp(使用xdpyinfo | grep "of root"去检查)

...为了最大限度地减少桌面捕获软件的负载。请注意,在 Ubuntu 上更改颜色深度需要更改 xorg.conf;然而, ”“ - 所以你可能需要运行sudo Xorg -configure first.

为了保持较低的图形资源使用率,我通常也有compiz禁用 - 或者更确切地说,我将“系统/首选项/外观/视觉效果”设置为“无”。但是,在我尝试启用之后compiz通过将“视觉效果”设置为“正常”(which 没有被保存 https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/441993),我可以注意到液晶屏上的窗口重绘速度要快得多;所以我就这样保留它,也用于桌面捕获。我觉得这有点奇怪:怎么可能more影响导致faster屏幕刷新?它看起来不像是由于专有驱动程序造成的(该卡是“英特尔公司 N10 系列集成图形控制器”,并且 Ubuntu 在切换到时没有提供专有的驱动程序选项compiz) - 不过,所有的模糊和效果可能只是欺骗了我的眼睛:) )。

克隆VGA

嗯,这是最昂贵的选择(因为它需要额外购买不仅仅是一个,而是两个硬件:VGA 转换器和视频采集卡);主要适用于笔记本电脑(具有屏幕+额外的 VGA 输出 - 对于台式机,可能还需要投资额外的显卡或 VGA 克隆硬件)。

然而,它也是唯一不需要目标 PC 的任何附加软件的选项(因此使用目标 CPU 的 0% 处理能力) - 并且也是唯一能够提供带有true,无抖动帧速率为 30 fps(因为它是由单独的硬件执行的 - 尽管假设各个硬件之间存在的时钟域未对准可以忽略不计)。

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

记录我的桌面

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

因此,我尝试做的是设置桑巴 http://www.jonathanmoeller.com/screed/?p=1590在网络上共享驱动器;然后在目标电脑上,我会连接到该驱动器 - 并指示recordMyDesktop使用此网络驱动器(通过gvfs http://www.g-loaded.eu/2008/12/08/access-gvfs-mounts-from-the-command-line/) 作为其临时文件位置:

recordmydesktop --workdir /home/user/.gvfs/test\ on\ 192.168.1.100/capture/ --no-sound --quick-subsampling --fps 30 --overwrite -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/

...为了转换原始临时数据。然而,更多时候,recordMyDesktop在执行此“救援”过程中本身会出现段错误。尽管如此,我想保留临时文件的原因是为了拥有画中画蒙太奇的未压缩源。请注意,“--on-the-fly-encoding“将完全避免使用临时文件 - 代价是使用更多的 CPU 处理能力(对我来说,这又是导致崩溃的原因。)

然后是帧率 - 显然,你可以设置要求的使用 ' 的帧率--fps N' 选项;但是,这并不能保证您实际上会获得该帧速率;例如,我会得到:

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

...在我的测试软件运行时进行捕获;这意味着实际达到速率更像是 25*2983/6032 = 12.3632 fps!

显然,帧被丢弃 - 大部分显示为视频播放速度太快 http://ubuntuforums.org/showthread.php?t=1469103。但是,如果我将请求的 fps 降低到 12,那么根据保存/总报告,我会达到 11 fps 之类的值;在这种情况下,视频播放看起来并没有“加速”。而且我还没有尝试将这样的捕获与实时视频对齐 - 所以我不知道那些实际保存的帧是否也有准确的时间戳。

VNC捕获

对我来说,VNC 捕获包括在“目标”PC 上运行 VNC 服务器,并运行vncrec(twibright 版)在“录音机”PC 上。作为VNC服务器,我使用vino,即“系统/首选项/远程桌面(首选项)”。显然,即使葡萄酒配置 http://ubuntuforums.org/showthread.php?t=8742可能不是最容易管理的事情,vino作为服务器似乎对“目标”PC 来说并不太费力;因为当它与我的测试软件并行运行时,我没有遇到崩溃。

另一方面,当vncrec在“记录器”PC 上捕获时,它还会弹出一个窗口,向您显示“实时”中看到的“目标”桌面;当“目标”上有大量更新(即整个窗口移动)时,人们可以非常明显地看到“记录器”上的更新/刷新率问题。但是,对于小的更新(即只是光标在静态背景上移动),一切似乎都还不错。

这让我想知道我在这篇文章中的主要问题之一 - 设置 VNC 连接中的帧速率的是什么?

我还没有找到明确的答案,但从零碎的信息来看(请参阅下面的参考文献),我推测:

  • VNC 服务器在收到更改(屏幕更改+点击等)时,会尽快发送更改;受服务器可用的最大网络带宽限制
  • VNC 客户端接收那些因网络连接而延迟和抖动的更改事件,并再次尽可能快地尝试重建桌面“视频”流

...这意味着,人们无法用稳定、周期性的帧速率(如视频)来表述任何内容。

据,直到...为止vncrec作为客户,我得到的最终视频通常被声明为 10 fps,尽管帧可能相当移位/抖动(这需要在视频编辑器中进行剪切)。请注意,vncrec-twibright/自述文件 http://ronja.twibright.com/utils/vncrec-twibright/README状态: ”影片的采样率默认为 10 或由 VNCREC_MOVIE_FRAMERATE 环境变量覆盖,如果未指定则为 10。”;但是,联机帮助页还指出“VNCREC_MOVIE_FRAMERATE - 指定输出影片的帧速率。仅在电影模式下有效。默认为 10。当您的转码器从 10 开始出现问题时,请尝试 2​​4。”。如果有人调查“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);
    }

...这表明写入了一些时间戳 - 但这些时间戳是否源自“原始”“目标”PC,还是“记录器”PC,我无法判断。EDIT:感谢@kanaka的回答,我查了一下vncrec/sockets.c http://ronja.twibright.com/utils/vncrec-twibright/vncrec/sockets.c再次,可以看到它是writeLogHeader函数本身调用gettimeofday;因此它写入的时间戳是本地的 - 也就是说,它们源自“记录器”PC(因此,这些时间戳不能准确描述帧何时起源于“目标”PC).

无论如何,在我看来,服务器发送 - 并且vncrec当客户收到 -whenever;并且只有在随后从原始捕获对视频文件进行编码的过程中,才会设置/插值某种形式的帧速率。

我还想指出,在我的“目标”笔记本电脑上,有线网络连接断开 http://ubuntuforums.org/showthread.php?t=1565114;因此,无线是我访问路由器和本地网络的唯一选择 - 速度远低于路由器通过有线连接处理的 100MB/s。但是,如果捕获帧中的抖动是由“目标”PC 上的负载导致的错误时间戳引起的,我认为良好的网络带宽不会有太大帮助。

最后,就 VNC 而言,还可以尝试其他替代方案 - 例如VNCast http://www.vislab.usyd.edu.au/moinwiki/VNCast服务器 (有前途,但需要一些时间从源代码构建,并且处于“早期实验版本”); or MultiVNC http://handhelds.freshmeat.net/projects/multivnc (虽然,它看起来只是一个客户端/查看器,没有录制选项).

ffmpeg 与 x11grab

没玩过这么多,但是,我已经尝试过netcat; this:

# '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

确实生成 .png 图像 - 但存在压缩伪影(涉及压缩的结果yuv4mpegpipe, 我猜)。

因此,我不喜欢ffmpeg+x11grab目前太多 - 但也许我只是不知道如何根据我的需要进行设置。

*(显卡 -> DMA -> 网络)

诚然,我不确定是否存在这样的东西 - 事实上,我打赌它不存在:)而且我不是这里的专家,但我推测:

是否可以从显卡(或其保存当前桌面位图的缓冲区)启动 DMA 内存传输:source,网络适配器为目的地- 那么原则上,应该可以获得具有正确(且合适)帧速率的未压缩桌面捕获。当然,使用 DMA 传输的目的是减轻处理器将桌面映像复制到网络接口的任务(因此,减少捕获软件对“目标”PC 上运行的进程的影响 - 特别是那些处理 RAM 或硬盘的进程).

当然,这样的建议假设:有大量的网络带宽(对于 800x600、30 fps 至少 800*600*3*30 = 43200000 bps = 42 MiB/s,这对于本地 100 MB/s 网络应该没问题);另一台进行“记录”的 PC 上有足够的硬盘 - 最后,软件可以随后读取原始数据,并基于它生成图像序列或视频:)

我可以接受的带宽和硬盘需求——只要保证稳定的帧速率和未压缩的数据;这就是为什么我很想听听这样的事情是否已经存在。

————————

好吧,我想就是这样 - 我能说的尽可能简短:) 对工具或流程的任何建议,可以通过桌面捕获来实现

  • 未压缩格式(最终可转换为未压缩/无损 PNG 图像序列),以及
  • 具有“正确的时间编码”、稳定的帧率

...,这最终将有助于“简单”、单个命令行处理来生成“画中画”叠加视频 - 将不胜感激!

预先感谢您的任何评论,
干杯!


参考

  1. 在 Linux 上为 CryptoTE 制作截屏视频的经验 -idlebox.net http://idlebox.net/2009/0817-Producing-Screencasts-on-Linux.blog
  2. VNCServer 限制慢速客户端的用户输入 - Kyprianou,Mark - com.realvnc.vnc-list - MarkMail http://markmail.org/message/tv6aht3krqgjtb2b#page:1+mid:pr3vmdj5axhukx65
  3. Linux 常见问题解答 - X Windows:如何使用 VNC 显示和控制远程桌面 http://linux.about.com/od/linux101/l/blnewbie4_3_11.htm
  4. VNC 需要多少带宽? RealVNC - 常见问题解答 http://www.realvnc.com/support/faq.html#bandwidth
  5. x11vnc:用于真实 X 显示的 VNC 服务器 http://www.karlrunge.com/x11vnc/faq.html
  6. HowtoRecordVNC(X11 会话)- Debian Wiki http://wiki.debian.org/HowtoRecordVNC
  7. Ubuntu 中 gtk-RecordMyDesktop 的替代方案 http://www.bauer-power.net/2010/05/alternative-to-gtk-recordmydesktop-in.html
  8. (ffmpeg-user) 如何在 ffmpeg 中使用管道 http://lists.mplayerhq.hu/pipermail/ffmpeg-user/2007-February/006993.html
  9. (ffmpeg-devel) (PATCH) 修复在不支持 XFixes 扩展的 Xserver 上绘制光标时 x11grab 中的段错误 http://comments.gmane.org/gmane.comp.video.ffmpeg.devel/111944

对于这样一个经过深思熟虑的长期问题,您应该获得徽章。 ;-)

为了回答您的主要问题,VNC 使用 RFB 协议,该协议是远程帧缓冲区协议(因此是缩写)而不是流视频协议。 VNC 客户端向服务器发送 FrameBufferUpdateRequest 消息,其中包含客户端感兴趣的视口区域和增量标志。如果未设置增量标志,则服务器将使用包含所请求区域的内容的 FrameBufferUpdate 消息进行响应。如果设置了增量标志,则服务器可以使用 FrameBufferUpdate 消息进行响应,该消息包含自上次向客户端发送该区域以来所请求的区域中已更改的任何部分。

请求和更新如何交互的定义没有明确定义。如果没有任何变化,服务器不一定会通过更新来响应每个请求。如果服务器有来自客户端的多个请求排队,则还允许发送单个更新作为响应。此外,客户端确实需要能够响应来自服务器的异步更新消息(而不是响应请求),否则客户端将失去同步(因为 RFB 不是帧协议)。

通常,客户端只是简单地实现为定期发送整个帧缓冲区视口的增量更新请求,并在服务器更新消息到达时处理它们(即,不尝试将请求和更新绑定在一起)。

Here https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#framebufferupdaterequest是 FrameBufferUpdateRequest 消息的描述。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率 的相关文章

随机推荐

  • 在 PLSQL 条件逻辑中使用子查询;错误 PLS-00405

    我正在构建一个使用 PHP 从 Oracle10g 数据库服务器获取数据的应用程序 我的输入表单有一系列复选框 这些复选框通过数组提交到处理页面 代码过滤到相关元素
  • IntelliJ IDEA 中的自动错误检测

    我是 Java 编程语言和 IntelliJ IDEA 2017 1 IDE 的新手 我刚刚安装了 IDE 并激活了所有各种检查 但每当我犯了错误 例如省略括号或分号 时 IDE 都无法检测到错误 此图像显示激活的检查 This is a
  • WordPress 3.3 CSS 中的相对路径

    我想添加一个图像作为标题的背景 问题是我不想添加绝对路径 因为我是在我的电脑上执行此操作 并且它们要上传到我的服务器 应该在CSS中工作 它在这里不起作用 code branding background url images backgr
  • 如何将自定义 CSS 添加到脆皮表单?

    我正在尝试在脆皮表单的帮助下为我的网站创建一个响应式表单 我没有使用引导程序 我想将自定义 CSS 添加到脆皮表单以匹配我的整个网站 HTML
  • C#.NET VS2010 断点不起作用

    当我去调试代码时 所有断点都被透明填充 只留下轮廓 并且中间有一个感叹号的小三角形位于断点的角落 当我将鼠标悬停在断点上时 错误是 当前不会命中断点 源代码与原始版本不同 我在一个多小时内没有尝试调试我的代码 在此期间我添加了一个具有多个线
  • Mac 10.8.3 上的 fltk 安装

    我正在挣扎fltk在我的 Mac 上安装 我想在Xcode 4 下载文件并解压缩后 尝试按照说明操作 2 3 Configuring FLTK Stay in your FLTK source code directory Type aut
  • 如何检查有效的电子邮件地址? [复制]

    这个问题在这里已经有答案了 有没有一种好方法可以使用正则表达式检查表单输入以确保它是正确样式的电子邮件地址 从昨晚开始就一直在搜索 如果它是子域名电子邮件地址 那么每个回答过人们有关该主题的问题的人似乎也有问题 无关紧要 即使您可以验证电子
  • 如何从 C 文件更改终端中的目录

    如何从 C 程序更改将在终端上生效的目录 实际上不要告诉 system 函数或 chdir 函数 这些仅适用于 C 中的进程或子 shell 假设我正在从 bash shell 执行一个 C 程序 其进程 ID 为 10223 那么 我可以
  • 如何在 AsyncTask 的 postExecute 方法中获取 Map 的结果?

    如何在AsyncTask的postExecute方法中获取Map的结果 我无法在结果中获取结果 Override protected void onPostExecute Map
  • Pipe 和 Tap VS 使用 ngxs 订阅

    我正在玩管道并订阅 如果我使用带有水龙头的管道 则控制台中不会登录任何内容 如果我使用订阅 它就可以工作 那么我做错了什么 import Observable from rxjs import tap take from rxjs oper
  • 让 SSLEngine 在 Android (4.4.2) 上使用 TLSv1.2?

    伙计们 我希望我遗漏了一些明显的东西 并且我希望有人能够提供一些线索 我正在尝试让 TLSv1 2 在 SSL NIO 上下文中运行 使用Android异步 https github com koush AndroidAsync库 所以我尝
  • 如何使用 ffmpeg 提取时间精确的视频片段?

    这并不是一个特别新的问题领域 但我已经尝试过那里建议的内容 但运气不佳 那么 我的故事 我有一大段 15 秒的直接来自camera mov 视频 我想从中提取特定的块 我可以通过开始时间和停止时间 以秒为单位 来识别该块 我首先尝试执行我称
  • 无效号码错误!似乎无法绕过它

    Oracle 10g 数据库 我有一张桌子叫s contact 这个表有一个字段叫做person uid This person uid字段是 varchar2 但包含某些行的有效数字和其他行的无效数字 例如 一行可能有一个person u
  • 选项卡的 AngularJS 控制器

    我的页面中有三个选项卡 我在用着tabset and tab根据Angular 引导文档 https angular ui github io bootstrap tabs 我设置了一个控制器 div 其中有tabsetas div cla
  • 从 gitlab docker runner 启动声纳扫描仪

    我有一个 CI 工作流程 集成了 linting 作业和代码质量作业 我的 Linting 工作是一个 docker runner 从应用程序代码启动我的 eslint 脚本 然后我的代码质量工作应该启动声纳扫描仪泊坞窗实例 检查我的代码并
  • 可扩展列表指示器

    我有一个可扩展的列表 所以两个问题 我见过一些类似的问题 但从未找到答案 我该怎么办 隐藏箭头 组指示器 当没有孩子的时候 我尝试在适配器中执行此操作 public View getGroupView int groupPosition b
  • 保存散点图动画

    我一直在尝试使用 matplotlib 保存动画散点图 并且我希望它不需要完全不同的代码来查看动画图形和保存副本 该图完美显示了保存完成后的所有数据点 这段代码是修改后的版本Giggi s https stackoverflow com a
  • 在 Javascript 中获取不带模 (%) 运算符的余数,占 -/+ 符号

    对于家庭作业 我需要返回 num1 除以 num2 后的余数 而不使用内置模 运算符 我可以使用以下代码让大多数测试通过 但我一直不知道如何解释给定数字的 符号 我需要保留 num1 上的任何一个符号 并且如果 num2 为负数 还返回一个
  • springdoc-openapi:如何添加POST请求的示例?

    Controller有以下方法 ApiResponses value ApiResponse responseCode 200 GetMapping value API URI PREFIX PRODUCTS URI produces Me
  • Linux:通过网络进行屏幕桌面视频捕获和 VNC 帧速率

    抱歉 文字墙很长 TL DR VNC 连接的帧速率是多少 以帧 秒为单位 或者更确切地说 由谁决定 客户端还是服务器 对于桌面屏幕捕获的任何其他建议 但 正确的时间编码 具有不抖动的帧速率 具有稳定的周期 并有可能将其作为未压缩 或无损 图