Год назад я эксперименторовал с созданием фотографий своим ноутбуком. Вместо постоянного стрима ноут делал фото и сохранял его в папке веб-сервера. Об этом я писал в посте Как я сделал автоматическую съемку фото на веб камере ноутбука из консоли Linux. Я использовал утилиту fswebcam. Все отлично работало, но только фото были не очень хорошего качества.
Недавно настраивал видео-стрим с линукса и вспомнил про утилиту ffmpeg. Конечно, сравнивать fswebcam и ffmpeg примерно то же самое, что сравнивать Paint и Photoshop, но когда есть задача сделать качественно, нужно использовать соответствующие инструменты.
В отличие от fswebcam, ffmpeg не умеет себя вызывать повторно. Потому решение для съемки каждую минуту было реализовано через бэкграунд сервис (systemd) и shell скрипт. Ниже пошаговая инструкция, что и как сделать.
1. Создаем shell скрипт. Сохраним его в директории /usr/local/bin/
sudo nano /usr/local/bin/capture_webcam.sh
и вставь в редактор следующий код
#!/bin/bash
while true; do
ffmpeg -f v4l2 -framerate 30 -video_size 1920x1080 \
-i /dev/video0 -t 1 -frames:v 1 -q:v 2 \
-vf "transpose=2,drawtext=fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf:text='%{localtime\:%Y-%m-%d %H\\\\\\:%M\\\\\\:%S}':x=10:y=10:fontsize=32:fontcolor=white:box=1:boxcolor=black@0.5" \
-y /var/www/html/webcam.jpg
sleep 60
done
Сохрани файл. После чего сделай его исполняемым, для чего нужно установить права для запуска.
Блок с drawtext будет добавлять текущее время. Я его подсмотрел в примерах на других сайтах. Файл изображения сохраняется в рабочую директорию сайта на nginx.
sudo chmod +x /usr/local/bin/capture_webcam.sh
2. Создай сервис. Файлы с инструкциями хранятся в /etc/systemd/system/
sudo nano /etc/systemd/system/webcam-capture.service
Код для сервиса
[Unit]
Description=Webcam photo capture every minute
After=network.target
[Service]
ExecStart=/usr/local/bin/capture_webcam.sh
Restart=always
RestartSec=5
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
3. Добавь права для 'www-data'
sudo usermod -aG video www-data
sudo chgrp -R www-data /var/www/html
sudo chmod -R 775 /var/www/html
sudo chown -R www-data:www-data /var/www/html/webcam.jpg
4. Инициализация нового сервиса и его запуск
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable webcam-capture.service
sudo systemctl start webcam-capture.service
Этот сценарий несколько сложней, чем описанный в Как я сделал автоматическую съемку фото на веб камере ноутбука из консоли Linux. Но результат вас не разочарует однозначно.