ปัญหาอุปกรณ์หลายอุปกรณ์เหมือนกัน
ฉันมี Rasperry Pi กับกล้องสี่ตัว ผมใช้เวลากับ Pix fswebcam
ซึ่งระบุกล้องเป็น../dev/video0
video3
บางครั้งกล้องvideo0
, vide02
, video4
และvideo6
แต่เราสามารถลืมเกี่ยวกับว่าสำหรับในตอนนี้
ฉันต้องการ ID ถาวรเพื่อระบุหมายเลขกล้องเพื่อให้เช่นvideo0
เป็นกล้องเดียวกันเสมอเพราะฉันใส่ภาพ โชคไม่ดีที่สิ่งนี้ไม่ได้เกิดขึ้นอย่างน่าเชื่อถือ - ในการบู๊ตกล้องจะระบุเป็นvideo0
.. video3
แต่ไม่เหมือนกันเสมอไป
กล้องทุกตัวมี ID และหมายเลขซีเรียลเหมือนกัน
การแก้ปัญหานี้เกี่ยวข้องกับกฎของ udev แต่มีเบ็ดตกปลามากมายเช่นกัน
หากคุณออกคำสั่ง
udevadm info –attribute-walk –path=/dev/video0
คุณได้รับการพูดนานน่าเบื่อของเอาท์พุท แต่บิตสำคัญคือ
KERNEL=”video0”, SUBSYSTEM=”video4linux” and KERNELS=”1:1.2.4:1.0”.
KERNELS bit เป็นพอร์ตฮับ USB ด้วยกล้องสี่ตัวมีสี่ตัวนี้ - พวกมันจะไม่เปลี่ยนเมื่อทำการรีบูท แต่สิ่งที่video{x}
เกี่ยวข้องกับพอร์ตอาจเปลี่ยนไป
ดังนั้นเราจึงจำเป็นต้องมีกฎ udev เพื่อผูกหมายเลขวิดีโอเข้ากับพอร์ตฮับ USB - เช่น:
KERNEL==”video0”,SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0”,SYMLINK+=”camera0”
ดูเรียบง่าย - เข้าถึงกล้องด้วย
fswebcam –d $realpath /dev/camera0
ยกเว้นว่าจะไม่ทำงาน - หากคุณใส่สิ่งนี้ในกฎ udev และระบบได้จัดสรร video0 (ขณะบู๊ต) ไปยังพอร์ตอื่นกฎ udev จะถูกละเว้น symlink ไปโดยทั่วไปว่า/dev/camera0
no such device
สแควร์หนึ่ง
สิ่งที่เราต้องการคือการผูก symlink กับที่อยู่ฮับ USB ไม่ใช่video{x}
ตัวเลข มันใช้โปรแกรม Python
ขั้นตอนแรกคือการทำงาน
fswebcam –d /dev/video${x} tst.jpg
สำหรับx
ระหว่าง 1 และ 8 การมีอยู่ของtst.jpg
หลังจากการโทรแต่ละครั้งจะระบุว่ามีกล้องในหมายเลขวิดีโอนี้หรือไม่ จากนี้ทำรายการหมายเลขวิดีโอที่ใช้งานอยู่ ประสบการณ์ของฉันคือว่ามันเป็นอย่างใดอย่างหนึ่ง0,1,2,3
หรือ0,2,4,6
สำหรับกล้องที่ฉันได้ใช้
บางคนอาจสร้างรายชื่อนี้โดยใช้กระบวนการที่แตกต่างกัน
จากนั้นสำหรับแต่ละหมายเลขวิดีโอในรายการที่เรียกใช้
udevadm info –attribute-walk –path=/dev/videox > dd
และสารสกัดจากKERNELS= line
dd
จากกระบวนการนี้คุณจะพบรายการที่อยู่พอร์ต USB สำหรับกล้อง เรียงลำดับรายการนี้เพื่อให้ในขั้นตอนถัดไปคุณจะดำเนินการตามลำดับเดียวกันเสมอ เรียกสิ่งนี้ว่า "รายการที่อยู่"
เรียกใช้udevadm … > dd
สิ่งนั้นอีกครั้งและสร้างรายการที่ดูเหมือน
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camerax”. Call this the “video list”.
ตอนนี้ผ่านรายการที่อยู่ - สำหรับแต่ละรายการค้นหารายการที่เกี่ยวข้องจากรายการวิดีโอ สร้างรายการใหม่ที่ดูเหมือนคอลเลกชันบรรทัดเช่น
KERNEL==”video0”, SUBSYSTEM=”video4linux”,KERNELS==”1:1.2.4:1.0 ”,SYMLINK+=”camera2”
x (หมายเลข symlink) จะถูกแทนที่ด้วยหมายเลขลำดับในรายการที่อยู่
ตอนนี้คุณมีกฎ udev ที่ใช้งานได้ symlink ที่เชื่อมโยงกับที่อยู่ฮับ USB ไม่ว่าหมายเลขวิดีโอใดจะถูกจัดสรรให้กับพอร์ตนั้นเมื่อบู๊ต
/etc/udev/rules.d/cam.rules
เขียนรายการสุดท้ายลงในไฟล์ เรียกใช้udevadm trigger
เพื่อเปิดใช้งานและดำเนินการเสร็จสิ้น /dev/camera2
จะเป็นกล้องเดียวกัน (พอร์ต USB) โดยไม่คำนึงถึงหมายเลขวิดีโอ