如何获得近乎完美的屏幕录制质量?

如何获得近乎完美的屏幕录制质量?

有人建议我将未修改的 X 显示的副本定向到一个文件,然后将该文件转换为通用视频文件。在 Kubuntu 系统上我将使用什么命令来执行此操作? (编辑:他说了一些关于将显示端口附加到文件的事情。)如果不可能,那么对于不依赖快速硬件的高质量屏幕录制来说,我的最佳选择是什么?

背景:我尝试将 avconv 与 -f x11grab 和一些 GUI 程序一起使用。然而,无论我尝试什么,生成的视频要么有伪影/模糊,要么不稳定(丢失帧)。这可能是由于 CPU/内存限制造成的。

目标:

  • 视频质量不得与直接在屏幕上看到的会话有明显不同,因为目的是演示动画应用程序。
  • 最终视频必须采用通用格式,可以发送给 Windows 用户并在网络上使用。我认为 H.264 MP4 应该可以。
  • 该解决方案不应假设有太多先验知识。我熟悉命令行和基本的Linux命令,但我还在学习Linux,对视频编解码器不太了解。

我已经尝试过的:

  • 迄今为止最好的命令:ffmpeg -f x11grab -s xga -r 30 -i :0.0 -qscale 0.1 -vcodec huffyuv grab.avi,然后使用 转换为 mp4 ffmpeg -i grab.avi -sameq -vcodec mpeg4 grab.mp4
    • 图像质量很好,但在我的测试系统上它落后于计算机。在更快的目标系统上,它不会滞后,但帧明显被跳过,使得视频不太好光滑的
    • 我仍在尝试找出如何将grab.avi 文件保存到SHM,看看是否有帮助。
  • 使用 Istanbul 和 RecordMyDesktop GUI 记录器
  • 简单命令:avconv -f x11grab -s xga -r 25 -i :0.0 simple.mpg使用avconv版本0.8.3-4:0.8.3-0ubuntu0.12.04.1
  • 添加-codec:copy(失败并显示Requested output format 'x11grab' is not a suitable output format:)
  • 添加-same_quant(质量很好,但非常不稳定/丢失许多帧)
  • 添加-vpre lossless_ultrafast(失败并显示:Unrecognized option 'vpre', Failed to set value 'lossless_ultrafast' for option 'vpre'
  • 添加各种值-qscale
  • 添加各种值-b
  • 添加-vcodec h264(重复输出:Error while decoding stream #0:0, [h264 @ 0x8300980] no frame!
    • avconv -formats注意:h264 在输出中列出为DE h264 raw H.264 video format

答案1

如果你的硬盘允许的话,你可以尝试这样做:

首先写入未压缩的文件:

ffmpeg -f x11grab -s SZ -r 30 -i :0.0 -qscale 0 -vcodec huffyuv grab.avi

SZ是您的显示尺寸(例如 1920x1080)。

之后您可以随时压缩它:

ffmpeg -i grab.avi grab.mkv

当然,您可以更改压缩、选择编解码器等。

答案2

我已经取得了成功:

ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :1 \
       -vcodec libx264 -preset ultrafast -qp 0 -pix_fmt yuv444p \
       video.mkv

关键点:

  • -qp 0:x264无损模式
  • -预设超快:最小的CPU占用,大尺寸
  • -pix_fmt yuv444p:默认值,但ffmpeg建议使用yuv420p,这是有损的

提示:捕获屏幕和网络摄像头覆盖:

ffmpeg -f x11grab -thread_queue_size 64 -video_size 1920x1080 -framerate 30 -i :1 \
       -f v4l2 -thread_queue_size 64 -video_size 320x180 -framerate 30 -i /dev/video0 \
       -filter_complex 'overlay=main_w-overlay_w:main_h-overlay_h:format=yuv444' \
       -vcodec libx264 -preset ultrafast -qp 0 -pix_fmt yuv444p \
       video.mkv

https://trac.ffmpeg.org/wiki/Capture/Desktop

[编辑 20180418] Gnome Shell 和 Wayland 更新:

#!/usr/bin/env python3
from dbus import SessionBus, Interface
from os import getcwd, path
from sys import argv

BUS_NAME = 'org.gnome.Shell.Screencast'
PATH_NAME = '/org/gnome/Shell/Screencast'
INTERFACE_NAME = BUS_NAME
PIPELINE='x264enc pass=qual quantizer=0 speed-preset=ultrafast ! queue ! matroskamux'

if path.isabs(argv[1]):
    name = argv[1]
else:
    name = path.join(getcwd(), argv[1])

bus = SessionBus()
screen_cast = bus.get_object(BUS_NAME, PATH_NAME)
screen_cast = Interface(screen_cast, INTERFACE_NAME)

ret, name = screen_cast.Screencast(name, {'pipeline': PIPELINE})

if not ret:
    print('Error starting screencast.')
    raise SystemExit(1)

try:
    i = input()
except (EOFError, KeyboardInterrupt):
    pass
finally:
    screen_cast.StopScreencast()

答案3

这是一种解决方法,可能不是“近乎完美”,因为它可能取决于网络速度或可能阻碍视频流的其他因素。

使用 VNC 或 Teamviewer 并从笔记本电脑或台式机连接到另一台计算机。如果您有 Windows 或 OSX 笔记本电脑,您可能有可以记录此情况的工具,并且我相信 teamviewer 可以自行记录会话。尝试很容易,然后您就可以决定质量是否足够好。

Teamviewer 倾向于扩展,但我不知道录制的会话是否也会发生这种情况。

VNC 不会压缩或缩放,并且您的笔记本电脑/台式机显示器需要比其他计算机更高的分辨率。质量很好。也许您使用的 VNC 查看器可以录制。我现在使用的是 Ubuntu,标准查看器无法执行此操作。

用于向观众或在网络上显示的屏幕录制 - 有专门的工具可以捕捉点击、跟随和放大鼠标,并且还有其他选项可以让您更清楚地了解您正在做什么。我建议你也看看那些。谷歌搜索“屏幕录制软件”。

答案4

我正在使用 Camtasia 录制我的游戏视频和在线视频。我之前也用过fraps录像机,但播放时fps下降。 Camtasia 提供了更高的 fps,但唯一麻烦的问题是每次我都必须将输出 .CAMREC 转换为 avi,如您所见在此输入链接描述在此输入链接描述。 .camrec 是 camtasia 的专有格式,无法在 Windows Media Player 和 vlc 等任何第三方播放器上播放。

相关内容