v4l2loopback บน Linux: การติดตั้ง การคงอยู่ถาวร และข้อผิดพลาดที่พบบ่อย

Linux ไม่มีกล้องเสมือนมาให้ในตัว แอปพลิเคชันจะเปิดอุปกรณ์อย่าง /dev/video0 แล้วอ่านเฟรมจากที่นั่น และเคอร์เนลก็คาดหมายว่าเบื้องหลังเป็นฮาร์ดแวร์จริง ส่วน v4l2loopback คือโมดูลเคอร์เนลที่สร้างอุปกรณ์ซึ่งทำตัวเหมือนกล้อง แต่ได้รับภาพจากซอฟต์แวร์แทน

มันเป็นรากฐานของทุกวิธีใช้กล้องเสมือนบน Linux ทั้ง OBS ไปป์ไลน์ของ ffmpeg และ CamLooper ต่างก็เขียนข้อมูลลงอุปกรณ์ loopback ทั้งสิ้น ต่อไปนี้คือวิธีตั้งค่าให้ถูกต้อง

การติดตั้ง

ให้ติดตั้งแพ็กเกจ DKMS เพื่อให้โมดูลถูกคอมไพล์ใหม่โดยอัตโนมัติทุกครั้งที่เคอร์เนลอัปเดต

# Debian / Ubuntu
sudo apt install v4l2loopback-dkms

# Fedora / RHEL
sudo dnf install v4l2loopback

# Arch
sudo pacman -S v4l2loopback-dkms

DKMS สำคัญมากตรงนี้ หากไม่มีมัน โมดูลจะถูกคอมไพล์ให้เข้ากับเคอร์เนลที่คุณใช้อยู่ ณ ตอนติดตั้งเท่านั้น และกล้องเสมือนของคุณจะหยุดทำงานอย่างเงียบ ๆ หลังอัปเดตเคอร์เนลครั้งถัดไป

การโหลดโมดูล

sudo modprobe v4l2loopback

ตรวจสอบว่าอุปกรณ์ถูกสร้างขึ้นแล้ว

lsmod | grep v4l2loopback
ls -l /dev/video*

ตัวเลือกที่มีประโยชน์ตอนโหลด

sudo modprobe v4l2loopback \
  devices=1 \
  video_nr=10 \
  card_label="Virtual Camera" \
  exclusive_caps=1
  • video_nr=10 ตรึงอุปกรณ์ไว้ที่ /dev/video10 เพื่อไม่ให้ชนกับเว็บแคมตัวจริง
  • card_label กำหนดชื่อที่แอปต่าง ๆ แสดงในรายการกล้อง
  • exclusive_caps=1 คือตัวเลือกชี้ขาด เพราะทำให้อุปกรณ์ประกาศความสามารถในการจับภาพเฉพาะตอนที่มีบางอย่างกำลังเขียนข้อมูลเข้าไป Chrome, Firefox และแอปที่ใช้ Electron หลายตัวจะเมินอุปกรณ์ loopback ที่ไม่มีตัวเลือกนี้ นี่จึงเป็นเหตุผลที่กล้องอาจมองเห็นได้ใน v4l2-ctl แต่กลับหายไปในเบราว์เซอร์

ทำให้คงอยู่หลังรีบูต

modprobe มีผลจนถึงการรีบูตครั้งถัดไปเท่านั้น ไฟล์สองไฟล์นี้ช่วยให้ตั้งค่าอยู่ถาวร

# /etc/modules-load.d/v4l2loopback.conf
v4l2loopback
# /etc/modprobe.d/v4l2loopback.conf
options v4l2loopback devices=1 video_nr=10 card_label="Virtual Camera" exclusive_caps=1

ไฟล์แรกโหลดโมดูลตอนบูต ส่วนไฟล์ที่สองส่งตัวเลือกให้มัน หลายคนเขียนแค่ไฟล์แรกแล้วมานั่งสงสัยว่าตัวเลือกที่ตั้งไว้หายไปไหน

ทดสอบโดยไม่ต้องใช้แอปใดเลย

ส่งวิดีโอวนซ้ำเข้าไปในอุปกรณ์ด้วย ffmpeg

ffmpeg -stream_loop -1 -re -i video.mp4 \
  -f v4l2 -pix_fmt yuv420p /dev/video10

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

ข้อผิดพลาดที่พบบ่อย

modprobe: ERROR: could not insert 'v4l2loopback': Required key not available

Secure Boot กำลังปฏิเสธโมดูลที่ยังไม่ได้เซ็น คุณต้องลงทะเบียน Machine Owner Key แล้วเซ็นโมดูล หรือปิด Secure Boot ในเฟิร์มแวร์ ส่วนดิสทริบิวชันที่แจกโมดูลเวอร์ชันเซ็นแล้วจะไม่เจอปัญหานี้เลย

โมดูลคอมไพล์ได้แต่ไม่มีอุปกรณ์ /dev/video ปรากฏ

ให้ดู dmesg | tail ทันทีหลังรัน modprobe ความไม่ตรงกันของเวอร์ชันระหว่างโมดูลกับเคอร์เนลที่กำลังทำงานจะปรากฏตรงนั้น และมักเป็นสัญญาณว่า DKMS ยังไม่ได้คอมไพล์ใหม่หลังการอัปเดต

กล้องมีอยู่แต่เบราว์เซอร์มองไม่เห็น

ให้โหลดโมดูลพร้อม exclusive_caps=1 นี่คือสาเหตุที่พบบ่อยที่สุดแบบทิ้งห่างสาเหตุอื่น

แอป Flatpak มองไม่เห็นกล้อง

แซนด์บ็อกซ์จะปิดกั้นการเข้าถึงอุปกรณ์จนกว่าคุณจะอนุญาต

flatpak override --user --device=all com.obsproject.Studio

ข้ามขั้นตอนทั้งหมดนี้

ทุกอย่างข้างต้นเป็นการตั้งค่าที่ทำเพียงครั้งเดียว แต่ก็ยังหมายถึงการนั่งพิมพ์คำสั่งในเทอร์มินัลและการรีบูตหนึ่งครั้งก่อนที่คุณจะเปิดวิดีโอเป็นกล้องได้ และนี่คือเหตุผลที่คำแนะนำว่า "ก็ใช้ OBS สิ" นั้นทำตามได้ยากกว่าบน Linux เมื่อเทียบกับ Windows

แพ็กเกจ .deb และ .rpm ของ CamLooper จัดการเรื่องนี้ให้คุณ โดยประกาศ v4l2loopback-dkms เป็นแพ็กเกจที่ต้องพึ่งพา ติดตั้งไฟล์ modules-load.d และ modprobe.d ตามที่แสดงไว้ข้างต้น พร้อมโหลดโมดูลระหว่างการติดตั้ง กล้องจึงพร้อมใช้งานทันทีที่ตัวติดตั้งทำงานเสร็จ และพร้อมอีกครั้งหลังรีบูตทุกครั้ง ไม่ต้องใช้เทอร์มินัล ไม่ต้องรีบูต และ DKMS ก็ช่วยให้มันทำงานต่อไปได้แม้เคอร์เนลจะอัปเดต

ลองใช้ CamLooper

ฟรี ทำงานในเครื่องทั้งหมด และพร้อมใช้ในเวลาไม่ถึงหนึ่งนาที

ดาวน์โหลด CamLooper