Оглавление:
2025 Автор: John Day | [email protected]. Последнее изменение: 2025-01-13 06:58
Идея состоит в том, чтобы загружать фотографии и видео, сделанные с помощью камеры с активированным движением, подключенной к Raspberry Pi, для загрузки файлов в облако. Программное обеспечение «Motion» поддерживает загрузку на Google Диск через PyDrive. В этой статье «Движение» используется для загрузки в Google Фото.
Аппаратное обеспечение:
Малина Pi 3B +
Веб-камера USB, Logitech C920
Выбор оборудования не определялся, просто брал то, что было под рукой.
Предпосылки:
Для удобства Raspberry pi должен быть в вашей локальной сети - чтобы управлять им без монитора / клавиатуры и выгружать / скачивать файлы. Для этого на вашем компьютере должен быть установлен ssh-агент (например, putty).
Большое спасибо ssandbac за отличный урок. Если вам нужна дополнительная информация о том, как настроить среду, ознакомьтесь с этой статьей. Я позаимствовал из него шаги по установке и настройке движения и добавил некоторые изменения. В частности, вместо отправки файлов и предупреждений по электронной почте в этом примере используется загрузка в общий альбом фотографий Google и получение уведомлений о «добавленных фотографиях» в панели уведомлений.
Вот шаги:
Шаг 1. Установите Linux Motion на Raspberry
В частности, в этом примере использовалось движение v4.0.
1.1 Обновить пи
pi @ raspberrypi: ~ $ sudo apt-get update
pi @ raspberrypi: ~ $ sudo apt-get upgrade
1.2 Скачать движение
pi @ raspberrypi: ~ $ sudo apt-get install motion
1.3 Теперь отредактируйте этот файл со следующими изменениями
pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf
# Запустить в режиме демона (фоновый) и освободить терминал (по умолчанию: выключено)
демон на
# Использовать файл для сохранения сообщений журнала, если не указаны stderr и syslog. (по умолчанию: не определено)
файл журнала /var/log/motion/motion.log
# Ширина изображения (в пикселях). Допустимый диапазон: зависит от камеры, по умолчанию: 352
ширина 1920
# Высота изображения (в пикселях). Допустимый диапазон: зависит от камеры, по умолчанию: 288
высота 1080
# Максимальное количество кадров, которые нужно захватить в секунду.
частота кадров 30
# Указывает количество предварительно захваченных (буферизованных) изображений до движения
pre_capture 5
# Количество кадров для захвата после того, как движение больше не обнаруживается
post_capture 5
# Выводить "нормальные" изображения при обнаружении движения (по умолчанию: включено)
output_pictures выключен
# Качество (в процентах), которое будет использоваться при сжатии jpeg
качество 100
# Используйте ffmpeg для кодирования фильмов в реальном времени
ffmpeg_output_movies выкл.
# или диапазон от 1 до 100, где 1 означает худшее качество, а 100 - лучшее.
ffmpeg_variable_bitrate 100
# При создании видео кадры должны дублироваться по порядку
ffmpeg_duplicate_frames ложь
# Bool для включения или отключения extpipe (по умолчанию: выключено)
use_extpipe на
extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size% wx% h -framerate% fps -i pipe: 0 -vcodec libx264 -preset ultrafast -f mp4% f.mp4
целевой_директор / var / lib / движение
# Команда, которая будет выполняться, когда файл фильма
; on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &
Оставьте последнюю точку с запятой на данный момент (закомментировано), чтобы раскомментировать, после того как убедитесь, что запись и загрузка видео работают.
1.4 Затем измените
pi @ raspberrypi: ~ $ sudo nano / etc / default / motion
pi @ raspberrypi: ~ $ start_motion_daemon = да
Шаг 2. Настройте API Google Фото для Python
2.1 Рекомендуется создать новую учетную запись для этой цели, чтобы поделиться альбомом с вашим основным, чтобы получать уведомления при добавлении новых файлов, а также больше места для хранения. Включите API Google Фото для учетной записи, которую вы собираетесь использовать для загрузки.
После этого у вас должен быть файл credentials.json.
2.2 Настройка среды Python
Обычно настройка среды требуется только на малине. Но для этого требуется авторизация oauth, что удобнее выполнять на ПК. Для этого на raspberry вам нужно подключить к нему монитор / клавиатуру или настроить интерфейс удаленного рабочего стола. Я только что установил одну и ту же среду на Raspberry и на ПК. Итак, шаги 2.2.1..2.2.3 были сделаны на ПК, 2.2.1, 2.2.2, 2.2.5, 2.2.6 на Rpi.
2.2.1 установить Python 3
2.2.2 Установите пакеты google api согласно руководству * (см. 5.1)
На ПК
pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
На малине
pi @ raspberrypi: ~ $ sudo pip3 install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib
2.2.3 Ознакомьтесь со скриптом загрузки фотографий в Google.. Он размещен у меня на гитхабе. Поместите его в тот же каталог, что и credentials.json.
2.2.4 Сделайте снимок и протестируйте загрузку
python3 photos.py image.jpg
Установите недостающие зависимости, если они есть, и повторите попытку. В результате вы должны получить token.pickle в каталоге сценария, а также новый общий альбом, созданный в веб-интерфейсе Google Фото с помощью image.jpg. Когда вы получите token.pickle, вам больше не понадобится credentials.json для photos.py в том же каталоге.
2.2.5 Поделиться альбомом с учетной записью о том, о чем вы хотите получать уведомления о добавленных новых медиафайлах. Добавьте эту учетную запись в свой телефон.
2.2.6 Поместите photos.py и token.pickle в / var / lib / motion на raspberry. Пользователь pi не может писать в каталог motion, поэтому сначала загрузите в / home / pi
scp photos.py token.pickle pi @ IP: / home / pi
Затем войдите в raspberry и переместите файлы в sudo
ssh pi @ IP
pi @ raspberrypi: ~ $ sudo mv photos.py token.pickle / var / lib / motion
2.2.7 Проверить, как работает загрузка на raspberry. Сделайте снимок с помощью fswebcam и попробуйте загрузить его
pi @ raspberrypi: ~ $ sudo fswebcam /var/lib/motion/image.jpg
pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/image.jpg
В альбоме helloworld должен быть image.jpg, а на панели телефона - уведомление.
Шаг 3: Тест
3.1 Запуск сервиса Motion
pi @ raspberrypi: запуск службы ~ $ sudo
Вы можете изменить команду на «стоп» или «перезапуск».
3.2 Включение журналов движения
pi @ raspberrypi: ~ $ tail -f /var/log/motion/motion.log
3.2. Просмотрите изображение с камеры на другом устройстве, подключенном к той же локальной сети. Введите в браузере:
IP: 8081
3.3. Просматривая журналы, дождитесь обнаружения движения и записи файла NAME.mp4 в / var / lib / motion. Затем запустите скрипт загрузки вручную.
pi @ raspberrypi: ~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/NAME.mp4
Проверьте следы Python. Подождите, пока event_end не появится в motion.log. Затем перейдите в альбом «helloworld» на своих фотографиях в Google и проверьте, не загружено ли видео.
3.4 Если загрузка прошла успешно, раскомментируйте в /etc/motion.conf строку:
pi @ raspberrypi: ~ $ sudo nano /etc/motion.conf
# Команда, выполняемая, когда файл фильма готов
on_movie_end sudo python3 /var/lib/motion/photos.py% f.mp4 &
pi @ raspberrypi: ~ $ sync
pi @ raspberrypi: ~ $ sudo перезапуск движения службы
3.5 Просматривая журналы движения и в альбоме, проверьте, загружено ли видео автоматически.
3.6. При желании поделитесь альбомом со своей основной учетной записью, чтобы получать уведомление при добавлении нового видео или фотографии.
Шаг 4. Необязательно: настройте веб-доступ к камере для потоковой передачи в реальном времени
Этот шаг основан на руководстве Мишеля по Паррено. Я просто выбрал FreeDNS вместо NoIP, как рекомендовано здесь.
4.1 Настройте авторизованный доступ к серверу движения потокового видео:
pi @ raspberrypi: ~ $ sudo nano /etc/motion/motion.conf
# Установите метод аутентификации (по умолчанию: 0)
# 0 = отключено
# 1 = Обычная аутентификация
# 2 = дайджест MD5 (более безопасная аутентификация)
stream_auth_method 2
# Аутентификация для потока. Синтаксис имя пользователя: пароль
# По умолчанию: не определено (отключено)
webcontrol_authentication имя пользователя: пароль
# Максимальная частота кадров для потоковых потоков (по умолчанию: 1)
stream_maxrate 30
# Ограничить потоковые соединения только для localhost (по умолчанию: включено)
stream_localhost выключен
Если вы не собираетесь использовать веб-интерфейс управления из внешней сети, оставьте его отключенным (по умолчанию).
# Ограничить управляющие соединения только локальным хостом (по умолчанию: включено)
webcontrol_localhost включен
Кроме того, поскольку raspberry выходит в Интернет, я рекомендую изменить пароль Raspberry по умолчанию.
pi @ raspberrypi: ~ $ passwd
Хотя ssh порт 22 не перенаправлен на малину, все же.
4.2 Перейдите на сайт FreeDNS
4.3 Зарегистрироваться
4.4 Добавить поддомен (Для участников -> Поддомены)
4.5 Выберите DNS-клиент для установки на Raspberry (Для участников -> Динамический DNS -> Ресурсы Synamic DNS -> Клиенты динамического DNS)
Я выбрал wget_script update.sh от Адама Дина (внизу страницы)
Есть заполнители _YOURAPIKEYHERE_ и _YOURDOMAINHERE_. Чтобы получить их, перейдите в (Для участников -> Динамический DNS)
А на странице ниже вы найдете примеры скриптов с вашим APIKEY и DOMAIN (тот, что добавлен в 4.4). Я взял эти значения из сценария Wget и заменил _YOURAPIKEYHERE_ и _YOURDOMAINHERE_ в update.sh
4.6 Затем запустите update.sh на raspberry. Для nslookup может потребоваться dnsutils. Затем установите его:
pi @ raspberrypi: ~ $ sudo apt-get dnsutils
4.7 Затем настройте маршрутизатор для перенаправления запросов внешнего мира на порт 8081 на IP-адрес малины.
4.8 Зарезервируйте IP-адрес для MAC-адреса малины в настройках DHCP, чтобы у Rpi всегда был один и тот же IP-адрес
4.9 Затем введите в браузере на устройстве, которое не подключено к локальной сети:
yourdomain: 8081
Введите свои учетные данные, которые вы определили в motion.conf.
Проверьте, как работает видео.
4.10 для обновления DDNS автоматически настраивается задача cron. См. Quick_cron_example в (Для участников -> Динамический DNS)
Шаг 5: советы
5.1 Будьте внимательны, устанавливая пакеты python на raspberry. Я потратил день на отладку этого - проблема заключалась в том, что с консоли скрипт работал хорошо, но при вызове из обратного вызова события движения - нет. Хуже всего то, что в последнем случае следов от сценария не было.
Причина заключалась в том, что, следуя руководству, я установил пакеты для пользователя pi (который по умолчанию находится в каталоге / home / pi и ограничен для других пользователей), но для запуска сценария в качестве дочернего элемента службы движения пакеты должны быть также доступен для пользователя "движения". Итак, наконец, я исправил его, установив пакеты как
sudo pip3…
Это неправильный способ все еще работает. Установка без sudo as pip3 --system по какой-то причине выдает ошибки.
Соответственно, скрипт вызывается также под sudo (см. Motion.conf).
Во время этого устранения неполадок я сделал много ненужных изменений и не уверен, что необходимо, и теперь мне лень откатывать их постепенно и смотреть, когда это перестанет работать. В частности, предоставлены права администратора движения:
pi @ raspberrypi: ~ $ групповое движение
движение: движение adm sudo аудио видео пользователи netdev pi
pi @ raspberrypi: ~ $ sudo cat /etc/sudoers.d/010_pi-nopasswd
pi ВСЕ = (ВСЕ) БЕЗ ПАРОЛЯ: ВСЕ
движение ALL = (ALL) NOPASSWD: ALL
Также менялись владельцы файлов и разрешения, аналогичные загрузке на Google Диск. Возможно, это может помочь вам в случае, если у вас есть аналогичная проблема.
5.2 API Google Фото позволяет добавлять файлы только в общие альбомы, чтобы любой, у кого есть ссылка, мог получить к ним доступ. Не делитесь им по ссылке и не удаляйте старые фильмы, не перемещайте их в корзину или из альбома. В последнем случае они остаются на счете.
5.3 Помощник по фотографиям Google распознает лица, что весьма полезно, если качество камеры хорошее. В качестве бонуса он делает модные медиа-подборки, гифки и т. Д.
5.4 Я попытался использовать USB-модем 4G LTE для доступа в Интернет, и вот мои результаты. 5.4.1 Huawei E3372h-153 работает с малиной без проблем и дополнительного программного обеспечения. 5.4.2 Также включена точка доступа, поэтому Rasperry поделился подключением к Интернету через Wi-Fi. Существует https://howtoraspberrypi.com/create-a-wi-fi-hotspot-in-less-than-10-minutes-with-pi-raspberry/ очень простое руководство, как это сделать с помощью RaspAP. 5.4.3 Динамический DNS не работал в сети 4G моей Кэрри. Есть объяснение, почему
5.5 После использования этой системы оказалось пару недель, хотя видео удобнее просматривать и загружать, Google Фото лучше работает с изображениями. Например, он позволяет группировать объекты / лица, анализируя только изображения, и только потом искать лица / объекты на изображениях в видео, но не наоборот. Итак, я собираюсь тестировать изображения, загружая, а не видео.