Simple IP camera streaming module with authentication and compression for OpenCV applications.
Project description
c4ipcam
Простая Python библиотека для передачи видео потока с камеры по сети с поддержкой аутентификации и сжатия. Позволяет легко создать сервер для трансляции видео с камеры и клиент для получения видео потока.
Особенности
- Простая клиент-серверная архитектура
- Поддержка нескольких клиентов одновременно
- Аутентификация по паролю для безопасности
- JPEG сжатие для быстрой передачи данных
- Настраиваемое разрешение и качество видео
- Буферизация кадров для плавного воспроизведения
- Автоматическое переподключение и обработка ошибок
- Поддержка различных источников видео (веб-камера, IP-камера, видеофайлы)
- Многопоточная архитектура для оптимальной производительности
Установка
pip install c4ipcam
Библиотека автоматически установит все необходимые зависимости, включая OpenCV, но для систем без графической оболочки рекомендуется установить opencv-python-headless.
pip install c4ipcam
pip uninstall opencv-python
pip install opencv-python-headless
Быстрый старт
Запуск сервера
# Запуск с параметрами по умолчанию (localhost:8000, камера 0)
c4ipcam
# Запуск с пользовательскими параметрами
c4ipcam --host 0.0.0.0 --port 9999 --camera 0
# Запуск с аутентификацией и настройками качества
c4ipcam --host 0.0.0.0 --port 9999 --password mypassword --width 1280 --height 720 --quality 85 --fps 25
Подключение клиента
from c4ipcam import CameraClient
import cv2
# Создание клиента
cap = CameraClient("localhost", 9999, password="mypassword")
# Подключение к серверу
if not cap.connect():
print("Ошибка подключения к серверу")
exit()
# Получение и отображение кадров
while cap.is_connected():
ret, frame = cap.read()
if not ret:
print("Ошибка получения кадра")
break
cv2.imshow('Camera Feed', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# Освобождение ресурсов
cap.disconnect()
cv2.destroyAllWindows()
API Documentation
CameraServer
Класс для создания сервера, который транслирует видео поток с камеры.
Конструктор
CameraServer(host='0.0.0.0', port=9999, camera_id=0, password="",
width=640, height=480, compression_quality=85, fps=30)
Параметры:
host(str): IP-адрес для привязки сервера (по умолчанию '0.0.0.0')port(int): Порт для прослушивания (по умолчанию 9999)camera_id(int): ID камеры или путь к видеофайлу (по умолчанию 0)password(str): Пароль для аутентификации клиентов (по умолчанию пустой)width(int): Ширина кадра в пикселях (по умолчанию 640)height(int): Высота кадра в пикселях (по умолчанию 480)compression_quality(int): Качество JPEG сжатия 1-100% (по умолчанию 85)fps(int): Целевая частота кадров (по умолчанию 30)
Методы
start_server()
Запускает сервер и начинает трансляцию видео потока.
server = CameraServer(password="mypass", width=1280, height=720)
server.start_server() # Блокирующий вызов
cleanup()
Освобождает ресурсы и останавливает сервер.
server.cleanup()
CameraClient
Класс для подключения к серверу и получения видео потока.
Конструктор
CameraClient(server_host, server_port, password="", compression_quality=85)
Параметры:
server_host(str): IP-адрес сервераserver_port(int): Порт сервераpassword(str): Пароль для аутентификации (по умолчанию пустой)compression_quality(int): Качество сжатия для передачи (по умолчанию 85)
Методы
connect()
Устанавливает соединение с сервером и проходит аутентификацию.
Возвращает: bool - True при успешном подключении, False при ошибке
client = CameraClient("192.168.1.100", 9999, password="mypass")
if client.connect():
print("Успешно подключен!")
else:
print("Ошибка подключения:", client.get_connection_error())
read(timeout=None)
Получает следующий кадр из очереди.
Параметры:
timeout(float, optional): Максимальное время ожидания кадра в секундах
Возвращает: [bool, numpy.ndarray] - статус и кадр
ret, frame = client.read(timeout=1.0)
if ret:
cv2.imshow('Frame', frame)
get_latest_frame()
Возвращает последний полученный кадр без удаления из очереди.
Возвращает: numpy.ndarray или None
frame = client.get_latest_frame()
if frame is not None:
cv2.imshow('Latest Frame', frame)
is_connected()
Проверяет статус соединения.
Возвращает: bool
if client.is_connected():
print("Соединение активно")
get_connection_error()
Возвращает последнюю ошибку соединения.
Возвращает: str или None
error = client.get_connection_error()
if error:
print(f"Ошибка: {error}")
disconnect()
Закрывает соединение и освобождает ресурсы.
client.disconnect()
cleanup()
Альтернативный метод для освобождения ресурсов.
client.cleanup()
Примеры использования
Запуск сервера
Основной способ запуска сервера - через консольную команду:
# Базовый запуск с веб-камерой
c4ipcam
# Настройка хоста и порта
c4ipcam --host 0.0.0.0 --port 9999
# Использование конкретной камеры
c4ipcam --camera 1
# Полная настройка с аутентификацией
c4ipcam --host 0.0.0.0 --port 9999 --password secure123 --width 1920 --height 1080 --quality 90 --fps 15
Параметры командной строки:
--host- IP-адрес сервера (по умолчанию localhost)--port- Порт сервера (по умолчанию 8000)--camera- ID камеры (по умолчанию 0)--password- Пароль для аутентификации (по умолчанию пустой)--width- Ширина кадра в пикселях (по умолчанию 640)--height- Высота кадра в пикселях (по умолчанию 480)--quality- Качество JPEG сжатия 1-100% (по умолчанию 85)--fps- Целевая частота кадров (по умолчанию 30)
Клиент с обработкой ошибок
from c4ipcam import CameraClient
import cv2
import time
def main():
client = CameraClient("localhost", 9999, password="secure123")
# Попытка подключения с повторами
max_retries = 5
for attempt in range(max_retries):
if client.connect():
print("Успешно подключен к серверу")
break
else:
print(f"Попытка {attempt + 1}/{max_retries} не удалась: {client.get_connection_error()}")
if attempt < max_retries - 1:
time.sleep(2)
else:
print("Не удалось подключиться к серверу")
return
try:
while client.is_connected():
ret, frame = client.read(timeout=1.0)
if not ret:
print("Таймаут или ошибка получения кадра")
continue
# Обработка кадра
cv2.imshow('Camera Feed', frame)
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
elif key == ord('s'):
# Сохранение кадра
cv2.imwrite(f'frame_{int(time.time())}.jpg', frame)
print("Кадр сохранен")
except KeyboardInterrupt:
print("Прерывание пользователем")
finally:
client.disconnect()
cv2.destroyAllWindows()
if __name__ == "__main__":
main()
Программное использование сервера (опционально)
Если нужно интегрировать сервер в другое приложение:
from c4ipcam import CameraServer
server = CameraServer(
host='0.0.0.0',
port=9999,
camera_id=0,
password="secure123",
width=1280,
height=720,
compression_quality=85,
fps=25
)
try:
server.start_server()
except KeyboardInterrupt:
server.cleanup()
Настройки для разных сценариев
# Высокое качество для анализа
hq_client = CameraClient("server_ip", 9999, password="pass", compression_quality=95)
# Быстрая передача для превью
fast_client = CameraClient("server_ip", 9999, password="pass", compression_quality=60)
Устранение неполадок
Сервер не запускается
- Проверьте, что порт не занят другим приложением
- Убедитесь, что камера доступна и не используется другим приложением
- Проверьте права доступа к камере
- Убедитесь, что указанное разрешение поддерживается камерой
Клиент не может подключиться
- Убедитесь, что сервер запущен и прослушивает правильный порт
- Проверьте правильность пароля (если используется аутентификация)
- Проверьте сетевое соединение между клиентом и сервером
- Убедитесь, что брандмауэр не блокирует соединение
Низкое качество или задержка видео
- Уменьшите разрешение камеры на сервере (
--width,--height) - Снизьте качество сжатия (
--quality) - Уменьшите частоту кадров (
--fps) - Увеличьте размер буфера на клиенте
- Используйте более быстрое сетевое соединение
Ошибки при получении кадров
- Проверьте стабильность сетевого соединения
- Увеличьте таймаут при чтении кадров
- Добавьте логику переподключения в клиенте
- Проверьте правильность аутентификации
Ошибки аутентификации
- Убедитесь, что пароль указан правильно на сервере и клиенте
- Проверьте, что пароли совпадают точно (учитывается регистр)
- Если пароль не нужен, оставьте поле пустым на обеих сторонах
Зависимости
- Python 3.6+
- opencv-python>=4.11.0.86 (автоматически устанавливается)
- numpy>=1.21.0 (автоматически устанавливается)
Все зависимости устанавливаются автоматически при установке библиотеки через pip.
Лицензия
Этот проект распространяется под лицензией MIT.
Поддержка
- GitHub: https://github.com/rtcctc/c4ipcam
- PyPI: https://pypi.org/project/c4ipcam/
- Автор: 4edbark (vangogprogprog@gmail.com)
При возникновении вопросов или проблем создайте issue в репозитории проекта на GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file c4ipcam-0.0.4.tar.gz.
File metadata
- Download URL: c4ipcam-0.0.4.tar.gz
- Upload date:
- Size: 14.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
efa5bab679b97913b956ab980281e764736a31b40f93663ebee70ef694a1880b
|
|
| MD5 |
b02bca716103ec04500f084b00b80beb
|
|
| BLAKE2b-256 |
a27bd33ea84d8e1ab5b9a9c7467d6dc04887e57fa06a2d7c19815dac2ae2522a
|
File details
Details for the file c4ipcam-0.0.4-py3-none-any.whl.
File metadata
- Download URL: c4ipcam-0.0.4-py3-none-any.whl
- Upload date:
- Size: 10.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.11.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b145b276900d3bbd09bcd0f771fcb09e6ce8ebf4317819b366a89bd27e7edda3
|
|
| MD5 |
d9c5e788b451adfae48ff87457397652
|
|
| BLAKE2b-256 |
37cbe6ab9ddc56efca58df75452c12f292df9df34da629994a9a2cb42103b6f9
|