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 ก็ช่วยให้มันทำงานต่อไปได้แม้เคอร์เนลจะอัปเดต