如何獲得近乎完美的錄屏質量?
有人建議我將未修改的 X 顯示器的副本直接複製到文件中,然後將該文件轉換為通用影片文件。在 Kubuntu 系統上我會使用什麼命令來執行此操作?(編輯:他說了一些關於將顯示埠附加到文件的內容。)如果不可能,對於不依賴於快速硬體的優質螢幕錄製,我的最佳選擇是什麼?
*背景:*我嘗試將 avconv 與 -f x11grab 和一些 GUI 程序一起使用。但是,無論我嘗試什麼,生成的影片要麼有偽影/模糊,要麼是斷斷續續的(失去幀)。這可能是由於 CPU/記憶體限制。
目標:
- 影片質量不能與直接在螢幕上看到會話有明顯不同,因為目的是展示動畫應用程序。
- 最終影片必須採用可以發送給 Windows 使用者並在 Web 上使用的通用格式。我認為 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!
)
- 注意:h264 在
avconv -formats
輸出中列為DE h264 raw H.264 video format
如果您的硬碟允許,您可以嘗試這樣做:
首先寫入未壓縮的文件:
ffmpeg -f x11grab -s SZ -r 30 -i :0.0 -qscale 0 -vcodec huffyuv grab.avi
這
SZ
是您的顯示尺寸(例如 1920x1080)。之後,您可以隨時壓縮它:
ffmpeg -i grab.avi grab.mkv
當然,您可以更改壓縮,選擇編解碼器等。
我在以下方面取得了成功:
ffmpeg -f x11grab -video_size 1920x1080 -framerate 30 -i :1 \ -vcodec libx264 -preset ultrafast -qp 0 -pix_fmt yuv444p \ video.mkv
關鍵點:
- -qp 0:x264 無損模式
- -preset ultrafast:最小的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()