วิธีลดการใช้งาน CPU / หน่วยความจำให้น้อยที่สุดโดย ffmpeg เมื่อบันทึกวิดีโอ


13

ฉันใช้ FFmpeg สำหรับการจับภาพหน้าจอวิดีโอจากจอแสดงผล Xvfb

ขณะนี้ฉันขอด้วย:

ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.mov

เมื่อฉันบันทึกวิดีโอจากช่วง Xvfb ประมาณ 5 ครั้งการใช้งาน CPU ของฉันนั้นสูงมากและมีความล่าช้าเนื่องจากมัน การใช้หน่วยความจำประมาณ 300 MB สำหรับกระบวนการ ffmpeg แต่ละกระบวนการ

ฉันควรใช้พารามิเตอร์ใดสำหรับ ffmpeg เพื่อลดการใช้ทรัพยากรคอมพิวเตอร์ (โดยเฉพาะ CPU และหน่วยความจำ) เมื่อทำการจับภาพหน้าจอวิดีโอ

คำตอบ:


17

1. สร้างเอาต์พุต RGB แบบ lossless ก่อน

ffmpeg -y -framerate 25 -video_size 1280x1024 -f x11grab -i :0.0 -c:v libx264rgb \
-crf 0 -preset ultrafast temp.mp4
  • อินพุตเป็น RGB ดังนั้นการใช้ encoder libx264rgb จะหลีกเลี่ยงการแปลง RGB เป็น YUV ที่อาจเกิดขึ้นช้าซึ่งอาจเกิดขึ้นหากคุณใช้ libx264 ธรรมดา

  • วิธีนี้ใช้การเข้ารหัสล่วงหน้าที่เร็วที่สุดของ x264: เร็วมาก

  • ผลผลิตจะไม่สูญเสียไปเนื่องจาก-crf 0มีการใช้งาน

2. จากนั้นเข้ารหัสอีกครั้ง

เอาต์พุตจากคำสั่งแรกจะมีขนาดใหญ่และผู้เล่นใบ้ส่วนใหญ่ไม่สามารถจัดการ RGB H.264 เพื่อให้คุณสามารถเข้ารหัสได้อีกครั้ง:

ffmpeg -i temp.mp4 -c:v libx264 -crf 23 -preset medium -vf format=yuv420p out.mp4
  • คุณสามารถทดลองกับ-crfค่าเพื่อควบคุมคุณภาพผลผลิต ช่วงที่มีจุดประสงค์ทางจิตใจคือ 18-28 โดยที่ 18 ไม่สูญเสียการมองเห็นหรือเกือบจะเป็นเช่นนั้น ค่าเริ่มต้นคือ 23

  • ใช้ที่ตั้งไว้ที่ช้าที่สุดคุณมีความอดทนสำหรับ: ultrafast, superfast, veryfast, faster, fast, medium, slow, ,slower เริ่มต้นคือveryslowmedium

  • ฉันเพิ่ม-vf format=yuv420pเพื่อให้แน่ใจว่าผลลัพธ์จะทำงานกับผู้เล่นที่โง่เช่น QuickTime และ Windows Media Player คุณสามารถละเว้นสิ่งนี้หากคุณอัปโหลดไปยัง YouTube หรือเล่นบน VLC, mpv, MPlayer หรือเครื่องเล่นอื่น ๆ ที่ใช้ FFmpeg

ยังดู


ฉันจับภาพวิดีโอจากจอแสดงผลที่ไม่ใช่ค่าเริ่มต้น (เป็น Xvfb) ดังนั้นจึงสามารถเป็นตัวเลขใดก็ได้
Andrei Botalov

@AndreyBotalov คุณลองใช้วิธีสูญเสียหรือไม่? มันทำงานได้ดีขึ้นสำหรับคุณ
llogan

1
ขณะนี้ฉันวิงวอนffmpegกับ-preset superfastพารามิเตอร์ (ฉันไม่ได้พยายาม-crf) ใช้ทรัพยากรน้อยลงในกรณีเช่นนี้และสร้างวิดีโอที่มีขนาดพอใช้
Andrei Botalov

@AndreyBotalov -crf 23มีการใช้งานตามค่าเริ่มต้นหากคุณไม่ได้ประกาศค่า แต่อย่างไรก็ตามถ้าsuperfastเพียงพอสำหรับคุณแล้วอาจจะแก้ปัญหาได้
llogan

1
คุณสามารถลองการเข้ารหัสฮาร์ดแวร์ผ่าน h264_nvenc (nvidia) หรือ h264_qsv (ซีพียู intel ที่ทันสมัย) สิ่งนี้จะเปลี่ยนภาระการเข้ารหัสจากซีพียูของคุณไปเป็นฮาร์ดแวร์ h264 โดยเฉพาะ
Kenn

4

มันเป็นการดีกว่าที่จะให้ความสนใจกับการใช้ตัวเลือก ffmpeg ที่แตกต่างกันซึ่งจะทำให้ได้ผลลัพธ์เดียวกันในวิธีที่ใช้ทรัพยากรน้อยลง ที่กล่าวว่ามีวิธีการใช้ทรัพยากรน้อยลงหากคุณต้องการบรรลุสิ่งที่เฉพาะเจาะจงด้วย ffmpeg และใช้ทรัพยากรมากเกินไป

คุณสามารถลดลำดับความสำคัญของffmpegกระบวนการ CPU ของ:

  • วิธีเทอร์มิ:ใช้คำสั่งเพื่อเปลี่ยนลำดับความสำคัญของกระบวนการ:nice nice -n 8 ffmpeg -y -r 15 -g 600 -s 1280x1024x24 -f x11grab -i :100 -vcodec libx264 /tmp/video.movใน Linux หมายเลขลำดับความสำคัญ ( niceรูปแบบคำสั่งคือnice -n <priority> <command>) อยู่ในช่วง -20 ถึง 20 ยิ่งจำนวนเต็มมากเท่าใดระดับความสำคัญก็จะยิ่งลดลง neutral คือ 0 หากคุณใช้คำสั่งที่ฉันให้ไว้และตั้งค่าเป็น 8 CPU จะให้เวลาในการประมวลผลน้อยลงซึ่งดูเหมือนว่า "กำลัง" น้อยลง หากตัวเลขนี้สูงหรือต่ำเกินไปคุณสามารถเปลี่ยนได้
  • วิธี GUI:สิ่งนี้ไม่แนะนำเพราะจะช่วยให้คุณควบคุมจำนวนที่แน่นอนน้อยลงและจะไม่มีผลทันทีที่กระบวนการเริ่มต้นขึ้น อย่างไรก็ตามมันเข้าใจได้มากกว่า เมื่อffmpegเปิดใช้งานให้เปิดการตรวจสอบระบบ เลื่อนลงไปที่กระบวนการที่ชื่อว่าffmpegคลิกซ้ายเพื่อเลือกคลิกขวาจากนั้นตั้งค่าลำดับความสำคัญเป็น "ต่ำ" หรือ "ต่ำมาก"

หากคุณกังวลเกี่ยวกับการใช้หน่วยความจำเช่นกันให้รู้ว่าเป็นไปไม่ได้ที่จะบอกกระบวนการให้ใช้หน่วยความจำจำนวนมากและยังคงทำงานอยู่ เคอร์เนลควบคุมการจัดสรรหน่วยความจำสำหรับกระบวนการโดยอัตโนมัติ มีวิธีที่จะประมวลผลกระบวนการกับtimeoutสคริปต์เพื่อให้เมื่อกระบวนการและกระบวนการลูกใด ๆ ที่ใช้หน่วยความจำมากเกินไป (วงเงินที่คุณกำหนด) พวกเขาจะถูกยกเลิกอย่างปลอดภัยและการแจ้งเตือนจะปรากฏขึ้น อย่างไรก็ตามหากกระบวนการได้รับหน่วยความจำจำนวนมากเท่านั้น (พูดโดยเคอร์เนล) และร้องขอหน่วยความจำเพิ่มเติมที่ไม่สามารถมีได้กระบวนการก็จะหยุดทำงาน

สิ่งที่เป็นประโยชน์ที่ควรรู้เกี่ยวกับ:

ด้วยความรู้ของกลุ่ม Cg คุณสามารถทำสิ่งสนุก ๆ มากมายเช่นการควบคุมความรวดเร็วของกระบวนการ


2
หากฉันเข้าใจการวาง ffmpeg ลงในคิวลำดับความสำคัญที่ต่ำกว่าอย่างถูกต้องจะทำให้วิดีโอมีความล่าช้าซึ่งไม่พึงประสงค์
Andrei Botalov

1
อืม ... ฉันไม่เห็นอะไรแบบออนไลน์ที่พูดว่า ... คุณมีแหล่งข้อมูลที่ระบุสิ่งนั้นหรือไม่? (หากไม่เป็นเช่นนั้นควรเป็นข้อบกพร่อง)
ริชาร์ด

2
หากฉันเข้าใจว่าลำดับความสำคัญที่ต่ำกว่าอย่างถูกต้องหมายความว่า ffmpeg จะมีเวลาตัวประมวลผลน้อยลงกว่าตอนนี้ แต่ตัวประมวลผลถูกโหลดเกือบ 100% ดังนั้นฉันคิดว่าการจัดลำดับความสำคัญอีกครั้งจะไม่ช่วย
Andrei Botalov

1
สิ่งนี้ได้รับการออกแบบมาเพื่อ จำกัด การใช้งาน CPU ของกระบวนการดังนั้นหาก CPU ของคุณทำงานที่ 100% จะช่วยให้จัดการได้ง่ายขึ้น
ริชาร์ด

4
ฉันได้รับ -1 สิ่งนี้เพราะไม่ว่าคุณจะเปลี่ยนลำดับความสำคัญมันจะยิ่งแย่ลงเท่านั้น การตั้งค่าลำดับความสำคัญต่ำกว่าจะลดเวลา CPU สำหรับ ffmpeg ส่งผลให้เฟรมลดลงมากขึ้นหรือโดยการเพิ่มลำดับความสำคัญมันจะชะลอกระบวนการอื่น ๆ ในระบบมากยิ่งขึ้น ผลลัพธ์ทั้งคู่ไม่พึงประสงค์
gertvdijk

0

-re (อินพุต) อ่านอินพุตที่อัตราเฟรมดั้งเดิม ส่วนใหญ่ใช้เพื่อจำลองอุปกรณ์คว้าหรือสตรีมอินพุตสด (เช่นเมื่ออ่านจากไฟล์) ไม่ควรใช้กับอุปกรณ์คว้าจริงหรือสตรีมอินพุตสด (ซึ่งอาจทำให้แพ็คเก็ตสูญหาย) โดยค่าเริ่มต้น ffmpeg พยายามอ่านอินพุตให้เร็วที่สุด ตัวเลือกนี้จะทำให้การอ่านอินพุตช้าลงถึงอัตราเฟรมดั้งเดิมของอินพุต มันมีประโยชน์สำหรับการส่งออกเรียลไทม์ (เช่นสตรีมมิ่งถ่ายทอดสด)


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