Продовжую тему про SSH. Сьогодні я розкажу дуже просту, але не зовсім банальну штуку: як зазирнути в веб-камеру, підключену до віддаленого хоста́.
Базовий доступ
Щоб локально подивитися на веб-камеру, я використовую маленьку консо́льну програму fswebcam
. На Debian чи Ubuntu ставиться через sudo apt install fswebcam
.
За замо́вчанням вона відкриває першу камеру (тобто /dev/video0
) і використовує найменший розмір зображення (це легко змінити), а ще ліпить дура́цький банер (його легко вимкнути).
Локально спробувати fswebcam
можна якось так:
fswebcam --resolution 640x480 --no-banner --save webcam-snapshot.jpg
Вже непогано, чи не так? Збережений файл можна витягти через scp
. Але це не все.
Альтернативи
Також за потреби можна спробувати щось інше, наприклад vgrabbj
або uvccapture
, але мені вони не дуже до вподоби. Остання програма ще й не вміє писати JPEG в stdout.
Пото́кова версія
Для перегляду картинок є дуже багато різних програм. Я найчастіше використовую feh
— легку, швидку і без зайвих залежностей. Ставиться, очікувано, через sudo apt install feh
. Дивіться, що з нею можна зробити:
fswebcam -r 1280x720 - | feh -
Тут fswebcam
пише знімок у стандартний потік виводу (stdout), а feh
читає стандартний потік вводу (stdin), і все працює без тимчасових файлів. Передавати JPEG через потоки цілком нормально.
Збираємо все докупи
Вхідний та вихідний потоки у команди ssh
теж можуть бути бінарні. Ймовірно, ви бачили команди типу tar zcf - some_dir/ | ssh otherhost tar zxf -
та їм подібні.
Тож… Ось воно:
ssh foohost fswebcam -r 1280x720 - | feh -
При всій простоті, це буває дуже зручно.
Можливі проблеми
Проблеми з V4L
Деякі старі і дешеві камери працюють з Video4Linux версії 1 і не працюють з V4L2. У таких ситуаціях можна спробувати використати v4l1compat
, це (дуже приблизно) якось так:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libv4l/v4l1compat.so \
fswebcam --resolution 640x480 --no-banner --save webcam-snapshot.jpg
Звісно, на інших платформах (типу ARM) шлях має бути іншим.
Декілька камер
Якщо підключити декілька камер, то вони будуть доступні через пристрої /dev/video0
, /dev/video1
і так далі. Просто вказуйте потрібний пристрій: fswebcam --device /dev/video1
чи якось так.
Важливо! Якщо їх відключати та підключати, то порядок буде змінюватися. І після перезагрузки системи порядок може змінитися. Це може бути проблемою, якщо знімки з камери якось автоматично обробляються, наприклад зберігаються у архів. Порядок камер змінився — все перемішалося.
То як же цьому запобігти? Спробуйте у якості імені камери замість пристрою виду /dev/video0
використовувати сімлінки з каталогу /dev/v4l/by-id
або /dev/v4l/by-path
.
Відео
Все це було про статичні картинки. Як отримати відеопотік, я не знаю. Ну тобто є у мене один хріновий варіант: поставити mplayer
на віддалений хост і там крутити відео через X11 forwarding, якось так:
ssh -Y foohost mplayer -vo x11 tv://
Але це жахливий спосіб. Буду благодарний, якщо хтось підскаже кращий метод.
Raspberry Pi
Все вищесказане відносилось до звичайних веб-камер, підключених по USB.
Якщо у вас є Raspberry Pi, до якої пласким шлейфом через спеціальний інтерфейс підключена її «рідна» камера, то для доступу до неї варто використовувати raspistill
.
ssh rpi0 raspistill -n -o - | feh -
В мене є окремий пост про камеру до Raspberry Pi.