Потоковое видео с камерой Raspberry Pi
В этом посте мы покажем вам, как можно осуществлять потоковую передачу видео с Raspberry Pi и камеры Raspberry Pi Camera – как транслировать живое видео на веб-страницу, к которой вы можете получить доступ с любого устройства, имеющего браузер и подключённого к той же сети, что и Pi. Это полезно, например, для организации домашней камеры видеонаблюдения.
Предварительные требования
Вы должны быть знакомы с платой Raspberry Pi – :doc:`прочитайте Начало работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_
У вас должна быть установлена операционная система Raspbian или Raspbian Lite на вашем Raspberry Pi
Вы можете прочитать этот пост для знакомства с модулем камеры Raspberry Pi Camera V2
Включение модуля камеры Raspberry Pi
Если вы используете модуль камеры Raspberry Pi, вам необходимо включить программное обеспечение камеры на вашем Raspberry Pi, чтобы использовать его. В среде рабочего стола перейдите в окно Raspberry Pi Configuration в меню Preferences, откройте вкладку Interfaces и включите Camera, как показано на рисунке ниже.
Или в окне Terminal введите следующую команду:
sudo raspi-config
Вы должны увидеть инструмент настройки программного обеспечения Raspberry Pi. Выберите Interfacing Options:
Включите камеру и перезагрузите ваш Pi:
Определение IP-адреса Raspberry Pi
Чтобы получить доступ к вашему веб-серверу потокового видео, вам нужно знать IP-адрес вашего Raspberry Pi. Для этого используйте следующую команду:
ifconfig
Вам будет выдано множество информации, включая IP-адрес вашего Raspberry Pi. В моём случае IP-адрес RPi – 192.168.1.112.
Подключение камеры
Подключить модуль камеры Raspberry Pi Camera Module легко. При выключенном Pi подключите камеру к порту CSI на Pi, как показано на следующем рисунке. Убедитесь, что камера подключена в правильной ориентации, с синими буквами на шлейфе, обращёнными вверх, как показано на следующем рисунке.
Написание скрипта
Скрипт для потоковой передачи видео показан ниже. Вы можете найти этот скрипт в официальной документации пакета PiCamera.
Создайте новый файл с именем rpi_camera_surveillance_system.py:
nano rpi_camera_surveillance_system.py
Скопируйте следующий код в ваш только что созданный файл:
# Web streaming example
# Source code from the official PiCamera package
# http://picamera.readthedocs.io/en/latest/recipes2.html#web-streaming
import io
import picamera
import logging
import socketserver
from threading import Condition
from http import server
PAGE="""\
<html>
<head>
<title>Raspberry Pi - Surveillance Camera</title>
</head>
<body>
<center><h1>Raspberry Pi - Surveillance Camera</h1></center>
<center><img src="stream.mjpg" width="640" height="480"></center>
</body>
</html>
"""
class StreamingOutput(object):
def __init__(self):
self.frame = None
self.buffer = io.BytesIO()
self.condition = Condition()
def write(self, buf):
if buf.startswith(b'\xff\xd8'):
# New frame, copy the existing buffer's content and notify all
# clients it's available
self.buffer.truncate()
with self.condition:
self.frame = self.buffer.getvalue()
self.condition.notify_all()
self.buffer.seek(0)
return self.buffer.write(buf)
class StreamingHandler(server.BaseHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(301)
self.send_header('Location', '/index.html')
self.end_headers()
elif self.path == '/index.html':
content = PAGE.encode('utf-8')
self.send_response(200)
self.send_header('Content-Type', 'text/html')
self.send_header('Content-Length', len(content))
self.end_headers()
self.wfile.write(content)
elif self.path == '/stream.mjpg':
self.send_response(200)
self.send_header('Age', 0)
self.send_header('Cache-Control', 'no-cache, private')
self.send_header('Pragma', 'no-cache')
self.send_header('Content-Type', 'multipart/x-mixed-replace; boundary=FRAME')
self.end_headers()
try:
while True:
with output.condition:
output.condition.wait()
frame = output.frame
self.wfile.write(b'--FRAME\r\n')
self.send_header('Content-Type', 'image/jpeg')
self.send_header('Content-Length', len(frame))
self.end_headers()
self.wfile.write(frame)
self.wfile.write(b'\r\n')
except Exception as e:
logging.warning(
'Removed streaming client %s: %s',
self.client_address, str(e))
else:
self.send_error(404)
self.end_headers()
class StreamingServer(socketserver.ThreadingMixIn, server.HTTPServer):
allow_reuse_address = True
daemon_threads = True
with picamera.PiCamera(resolution='640x480', framerate=24) as camera:
output = StreamingOutput()
#Uncomment the next line to change your Pi's Camera rotation (in degrees)
#camera.rotation = 90
camera.start_recording(output, format='mjpeg')
try:
address = ('', 8000)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
finally:
camera.stop_recording()
Чтобы сохранить файл, нажмите Ctrl+X, введите Y и Enter.
Доступ к потоковому видео
После написания скрипта вы можете запустить его с помощью Python 3. Выполните следующую команду:
python3 rpi_camera_surveillance_system.py
После запуска скрипта вы можете получить доступ к вашему веб-серверу потокового видео по адресу: http://<IP-адрес_вашего_Pi>:8000. Замените на собственный IP-адрес Raspberry Pi, в моём случае http://192.168.1.112:8000.
Вы можете получить доступ к потоковому видео через любое устройство, которое имеет браузер и подключено к той же сети, что и ваш Pi.
Вы можете использовать ваш Pi для мониторинга вашего дома в качестве камеры видеонаблюдения:
Заключение
Надеемся, этот проект был полезен! Вы можете легко улучшить это домашнее устройство видеонаблюдения, добавив запись видео или уведомления при обнаружении движения.
У нас также есть проект о том, как построить полноценную систему видеонаблюдения CCTV с Raspberry Pi на основе MotionEyeOS. Не стесняйтесь ознакомиться с ним.
Нравится домашняя автоматизация? Узнайте больше о Node-RED, Raspberry Pi, ESP8266 и Arduino из нашего курса: Построение системы домашней автоматизации за $100.
Есть вопросы? Оставляйте комментарий ниже!
Спасибо за чтение. Если вам понравился этот пост, вероятно, вам понравятся и следующие, поэтому, пожалуйста, поддержите нас, подписавшись на блог.