Есть ли команда терминала, в которой перечислены все веб-камеры, подключенные к моему компьютеру, включая собственную? Может быть, используя ffmpeg
посылка?
v4l2-ctl --list-devices
sudo apt-get install v4l-utilsv4l2-ctl --list-devices
Пример вывода с помощью одной камеры:
Integrated Camera (usb-0000:00:1a.0-1.6): /dev/video0
Протестировано на Ubuntu 16.04.
video1
устройство метаданных
Однако в Ubuntu 19.10 Lenovo Thinkpad P51 перечислены два таких устройства, video0
и video1
, но у меня только одна камера, и я могу видеть изображения только с video0
с ffplay
. Этот вопрос был задан на:
- Четыре записи / dev/video, но только одна камера
- https://unix.stackexchange.com/questions/512759/multiple-dev-video-for-one-physical-device
Что происходит, так это то, что /dev/video1
содержит только какие-то метаданные видео, а не изображения, как видно из:
sudo v4l2-ctl --device=/dev/video0 --allsudo v4l2-ctl --device=/dev/video1 --all
который показывает соответственно:
Device Caps : 0x04200001 Video Capture Device Caps : 0x04a00000 Metadata Capture
Как увидеть изображение с камеры в реальном времени
- https://unix.stackexchange.com/questions/3304/how-do-i-watch-my-webcams-feed-in-linux
- Какие приложения для веб-камер доступны и как проверить, работает ли ваша веб-камера?
Мой любимый:
sudo apt install ffmpegffplay /dev/video0
Сделайте один снимок из командной строки
ffmpeg -f v4l2 -video_size 1280x720 -i /dev/video0 -frames 1 out.jpg
Запись видео из командной строки
- Видеомагнитофон веб-камеры
- захват видео с веб-камеры и сохранение в файл
- Что-нибудь лучше сыра для захвата видео?
Параметры, выбранные на основе "Как получить параметры камеры, такие как разрешение" ниже:
ffmpeg -f v4l2 -framerate 30 -video_size 1280x720 -input_format mjpeg -i /dev/video0 -c copy out.mkv
Затем:
ffprobe out.mkv
содержит, как и ожидалось:
Stream #0:0: Video: mjpeg (Baseline), yuvj422p(pc, bt470bg/unknown/unknown), 1280x720, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)
Если вы выберете неправильные параметры, разрешение может быть медленным. Камера уже выводит определенный кодированный формат, и самый простой способ записи - просто скопировать этот формат, как указано выше:
- https://stackoverflow.com/questions/47292785/recording-from-webcam-using-ffmpeg-at-high-framerate
- https://superuser.com/questions/1021899/what-ffmpeg-settings-to-get-the-best-possible-video-resolution-framerate-that-my
ЗАДАЧА, если я заменю -c copy out.mkv
с out.ogv
чтобы попытаться записать непосредственно в открытый формат (в отличие от MJPEG), я получил видео с низким разрешением.
Интерактивный захват изображений / видео с предварительным просмотром
Программы захвата изображений/видео
Пока я не научусь бегать ffplay
предварительный просмотр в одной оболочке и одновременный захват из другой оболочки с помощью ffmpeg
(они дерутся из-за видеоустройства), мне придется опуститься до этой удивительной программы с графическим интерфейсом:
sudo apt install cheese
Считывание данных с камеры с C/C++
Конкретный пример C++, который обрабатывает изображения с камеры на графическом процессоре с помощью OpenGL и показывает их в реальном времени: https://stackoverflow.com/questions/13693946/image-processing-with-glsl-shaders/40641014#40641014
Как получить параметры камеры, такие как разрешение
- Как я могу узнать поддерживаемые разрешения веб-камер?
- https://superuser.com/questions/639738/how-can-i-list-the-available-video-modes-for-a-usb-webcam-in-linux
v4l2-ctl --list-formats-ext
дает некоторую полезную информацию:
ioctl: VIDIOC_ENUM_FMT Type: Video Capture [0]: 'YUYV' (YUYV 4:2:2) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 320x180 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 352x288 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 424x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 848x480 Interval: Discrete 0.050s (20.000 fps) Size: Discrete 960x540 Interval: Discrete 0.067s (15.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.100s (10.000 fps) [1]: 'MJPG' (Motion-JPEG, compressed) Size: Discrete 640x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 320x180 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 320x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 352x288 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 424x240 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 640x360 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 848x480 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 960x540 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps) Size: Discrete 1280x720 Interval: Discrete 0.033s (30.000 fps) Interval: Discrete 0.067s (15.000 fps)
Как получить соответствующие кодировки ffmpeg
v4l2-ctl --list-formats-ext
дает ядру Linux название вещей, например. YUYV 4:2:2
. Но делать что-то с ffmpeg
, иногда вам нужно знать ffmpeg nama. Вы можете сделать это так:
ffmpeg -f v4l2 -list_formats all -i /dev/video0
пример вывода:
[video4linux2,v4l2 @ 0x555ba7267240] Raw : yuyv422 : YUYV 4:2:2 : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720[video4linux2,v4l2 @ 0x555ba7267240] Compressed: mjpeg : Motion-JPEG : 640x480 320x180 320x240 352x288 424x240 640x360 848x480 960x540 1280x720
Это, например, сказало нам, что имя ffmpeg для YUYV 4:2:2
является yuyv422
.
Чтобы перечислить все видеоустройства, обнаруженные ядром
ls -ltrh /dev/video*
Чтобы перечислить все устройства, подключенные к USB, используйте lsusb
; чтобы перечислить все устройства, подключенные к PCI, используйте lspci
Для Windows вы можете использовать библиотеку pygrabber: https://github.com/bunkahle/pygrabber
Чтобы проверить удобные для пользователя имена подключенных веб-камер:
from __future__ import print_functionfrom pygrabber.dshow_graph import FilterGraphgraph = FilterGraph()print(graph.get_input_devices())
<<<<< lsusb >>>>