Taula de continguts:

Reprodueix vídeo amb ESP32: 10 passos (amb imatges)
Reprodueix vídeo amb ESP32: 10 passos (amb imatges)

Vídeo: Reprodueix vídeo amb ESP32: 10 passos (amb imatges)

Vídeo: Reprodueix vídeo amb ESP32: 10 passos (amb imatges)
Vídeo: TINETjornada 2013: "Raspberry Pi, un enginy personal?", amb Climent Aparicio i David Pàmies 2024, Desembre
Anonim
Reprodueix vídeo amb ESP32
Reprodueix vídeo amb ESP32

Aquest document instructiu mostra alguna cosa sobre la reproducció de vídeo i àudio amb ESP32.

Pas 1: Funcions i limitacions de l'ESP32

Característiques

  • 4 bus SPI, 2 bus SPI disponibles per a l’espai de l’usuari, són SPI2 i SPI3 o s’anomenen HSPI i VSPI. Tots dos autobusos SPI poden funcionar com a màxim a 80 MHz. Teòricament pot impulsar 320x240 píxels de color de 16 bits a SPI LCD a 60 fps, però encara no ha comptat el temps de despesa necessari per llegir i descodificar les dades de vídeo.
  • El bus SD d’1 bit / 4 bits pot connectar la targeta SD en protocol natiu
  • Sortida d’àudio DAC interna I2S
  • més de 100 KB de RAM disponibles per a memòria intermèdia de vídeo i àudio
  • Potència de processament suficient per descodificar JPEG (reproduir Motion JPEG) i compressió de dades LZW (reproduir-g.webp" />
  • La versió de doble nucli pot dividir les dades de lectura de la targeta SD, descodificar-les i enviar-les a SPI LCD en múltiples tasques paral·leles i augmentar el rendiment de la reproducció

Limitacions

  • no hi ha prou memòria RAM interna per tenir doble memòria intermèdia per a 320x240 en color de 16 bits, limitava el disseny multitarea. Es pot superar una mica amb PSRAM extern, tot i que és més lent que la RAM interna
  • no hi ha prou potència de processament per descodificar el vídeo mp4
  • no totes les versions ESP32 tenen 2 nuclis, la mostra de múltiples tasques només es beneficia en la versió de doble nucli

Ref.:

Pas 2: format de vídeo

RGB565

O anomenat color de 16 bits és un format de dades en brut que s’utilitza habitualment en la comunicació entre la MCU i la visualització en color. Cada píxel de color representat per un valor de 16 bits, el primer de 5 bits és de color vermell, després de 6 bits és de color verd i després de 5 bits de color blau. El valor de 16 bits pot fer una variació de color 65536, de manera que també s’anomena colors de 64K. Així, el vídeo de 1 minut 320x240 @ 30 fps tindrà una mida: 16 * 320 * 240 * 30 * 60 = 2211840000 bits = 276480000 bytes o més de 260 MB

Es tracta d’un format de fitxer habitual al web des dels anys noranta. Limita la variació de color per a cada pantalla fins a 256 colors i no repeteix emmagatzemar el píxel amb el mateix color que el marc anterior. Per tant, pot reduir la mida del fitxer, sobretot quan cada marc d’animació no canvia massa detalls. La compressió LZW està dissenyada per a la descodificació de l'ordinador dels anys 90, de manera que ESP32 també té una potència de processament suficient per descodificar-la en temps real.

Motion JPEG

O anomenat M-JPEG / MJPEG és un format de compressió de vídeo comú per al maquinari de captura de vídeo amb una potència de processament limitada. En realitat, és simplement una concatenació de fotogrames JPEG. Compareu-lo amb MPEG o MP4, Motion JPEG no necessita una tècnica computacional intensiva de predicció d’interframe, cada fotograma és independent. Per tant, requereix menys recursos per codificar i descodificar.

Ref.:

ca.wikipedia.org/wiki/List_of_monochrome_a…

ca.wikipedia.org/wiki/GIF

ca.wikipedia.org/wiki/Motion_JPEG

Pas 3: format d'àudio

PCM

Un format de dades en brut per a àudio digital. El DAC ESP32 utilitza una profunditat de bits de 16 bits, és a dir, cada dada de 16 bits representa un senyal analògic mostrejat digitalment. La majoria de l'àudio de vídeo i cançó solen utilitzar una freqüència de mostreig a 44100 MHz, és a dir, 44100 de senyal analògic mostrat per cada segon. Per tant, les dades brutes PCM d’àudio mono d’1 minut tindran una mida: 16 * 44100 * 60 = 42336000 bits = 5292000 bytes o més de 5 MB. La mida de l’àudio estèreo serà doble, és a dir, superarà els 10 MB

MP3

MPEG Layer 3 és un format d’àudio comprimit molt utilitzat per a la compressió de cançons des dels anys noranta. Pot reduir dràsticament la mida del fitxer a menys d’una desena part del format PCM en brut

Ref.:

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

ca.wikipedia.org/wiki/MP3

Pas 4: formatar la conversió

Aquest projecte utilitza FFmpeg per convertir el vídeo en format llegible ESP32.

Si us plau, descarregueu i instal·leu FFmpeg al seu lloc oficial:

Converteix a àudio PCM

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

Converteix a àudio MP3

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

Converteix 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

Converteix 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

Converteix 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 9 220_30fps.mjpeg

Nota:

Algunes eines web poden optimitzar el-g.webp" />

Pas 5: Preparació del maquinari

Preparació del maquinari
Preparació del maquinari

ESP32 Dev Board

Qualsevol placa de desenvolupament ESP32 de doble nucli hauria d’estar bé, aquesta vegada estic fent servir un TTGO ESP32-Micro.

Pantalla en color

Qualsevol pantalla en color que admeti Arduino_GFX hauria d’estar bé, aquesta vegada estic fent servir una placa de ruptura ILI9225 amb ranura per a targeta SD.

Podeu trobar la llista de visualització de color compatible amb Arduino_GFX a Github:

github.com/moononournation/Arduino_GFX

Targeta SD

Qualsevol targeta SD hauria d’estar bé, aquesta vegada estic fent servir un microSD SanDisk de “velocitat normal” de 8 GB amb adaptador SD.

Àudio

Si voleu utilitzar només auriculars, simplement connecteu els pins dels auriculars al pin 26 i GND pot escoltar l'àudio. O podeu utilitzar un petit amplificador per reproduir àudio amb altaveus.

Altres

Algunes taules de fil i cables de taulers

Pas 6: interfície SD

Interfície SD
Interfície SD
Interfície SD
Interfície SD

El tauler de ruptura LCD ILI9225 també incloïa pins de ruptura de ranura SD. Es pot utilitzar com a bus SPI o bus SD de 1 bit. Com es va esmentar a les meves instruccions anteriors, prefereixo utilitzar bus SD d'1 bit, de manera que aquest projecte es basarà en bus SD d'1 bit.

Pas 7: uniu-lo

Posa-ho junts
Posa-ho junts
Posa-ho junts
Posa-ho junts
Posa-ho junts
Posa-ho junts

Les imatges anteriors mostren la plataforma de proves que estic fent servir en aquest projecte. La pissarra blanca està impresa en 3D, podeu descarregar-la i imprimir-la a thingiverse:

La connexió real depèn del maquinari que tingueu entre mans.

Aquí teniu el resum de la connexió:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0 / MISO -> 1k resistència -> 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.:

Pas 8: programa

Programa
Programa

IDE Arduino

Descarregueu i instal·leu Arduino IDE si encara no ho feu:

www.arduino.cc/ca/main/software

Suport ESP32

Seguiu les instruccions d'instal·lació per afegir suport ESP32 si encara no ho feu:

github.com/espressif/arduino-esp32

Biblioteca Arduino_GFX

Descarregueu les darreres biblioteques Arduino_GFX: (premeu "Clona o descarrega" -> "Descarrega ZIP")

github.com/moononournation/Arduino_GFX

Importeu biblioteques a Arduino IDE. (Arduino IDE "Sketch" Menu -> "Include Library" -> "Add. ZIP Library" -> select ZIP downloaded file)

ESP8266 Àudio

Descarregueu les darreres biblioteques d'Àudio ESP8266: (premeu "Clona o Baixa" -> "Baixa ZIP")

github.com/earlephilhower/ESP8266Audio

Importeu biblioteques a Arduino IDE. (Arduino IDE "Sketch" Menu -> "Include Library" -> "Add. ZIP Library" -> select ZIP downloaded file)

RGB565_codi de mostra de vídeo

Descarregueu el codi de mostra RGB565_video més recent: (premeu "Clona o descarrega" -> "Descarrega ZIP")

github.com/moononournation/RGB565_video

Dades de la targeta SD

Copieu els fitxers convertits a la targeta SD i inseriu-los a la ranura de la targeta LCD

Compila i penja

  1. Obriu SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino a Arduino IDE
  2. Si no utilitzeu ILI9225, canvieu el nou codi de classe (al voltant de la línia 35) per corregir el nom de la classe
  3. Premeu el botó Arduino IDE "Puja"
  4. Si no heu pogut carregar el programa, proveu de separar la connexió entre ESP32 GPIO 2 i SD D0 / MISO
  5. Si l'orientació no és correcta, canvieu el valor de "rotació" (0-3) al codi de classe nou
  6. Si el programa funciona correctament, podeu provar un altre exemple de començament amb SDMMC_ *
  7. Si no teniu ranura per a targeta SD o no teniu instal·lat FFmpeg, podeu provar l'exemple SPIFFS_ *

Pas 9: punt de referència

Punt de referència
Punt de referència

Aquí teniu el resum del rendiment per a diferents formats de vídeo (220x176) i àudio (44100 MHz):

Format Fotograma per segon (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Nota:

  • MJPEG + PCM pot assolir fps més alts, però no és necessari jugar en una pantalla petita superior a 30 fps
  • RGB565 no requereix un procés de descodificació, però la mida de les dades és massa gran i es consumeix molt de temps en carregar les dades des de la targeta SD, el bus SD de 4 bits i la targeta SD més ràpida.
  • Procés de descodificació MP3 encara no optimitzat, ara dedica el nucli 0 a la descodificació MP3 i el nucli 1 a la reproducció de vídeo

Pas 10: Feliç joc

Feliç jugant!
Feliç jugant!

Ara podeu reproduir vídeo i àudio amb el vostre ESP32, ja que desbloqueja moltes possibilitats.

Crec que faré un petit televisor vintage més endavant …

Recomanat: