Sử dụng nhiều webcam USB trong Linux


30

Chạy nhiều webcam USB trong Debian / Linux sẽ xảy ra lỗi sau:

libv4l2: error turning on stream: No space left on device
VIDIOC_STREAMON: No space left on device

Điều ban đầu dường như là một vấn đề lập trình trong OpenCV đã biến thành một nhiệm vụ cho một vấn đề phần cứng / phần mềm bí ẩn sau khi các lỗi tương tự được tạo ra bằng cách chạy phô mai và xawtv.

Rõ ràng đó là do webcam yêu cầu tất cả băng thông có sẵn trên bộ điều khiển máy chủ USB. Với ý nghĩ đó, tôi quyết định chạy wiresharkcapinfos để xem một camera được sử dụng bao nhiêu băng thông.

4 megabits per second at 320x240
14 megabits per second at 640x480
32 megabits per second at 1280x720

Hấp dẫn! Điều đó có thể giải thích tại sao hai camera ở 320x240 hoạt động nhưng độ phân giải cao hơn đều thất bại. Như thể bộ điều khiển USB của tôi chỉ hoạt động ở tốc độ USB 1, nhưng lsusb hiển thị cả hai webcam thuộc về một thiết bị được cho là hỗ trợ 480 megabit mỗi giây.

Một giải pháp đề xuất buộc các webcam phải tính toán mức sử dụng băng thông thay vì yêu cầu mức tối đa của chúng bằng cách chạy các lệnh sau:

sudo rmmod uvcvideo
sudo modprobe uvcvideo quirks=128

Thật không may, điều đó không có sự khác biệt, vì vậy tôi quyết định thử một giải pháp khác. Một bài đăng trên StackOverflow đã đề nghị các webcam của tôi sử dụng định dạng video FPS hoặc nén thấp hơn như MJPEG, nhưng sau khi chạy danh sách v4lctl, nó không xuất hiện một trong hai webcam của tôi hỗ trợ thay đổi chế độ video của họ.

Và đó là nơi tôi bị mắc kẹt. Tại sao hai webcam hoạt động tốt dưới tốc độ tối đa của USB 2 sẽ gây ra lỗi này?

ps: Đây không phải là vấn đề về dung lượng ổ đĩa, df hiển thị không thay đổi khi webcam được khởi động.

pps: Nếu nó tạo ra sự khác biệt, thì đây là đầu ra của lsusb

Câu trả lời:


25

Ding Ding! Quản lý để tìm ra điều này với một số trợ giúp từ những người tốt trong # v4l trên freenode.

Câu chuyện dài: v4l2-ctl là công cụ tốt nhất để gỡ lỗi các sự cố camera USB. Đọc tất cả các lệnh có sẵn và trang man, tôi sẽ rất vui. Sử dụng v4l2-ctl, tôi phát hiện ra một trong những máy ảnh của mình không hỗ trợ bất kỳ chế độ video nén nào. Bạn có thể kiểm tra các chế độ mà máy ảnh của bạn hỗ trợ bằng cách chạy lệnh sau:

v4l2-ctl -d /dev/video0 --list-formats

Mà nên xuất ra một cái gì đó như thế này.

 ioctl: VIDIOC_ENUM_FMT
 Index       : 0
 Type        : Video Capture
 Pixel Format: 'MJPG' (compressed)
 Name        : MJPEG

 Index       : 1
 Type        : Video Capture
 Pixel Format: 'YUYV'
 Name        : YUV 4:2:2 (YUYV)

Nếu định dạng pixel duy nhất được trả về là "YUYV", "IUYV", "I420" hoặc "GBRG", bạn sẽ chỉ có thể chạy một camera trên mỗi bộ điều khiển USB * vì các định dạng đó không được nén. Sử dụng nhiều webcam hỗ trợ MJPEG hoặc một số hình thức nén khác sẽ hoạt động tốt.

Nếu bạn sử dụng OpenCV như tôi, đừng lo lắng nếu định dạng pixel mặc định không được nén vì nó xuất hiện mặc định OpenCV mặc định sử dụng nén.

** Trừ khi bạn hài lòng với độ phân giải 320x240 trở xuống. *


1
Xin chào, nếu có thể, bạn có thể cho tôi biết làm thế nào tôi nên đặt định dạng pixel của 2 máy ảnh để tôi có thể chụp cả hai ở 640x480 không? Tôi đang sử dụng OpenCV và hiện đang gặp tình huống tương tự như bạn có khi cả hai camera sẽ chỉ hoạt động ở 320x240 hoặc thấp hơn
lexma

Aha! v4l2-ctlthực sự là một công cụ tuyệt vời để gỡ lỗi. Tìm hiểu rất nhiều về máy ảnh của tôi, và đã có thể khắc phục vấn đề. Dù sao, tôi đã có thể sửa nó bằng cách buộc độ phân giải của máy ảnh của tôi 320x240và sử dụng YUYVlàm chế độ đầu ra của máy ảnh. guvcviewcũng đã giúp rất nhiều.
Sheharyar

Khi sử dụng độ phân giải 320x240 hoặc thấp hơn, tôi nhận được kết quả hỗn hợp. Tôi đã mua 4 webcam USB giá rẻ, tất cả cùng một kiểu. Khi cố gắng chạy 2 ở 160x120, một số trong số chúng sẽ hoạt động tốt với nhau và một số bị lỗi bộ nhớ. Tôi thấy không có vần điệu hoặc lý do cho nó. Cấp, những webcam này có giá 3 đô la / cái, vì vậy tôi đoán tôi đã nhận được những gì tôi đã trả tiền.
Cerin

Kết nối hai hoặc nhiều camera trong số đó với USB3.0 hoạt động tốt, thậm chí thông qua bộ chia USB2.0. Đã kiểm tra với YUYV.
Michał Leon

7

Câu trả lời là sử dụng các sửa đổi uvcvideo được viết bởi SwDevRefugee và được mô tả ở trên. Anh ấy và tôi đã làm việc cùng nhau để có được mã đã được biên dịch cho OpenWrt, với thành công. Phiên bản tôi đang chạy nó là OpenWRT DESIGNATED DRIVER (Bleting Edge, r48130), trên bộ định tuyến tplink wdr3600:

KẾT QUẢ: Tôi có thể có 3 * c270 (logitech) chạy tương tự ở tốc độ 1280x960 và 15fps ở định dạng MJPG, thông qua một trung tâm usb 2.0. Tôi không có c270 thứ tư để kết nối, xin lỗi.

Tôi cũng có thể có 2 * c270 và 1 * GEMBIRD 640 * 480 * 15fps với định dạng YUV, nhưng việc thêm GEMBIRD thứ 2 dẫn đến "Không thể bắt đầu chụp: Không còn chỗ trống trên thiết bị" (khoảng trống == băng thông ở đây, như bạn biết rõ:)). Lưu ý rằng GEMBIRD (1908: 2311) == http://www.penguin.cz/~utx/hardware/USB_Camera_AX2311/ .

Việc sử dụng CPU với 3 * c270 khá hợp lý trên wdr3600:

Mem: 50600K used, 75444K free, 320K shrd, 3436K buff, 8800K cached

CPU:  16% usr  27% sys   0% nic  45% idle   0% io   0% irq  10% sirq

Load average: 1.20 0.85 0.44 4/60 2546

  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND

 2240  1679 root     S    15348  12%  17% mjpg_streamer --input input_uvc.so --

 2505  1679 root     S    15368  12%  11% mjpg_streamer --input input_uvc.so --

 2239  1679 root     S    15532  12%  11% mjpg_streamer --input input_uvc.so --

Nếu cộng đồng cung cấp một số danh tiếng và hỗ trợ, tôi nghĩ SwDevRefugee sẵn sàng nhận mã vào uvc-linux.


4

Tôi đã xem trình điều khiển uvcvideo và tham số mô-đun quirks = 128 bị bỏ qua nếu luồng được nén mjpeg.

Các webcam mà tôi lựa chọn là Logitech C500 và Logitech C270, và tôi thấy rằng hình ảnh do C500 tạo ra ở 1280x1024 là 100kbyte và hình ảnh được tạo ra bởi C270 ở 1280x960 là 200kbyte.

Nếu tôi chạy C270 ở tốc độ 10 khung hình / giây thì tốc độ bit cần thiết là 10x200000x8 = 16Mbit / s. Trong Ubuntu 14.04, mô-đun uvcdriver luôn phân bổ 196Mbit / s bất kể tốc độ khung hình. Đối với C500, nó hoạt động tốt hơn một chút, nhưng vẫn là một con heo băng thông.

Tôi đã sửa đổi trình điều khiển uvcvideo để tôi có thể cung cấp hệ số "nén" cho trình điều khiển thông qua giao diện V4L2. Đó là một "hacky nhỏ" ở chỗ tôi đã sử dụng thuộc tính private trong struct v4l2_pix_format để chỉ định giá trị. Trong trình điều khiển, nó tính toán kích thước của hình ảnh không nén và sau đó chia cho hệ số nén để tìm ra băng thông USB nào sẽ sử dụng.

Theo mặc định, tôi sử dụng hệ số nén là 10 cho phép lề lớn nếu máy ảnh gặp phải một hình ảnh đặc biệt khó nén. C270 chạy ở tốc độ 1280x960 và 10 khung hình / giây hiện sử dụng 41Mbit / s và tôi có thể dễ dàng chạy 4 camera trên một xe buýt.

Nếu bất cứ ai quan tâm đến tính năng này thì tôi sẽ cố gắng để các nhà bảo trì uvcvideo xem xét khái niệm yếu tố "nén".


Tôi và những người khác trong cộng đồng OpenROV sẽ rất muốn thấy mod của bạn với trình điều khiển uvc @SwDevRefugee. Tôi đang cố gắng tích hợp hai webcam vào OpenROV (một cho hình ảnh thị giác nhìn xuống, cái còn lại để điều khiển / xem bình thường), nhưng chạy vào cùng một vấn đề BW. Bạn đã nghĩ về việc đăng mod / hoặc gửi yêu cầu kéo cho sự thay đổi của bạn chưa?

Cách chính thức để yêu cầu thay đổi trình điều khiển uvc là thông qua danh sách gửi thư này: linux-uvc-devel@lists.sourceforge.net. Tôi đã đăng yêu cầu thay đổi của mình vào ngày 30 tháng 12 năm 2015 cùng với một số bài đăng tiếp theo khác với thông tin thêm. Tôi đã không có phản hồi từ một người bảo trì. Hai người khác đã bày tỏ sự quan tâm đến sự thay đổi. Tôi không biết có bao nhiêu yêu cầu để có bất kỳ hành động. Có lẽ @laughlinb cũng có thể đăng lên danh sách gửi thư.
SwDevAlien

@SwDevRefugee: Tôi muốn lời khuyên của bạn unix.stackexchange.com/q/287279/52764
Ragav

@Ragav: Tôi nghĩ bạn cần cách ly vấn đề bằng cách mở đồng thời tất cả các camera ở độ phân giải phù hợp bằng ứng dụng hoạt động tốt như luvcview sẽ cung cấp cho bạn thông báo lỗi thông tin nếu có lỗi.
SwDevAlien

1
Vấn đề của Ragav là máy ảnh của anh ta chỉ hỗ trợ YUYV và khi anh ta sử dụng cờ quirks = 0x80, trình điều khiển buộc anh ta phải sử dụng ít nhất 1024 byte / microframe (65,5 Mbit / s) cho mỗi camera. Điều này được kết hợp bởi thực tế là băng thông lớn nhất thấp nhất mà máy ảnh hỗ trợ là 2040 byte / microframe nên mặc dù anh ta chỉ muốn 320x240 ở tốc độ 6fps, anh ta chỉ có thể có 2 camera trên một bus USB. Tối thiểu 1024 byte / microframe hạn chế đã được thêm vào trình điều khiển uvcvideo ở đâu đó giữa các bản phát hành 2.6.32 và 3.16 của kernel.
SwDevAlien

-1

Tôi đã nhận ra rằng lỗi không gian quá. Điều làm việc là rút phích cắm của một trong các máy ảnh và cắm nó vào một cổng USB khác trên PC cố định của tôi - có khoảng 6 hoặc 7 cổng USB nằm rải rác về nó. Đang chạy 'show_webcams 0 1' thì bất ngờ xuất hiện hai hình ảnh.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.