SSH та веб-камери

Продовжую тему про 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.