Raspberry Pi: веб-сервер MJPEG-стриминга (Picamera2)
В этом руководстве вы узнаете, как настроить веб-сервер видеостриминга с Raspberry Pi и камерой, используя простой скрипт с библиотекой Picamera2. Вы сможете получить доступ к веб-серверу стриминга из любого веб-браузера в вашей локальной сети.
Предварительные требования
Перед тем как продолжить, убедитесь, что вы выполнили следующие предварительные требования:
Вам нужна плата Raspberry Pi и камера Raspberry Pi.
У вас должна быть Raspberry Pi с установленной Raspberry Pi OS (32-битная или 64-битная).
Вы должны уметь установить SSH-соединение с вашей Raspberry Pi.
Библиотека Picamera2 для Python
Picamera2 — это Python-библиотека для взаимодействия с камерой Raspberry Pi. Она основана на стеке камер libcamera и поддерживается фондом Raspberry Pi. Использовать старую библиотеку PiCamera с последними версиями Raspberry Pi OS больше не рекомендуется.
Библиотека Picamera2 поддерживается на всех моделях Raspberry Pi от Pi Zero до RPi 5.
Установка библиотеки Picamera2
Имея SSH-соединение с вашей Raspberry Pi, обновите вашу Raspberry Pi, если доступны какие-либо обновления. Выполните следующую команду:
sudo apt update && sudo apt upgrade -y
Выполните следующую команду, чтобы установить библиотеку Picamera2 на вашей Raspberry Pi.
sudo apt install -y python3-picamera2
Примечание
Настоятельно рекомендуется устанавливать и обновлять Picamera2 с помощью команды apt, описанной выше, чтобы избежать проблем совместимости. Я столкнулся со множеством проблем компиляции при попытке установить библиотеку Picamera2 с помощью команды pip в виртуальном окружении.
Подготовка камеры Raspberry Pi
Камера Raspberry Pi — это маленький и недорогой модуль камеры, совместимый с платами Raspberry Pi. Хотя для большинства проектов её может быть достаточно, :doc:`некоторые USB-камеры обеспечивают лучшее качество изображения </raspberry/rnt/set-up-usb-camera-opencv-raspberry-pi/index>`_. Для данного руководства мы будем использовать модуль камеры Raspberry Pi Camera V2, показанный на следующем изображении:
Это руководство также работает с Raspberry Pi Camera V3, и камера совместима со всеми моделями Raspberry Pi.
Включение модуля камеры Raspberry Pi
Если вы используете последнюю версию Raspberry Pi OS, официальные камеры Raspberry Pi будут обнаружены и включены автоматически.
Подключение камеры
Подключение модуля камеры Raspberry Pi очень простое. При выключенном Pi подключите камеру к порту CSI на Pi, как показано на следующем рисунке.
Веб-сервер MJPEG-стриминга — скрипт Python
Запуск веб-сервера стриминга довольно прост с камерой Raspberry Pi благодаря Python-библиотеке Picamera2.
Создайте новый файл с именем stream_server.py, выполнив следующую команду:
nano stream_server.py
Скопируйте следующий код в ваш только что созданный файл:
# Rui Santos & Sara Santos - Random Nerd Tutorials
# Complete project details at https://RandomNerdTutorials.com/raspberry-pi-mjpeg-streaming-web-server-picamera2/
# Mostly copied from https://picamera.readthedocs.io/en/release-1.13/recipes2.html
# Run this script, then point a web browser at http:<this-ip-address>:7123
# Note: needs simplejpeg to be installed (pip3 install simplejpeg).
import io
import logging
import socketserver
from http import server
from threading import Condition
from picamera2 import Picamera2
from picamera2.encoders import JpegEncoder
from picamera2.outputs import FileOutput
PAGE = """\
<html>
<head>
<title>picamera2 MJPEG streaming demo</title>
</head>
<body>
<h1>Picamera2 MJPEG Streaming Demo</h1>
<img src="stream.mjpg" width="640" height="480" />
</body>
</html>
"""
class StreamingOutput(io.BufferedIOBase):
def __init__(self):
self.frame = None
self.condition = Condition()
def write(self, buf):
with self.condition:
self.frame = buf
self.condition.notify_all()
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
picam2 = Picamera2()
picam2.configure(picam2.create_video_configuration(main={"size": (640, 480)}))
output = StreamingOutput()
picam2.start_recording(JpegEncoder(), FileOutput(output))
try:
address = ('', 7123)
server = StreamingServer(address, StreamingHandler)
server.serve_forever()
finally:
picam2.stop_recording()
Нажмите Ctrl + X, чтобы сохранить файл, введите Y и Enter.
Вы можете настроить веб-страницу, изменив HTML и добавив CSS в переменную PAGE. Файл stream.mjpg относится к файлам стриминга (собственно видео).
PAGE = """\
<html>
<head>
<title>picamera2 MJPEG streaming demo</title>
</head>
<body>
<h1>Picamera2 MJPEG Streaming Demo</h1>
<img src="stream.mjpg" width="640" height="480" />
</body>
</html>
"""
Запуск скрипта
Выполните следующую команду, чтобы получить IP-адрес Raspberry Pi. Вам понадобится IP-адрес для доступа к вашему веб-серверу.
hostname -I
Затем запустите ваш веб-сервер, выполнив следующую команду в директории вашего проекта:
python stream_server.py
Наконец, откройте любой веб-браузер в вашей локальной сети и введите IP-адрес Raspberry Pi, за которым следует номер порта :7123.
http://raspberry-pi-ip-address:7123
Вот и всё! Ваш веб-сервер Raspberry Pi транслирует MJPEG-файлы.
Подведение итогов
В этом кратком руководстве вы узнали, как настроить IP-камеру с помощью Raspberry Pi и камеры Raspberry Pi. Это может быть полезно для мониторинга чего-либо в вашей сети в режиме реального времени. Одно из самых популярных применений — наблюдение за 3D-принтерами, но это также может использоваться для широкого спектра приложений, таких как умные дверные звонки или камеры видеонаблюдения.
Мы надеемся, что это руководство оказалось для вас полезным. Возможно, вам также будет интересно ознакомиться с другими руководствами, связанными с камерами.
Установка OpenCV на Raspberry Pi (совместимо со всеми платами RPi)
Установка MediaPipe на Raspberry Pi — пример распознавания жестов
Настройка Python Picamera2 на Raspberry Pi (съёмка фото и захват видео)
Наконец, вы можете ознакомиться со всеми нашими проектами Raspberry Pi по следующей ссылке: