Tabla de contenido:

Reproducir video con ESP32: 10 pasos (con imágenes)
Reproducir video con ESP32: 10 pasos (con imágenes)

Video: Reproducir video con ESP32: 10 pasos (con imágenes)

Video: Reproducir video con ESP32: 10 pasos (con imágenes)
Video: ESP32 CAM Conexión y Configuración Desde Cero Paso a Paso 2024, Noviembre
Anonim
Reproducir video con ESP32
Reproducir video con ESP32

Estos Instructables muestran algo sobre la reproducción de video y audio con ESP32.

Paso 1: Funciones y limitaciones de ESP32

Características

  • 4 bus SPI, 2 bus SPI disponibles para espacio de usuario, son SPI2 y SPI3 o se denominan HSPI y VSPI. Ambos buses SPI pueden funcionar como máximo a 80 MHz. En teoría, puede enviar píxeles de color de 320x240 de 16 bits a SPI LCD a 60 fps, pero aún no ha contado el tiempo de sobrecarga requerido para leer y decodificar los datos de video.
  • El bus SD de 1 bit / 4 bit puede conectar la tarjeta SD en protocolo nativo
  • Salida de audio DAC interna I2S
  • más de 100 KB de RAM disponible para búfer de audio y video
  • Potencia de procesamiento suficiente para decodificar JPEG (reproducir Motion JPEG) y compresión de datos LZW (reproducir-g.webp" />
  • La versión de doble núcleo puede dividir los datos de lectura de la tarjeta SD, decodificar y enviar a SPI LCD en múltiples tareas paralelas y aumentar el rendimiento de la reproducción

Limitaciones

  • no hay suficiente RAM interna para tener un búfer de doble cuadro para 320x240 en color de 16 bits, lo que limita el diseño multitarea. Puede superar un poco con PSRAM externo aunque es más lento que la RAM interna
  • no hay suficiente potencia de procesamiento para decodificar video mp4
  • no todas las versiones de ESP32 tienen 2 núcleos, la muestra de tareas múltiples solo se beneficia en la versión de doble núcleo

Ref.:

Paso 2: formato de video

RGB565

O llamado color de 16 bits es un formato de datos sin procesar que se usa comúnmente en la comunicación entre la MCU y la pantalla a color. Cada píxel de color representado por un valor de 16 bits, los primeros 5 bits son el valor rojo, los siguientes 6 bits son el valor verde y luego el valor azul de 5 bits. El valor de 16 bits puede hacer una variación de color de 65536, por lo que también se llama colores de 64K. Por lo tanto, el tamaño del video de 1 minuto 320x240 @ 30 fps será: 16 * 320 * 240 * 30 * 60 = 2211840000 bits = 276480000 bytes o más de 260 MB

Este es un formato de archivo común en la web desde la década de 1990. Limita la variación de color para cada pantalla hasta 256 colores y no repite almacenar el píxel del mismo color que el marco anterior. Por lo tanto, puede reducir mucho el tamaño del archivo, especialmente cuando cada cuadro de animación no cambia demasiados detalles. La compresión LZW está diseñada para ser decodificada por una computadora de la década de 1990, por lo que ESP32 también tiene una potencia de procesamiento suficiente para decodificarla en tiempo real.

Motion JPEG

O llamado M-JPEG / MJPEG es un formato de compresión de video común para el hardware de captura de video con potencia de procesamiento limitada. En realidad, es simplemente una concatenación de cuadros JPEG fijos. Compare con MPEG o MP4, Motion JPEG no necesita una técnica computacionalmente intensiva de predicción entre cuadros, cada cuadro es independiente. Por lo que requiere menos recursos para codificar y decodificar.

Árbitro.:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Paso 3: formato de audio

PCM

Un formato de datos sin procesar para audio digital. ESP32 DAC utiliza una profundidad de bits de 16 bits, lo que significa que cada dato de 16 bits representa una señal analógica digital muestreada. La mayoría de los videos y el audio de canciones usan comúnmente una frecuencia de muestreo de 44100 MHz, lo que significa 44100 señales analógicas muestreadas por cada segundo. Por lo tanto, los datos en bruto PCM de audio mono de 1 minuto tendrán un tamaño: 16 * 44100 * 60 = 42336000 bits = 5292000 bytes o más de 5 MB. El tamaño del audio estéreo será el doble, es decir, más de 10 MB.

MP3

MPEG Layer 3 es un formato de audio comprimido ampliamente utilizado para la compresión de canciones desde la década de 1990. Puede reducir drásticamente el tamaño del archivo a menos de una décima parte del formato PCM sin procesar

Árbitro.:

en.wikipedia.org/wiki/Pulse-code_modulatio…

en.wikipedia.org/wiki/MP3

Paso 4: conversión de formato

Este proyecto utiliza FFmpeg para convertir el video en formato legible ESP32.

Descargue e instale FFmpeg en su sitio oficial si aún no lo ha hecho:

Convertir a audio PCM

ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 44100_u16le.pcm

Convertir a audio MP3

ffmpeg -i entrada.mp4 -ar 44100 -ac 1 -q: a 9 44100.mp3

Convierta a RGB565

ffmpeg -i input.mp4 -vf "fps = 9, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0" -c: v rawvideo -pix_fmt rgb565be 220_9fps. rgb

Convertir a-g.webp

ffmpeg -i input.mp4 -vf "fps = 15, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0, split [s0] [s1]; [s0] palettegen [p]; [s1] [p] paletteuse "-loop -1 220_15fps.gif

Convertir a Motion JPEG

ffmpeg -i input.mp4 -vf "fps = 30, scale = -1: 176: flags = lanczos, crop = 220: in_h: (in_w-220) / 2: 0" -q: v 9220_30fps.mjpeg

Nota:

El-g.webp" />

Paso 5: preparación del hardware

Preparación del hardware
Preparación del hardware

Tablero de desarrollo ESP32

Cualquier placa de desarrollo ESP32 de doble núcleo debería estar bien, esta vez estoy usando un TTGO ESP32-Micro.

Pantalla a color

Cualquier pantalla a color que admita Arduino_GFX debería estar bien, esta vez estoy usando una placa de conexión ILI9225 con ranura para tarjeta SD.

Puede encontrar la lista de visualización de color compatible con Arduino_GFX en Github:

github.com/moononournation/Arduino_GFX

Tarjeta SD

Cualquier tarjeta SD debería estar bien, esta vez estoy usando una micro SD de 8 GB de "velocidad normal" SanDisk con adaptador SD.

Audio

Si solo desea usar auriculares, simplemente conecte los pines de los auriculares al pin 26 y GND podrá escuchar el audio. O puede usar un pequeño amplificador para reproducir audio con el altavoz.

Otros

Algunas placas de prueba y cables de placa de pruebas

Paso 6: Interfaz SD

Interfaz SD
Interfaz SD
Interfaz SD
Interfaz SD

La placa de ruptura LCD ILI9225 también incluyó clavijas de ruptura de ranura SD crd. Se puede utilizar como bus SPI o bus SD de 1 bit. Como mencioné en mis instrucciones anteriores, prefiero usar un bus SD de 1 bit, por lo que este proyecto se basará en un bus SD de 1 bit.

Paso 7: Ponlo junto

Ponlo junto
Ponlo junto
Ponlo junto
Ponlo junto
Ponlo junto
Ponlo junto

Las imágenes de arriba muestran la plataforma de prueba que estoy usando en este proyecto. La placa blanca está impresa en 3D, puede descargarla e imprimirla en Thingiverse:

La conexión real depende del hardware que tenga a mano.

Aquí está el resumen de la conexión:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0 / MISO -> Resistencia 1k -> Vcc GPIO 14 -> SD CLK GPIO 15 -> SD CMD / MOSI GPIO 18 -> LCD SCK GPIO 19 -> LCD MISO GPIO 22 -> LCD LED GPIO 23 -> LCD MOSI GPIO 27 -> LCD DC / RS GPIO 33 -> LCD RST

Ref.:

Paso 8: Programa

Programa
Programa

IDE de Arduino

Descargue e instale Arduino IDE si aún no lo ha hecho:

www.arduino.cc/en/main/software

Soporte ESP32

Siga las instrucciones de instalación para agregar compatibilidad con ESP32 si aún no lo ha hecho:

github.com/espressif/arduino-esp32

Biblioteca Arduino_GFX

Descargue las últimas bibliotecas Arduino_GFX: (presione "Clonar o Descargar" -> "Descargar ZIP")

github.com/moononournation/Arduino_GFX

Importar bibliotecas en Arduino IDE. (Menú "Sketch" de Arduino IDE -> "Incluir biblioteca" -> "Agregar biblioteca. ZIP" -> seleccione el archivo ZIP descargado)

ESP8266 Audio

Descargue las últimas bibliotecas de audio ESP8266: (presione "Clonar o Descargar" -> "Descargar ZIP")

github.com/earlephilhower/ESP8266Audio

Importar bibliotecas en Arduino IDE. (Menú "Sketch" de Arduino IDE -> "Incluir biblioteca" -> "Agregar biblioteca. ZIP" -> seleccione el archivo ZIP descargado)

Código de muestra RGB565_video

Descargue el último código de muestra RGB565_video: (presione "Clonar o Descargar" -> "Descargar ZIP")

github.com/moononournation/RGB565_video

Datos de la tarjeta SD

Copie los archivos convertidos a la tarjeta SD e insértelos en la ranura para tarjetas LCD

Compilar y cargar

  1. Abra SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino en Arduino IDE
  2. Si no está utilizando ILI9225, cambie el nuevo código de clase (alrededor de la línea 35) para corregir el nombre de la clase.
  3. Presione el botón "Cargar" de Arduino IDE
  4. Si no pudo cargar el programa, intente desconectar la conexión entre ESP32 GPIO 2 y SD D0 / MISO
  5. Si encuentra que la orientación no es correcta, cambie el valor de "rotación" (0-3) en el nuevo código de clase
  6. Si el programa se ejecuta bien, puede probar con otro ejemplo de inicio con SDMMC_ *
  7. Si no tiene una ranura para tarjeta SD o no tiene FFmpeg instalado, aún puede probar el ejemplo SPIFFS_ *

Paso 9: Benchmark

Punto de referencia
Punto de referencia

Aquí está el resumen de rendimiento para diferentes formatos de video (220x176) y audio (44100 MHz):

Formato Cuadro por segundo (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Nota:

  • MJPEG + PCM puede alcanzar fps más altos, pero no es necesario reproducirlo en una pantalla pequeña de más de 30 fps
  • RGB565 no requiere un proceso de decodificación, pero el tamaño de los datos es demasiado grande y se consume mucho tiempo para cargar datos desde SD, el bus SD de 4 bits y la tarjeta SD más rápida pueden mejorarlo un poco (la suposición salvaje puede alcanzar alrededor de 12 fps)
  • El proceso de decodificación de MP3 aún no está optimizado, ahora está dedicado el núcleo 0 para la decodificación de MP3 y el núcleo 1 para la reproducción de video

Paso 10: ¡Feliz juego

¡Feliz jugando!
¡Feliz jugando!

Ahora puede reproducir video y audio con su ESP32, ¡desbloqueó muchas posibilidades!

Creo que haré una pequeña televisión vintage más tarde …

Recomendado: