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


27

有人建议我将未经修改的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!
    • 注意:h264在avconv -formats输出中列出为DE h264 raw H.264 video format

Answers:


24

如果您的硬盘允许,您可以尝试通过以下方式进行操作:

首先写入未压缩的文件:

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

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

之后,您可以随时压缩它:

ffmpeg -i grab.avi grab.mkv

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



6

我在以下方面取得了成功:

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

[edit 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()

1

您尝试过rfbroxy吗?

我用它来记录X11屏幕会话。

如果有更改,您可以在仅记录图片的模式下使用它。


1

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

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

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

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

用于向观众或网络显示的屏幕录像-有一些特殊的工具可以捕获点击,跟踪和放大鼠标,还有其他选项可以使您在做什么更加清晰。我建议您也看看那些。Google为“屏幕录像软件”。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.