วิธีการรับคุณภาพการบันทึกหน้าจอใกล้เคียงที่สมบูรณ์แบบ?


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 เพื่อดูว่ามีประโยชน์หรือไม่
  • ใช้อิสตันบูลและ 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

คำตอบ:


24

หาก HDD ของคุณอนุญาตคุณสามารถลองทำสิ่งนี้ได้:

เขียนไฟล์ที่ไม่มีการบีบอัดครั้งแรก:

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

นี่SZคือขนาดจอแสดงผลของคุณ (เช่น 1920x1080)

หลังจากนั้นคุณสามารถบีบอัดได้ตลอดเวลาที่คุณต้องการ:

ffmpeg -i grab.avi grab.mkv

แน่นอนคุณสามารถเปลี่ยนการบีบอัดเลือกตัวแปลงสัญญาณและอื่น ๆ


1
ดูเพิ่มเติมที่: unix.stackexchange.com/a/120001/26227
Dave Jarvis

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 โหมด lossless
  • -preset เร็วมาก: การใช้ 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 and 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 ให้เฟรมต่อวินาทีที่สูงขึ้น แต่ปัญหาเดียวที่ลำบากคือทุกครั้งที่ผมต้องแปลงเอาท์พุท .CAMREC เพื่อ AVI ที่คุณสามารถดูในป้อนคำอธิบายการเชื่อมโยงที่นี่ใส่คำอธิบายการเชื่อมโยงที่นี่ .camrec เป็นรูปแบบกรรมสิทธิ์ของ camtasia และไม่สามารถเล่นกับผู้เล่นบุคคลที่สามใด ๆ เช่น Windows Media Player และ vlc

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.