import cv2
import numpy as np
def mp4_to_mono_bin(input_video, output_bin, width=240, height=240, threshold=100, max_frames=60):
"""
Конвертирует MP4/GIF в 1-битный бинарный файл (8 пикселей в 1 байт).
- width, height: разрешение кадра (должно делиться на 8, например 240х240)
- threshold: порог яркости (0-255). Всё, что ярче этого значения, становится белым (1)
- max_frames: максимальное количество кадров
"""
cap = cv2.VideoCapture(input_video)
if not cap.isOpened():
print(f"Ошибка: не удалось открыть видеофайл '{input_video}'")
return
frame_count = 0
total_bytes = 0
with open(output_bin, 'wb') as f:
while cap.isOpened() and frame_count < max_frames:
ret, frame = cap.read()
if not ret:
break
# 1. Меняем размер кадра под экран (например, 240x240)
resized = cv2.resize(frame, (width, height))
# 2. Переводим цветное видео в оттенки серого
gray = cv2.cvtColor(resized, cv2.COLOR_BGR2GRAY)
# 3. Отсекаем всё темное: пиксели ярче threshold становятся 1 (белый), остальные 0 (черный)
_, binary = cv2.threshold(gray, threshold, 1, cv2.THRESH_BINARY)
# 4. Упаковываем каждые 8 пикселей (бит) в 1 байт
packed_bytes = np.packbits(binary).tobytes()
# 5. Записываем упакованный кадр в файл
f.write(packed_bytes)
frame_count += 1
total_bytes += len(packed_bytes)
cap.release()
frame_size_kb = (width * height / 8) / 1024
total_kb = total_bytes / 1024
print("=" * 45)
print(f" УСПЕШНО КОНВЕРТИРОВАНО!")
print(f" Файл сохранён как: '{output_bin}'")
print(f" Всего кадров: {frame_count}")
print(f" Вес 1 кадра ({width}x{height}): {frame_size_kb:.1f} КБ")
print(f" Полный вес файла: {total_kb:.1f} КБ ({total_kb/1024:.2f} МБ)")
print("=" * 45)
# --- НАСТРОЙКА И ЗАПУСК ---
if __name__ == "__main__":
mp4_to_mono_bin(
input_video="lv_0_20261004093134.mp4", # Имя твоего видео файла на компе
output_bin="LOVE.bin", # Имя готового файла для ESP32
width=240, # Ширина (например, 240 или 128)
height=240, # Высота (например, 240 или 128)
threshold=80, # Порог яркости (если белый цвет тусклый, уменьши до 50)
max_frames=90 # Ограничение по кадрам (на сколько кадров резать)
)