有人建議我將未修改的 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,標準檢視器無法執行此操作。
用於向觀眾或在網路上顯示的螢幕錄製 - 有專門的工具可以捕捉點擊、追蹤和放大滑鼠,並且還有其他選項可以讓您更清楚地了解您正在做什麼。我建議你也去看看那些。谷歌搜尋「螢幕錄製軟體」。