有人建议我将未修改的 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
,然后使用 转换为 mp4ffmpeg -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,标准查看器无法执行此操作。
用于向观众或在网络上显示的屏幕录制 - 有专门的工具可以捕捉点击、跟随和放大鼠标,并且还有其他选项可以让您更清楚地了解您正在做什么。我建议你也看看那些。谷歌搜索“屏幕录制软件”。