Sommario:

Riproduci video con ESP32: 10 passaggi (con immagini)
Riproduci video con ESP32: 10 passaggi (con immagini)

Video: Riproduci video con ESP32: 10 passaggi (con immagini)

Video: Riproduci video con ESP32: 10 passaggi (con immagini)
Video: REALIZZARE CAMERA VIDEOSORVEGLIANZA CON ESP32 CAM *economica* 2024, Dicembre
Anonim
Riproduci video con ESP32
Riproduci video con ESP32

Questo Instructables mostra qualcosa sulla riproduzione di video e audio con ESP32.

Passaggio 1: funzionalità e limitazioni di ESP32

Caratteristiche

  • 4 bus SPI, 2 bus SPI disponibili per spazio utente, sono SPI2 e SPI3 o chiamati HSPI e VSPI. Entrambi i bus SPI possono funzionare al massimo a 80 MHz. Teoricamente può trasferire 320x240 pixel di colore a 16 bit a SPI LCD a 60 fps, ma non ha ancora conteggiato il tempo necessario per leggere e decodificare i dati video.
  • Il bus SD a 1 bit / 4 bit può collegare la scheda SD nel protocollo nativo
  • Uscita audio DAC interna I2S
  • oltre 100 KB di RAM disponibili per buffer video e audio
  • Potenza di elaborazione sufficiente per decodificare JPEG (riproduzione di Motion JPEG) e compressione dati LZW (riproduzione di-g.webp" />
  • La versione dual-core può dividere i dati di lettura dalla scheda SD, decodificare e inviare al display LCD SPI in multi-task paralleli e aumentare le prestazioni di riproduzione

Limitazioni

  • non abbastanza RAM interna per avere un doppio frame buffer per 320x240 a colori a 16 bit, limitava il design multitasking. Può superare un po' con la PSRAM esterna anche se è più lenta della RAM interna
  • potenza di elaborazione insufficiente per decodificare video mp4
  • non tutte le versioni di ESP32 hanno 2 core, il campione multi-task beneficia solo della versione dual-core

Rif.:

Passaggio 2: formato video

RGB565

O chiamato colore a 16 bit è un formato di dati grezzi comunemente utilizzato nella comunicazione tra MCU e display a colori. Ogni pixel di colore rappresentato da un valore a 16 bit, il primo a 5 bit è il valore rosso, i successivi 6 bit sono il valore verde e poi il valore blu a 5 bit. Il valore a 16 bit può creare 65536 variazioni di colore, quindi è anche chiamato 64K colori. Quindi il video di 1 minuto 320x240@30 fps sarà dimensionato: 16 * 320 * 240 * 30 * 60 = 2211840000 bit = 276480000 byte o oltre 260 MB

Questo è un formato di file comune sul Web dagli anni '90. Limita la variazione di colore per ogni schermo fino a 256 colori e non ripete la memorizzazione del pixel con lo stesso colore del fotogramma precedente. Quindi può ridurre molto la dimensione del file, specialmente quando ogni fotogramma dell'animazione non cambia troppi dettagli. La compressione LZW è progettata in grado di essere decodificata dal computer degli anni '90, quindi ESP32 ha anche una potenza di elaborazione sufficiente per decodificarla in tempo reale.

Motion JPEG

O chiamato M-JPEG / MJPEG è un formato di compressione video comune per l'hardware di acquisizione video con potenza di elaborazione limitata. In realtà è semplicemente una concatenazione di fotogrammi JPEG fermi. Confronta con MPEG o MP4, Motion JPEG non è necessaria una tecnica computazionalmente intensiva di previsione interframe, ogni fotogramma è indipendente. Quindi richiede meno risorse per codificare e decodificare.

Rif.:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Passaggio 3: formato audio

PCM

Un formato di dati grezzi per l'audio digitale. Il DAC ESP32 utilizza una profondità di bit a 16 bit, il che significa che ogni dato a 16 bit rappresenta un segnale analogico campionato digitale. La maggior parte dell'audio di video e canzoni utilizza comunemente una frequenza di campionamento a 44100 MHz, il che significa 44100 segnale analogico campionato per ogni secondo. Quindi, i dati grezzi PCM audio mono di 1 minuto verranno dimensionati: 16 * 44100 * 60 = 42336000 bit = 5292000 byte o oltre 5 MB. La dimensione dell'audio stereo sarà doppia, ovvero superiore a 10 MB

MP3

MPEG Layer 3 è un formato audio compresso ampiamente utilizzato per la compressione delle canzoni dagli anni '90. Può ridurre drasticamente le dimensioni del file a meno di un decimo del formato PCM grezzo

Rif.:

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

en.wikipedia.org/wiki/MP3

Passaggio 4: conversione del formato

Questo progetto utilizza FFmpeg per convertire il video in formato leggibile ESP32.

Si prega di scaricare e installare FFmpeg sul loro sito ufficiale se non ancora:

Converti in audio PCM

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

Converti in audio MP3

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

Converti in 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

Converti in-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

Converti in 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:

La-g.webp" />

Passaggio 5: preparazione dell'hardware

Preparazione dell'hardware
Preparazione dell'hardware

Scheda di sviluppo ESP32

Qualsiasi scheda di sviluppo ESP32 dual-core dovrebbe andare bene, questa volta sto usando un TTGO ESP32-Micro.

Display a colori

Qualsiasi display a colori che supporta Arduino_GFX dovrebbe essere ok, questa volta sto usando una scheda breakout ILI9225 con slot per schede SD.

Puoi trovare l'elenco dei display a colori supportati da Arduino_GFX su Github:

github.com/moononournation/Arduino_GFX

Scheda SD

Qualsiasi scheda SD dovrebbe andare bene, questa volta sto usando una micro SD SanDisk da 8 GB a "velocità normale" con adattatore SD.

Audio

Se si desidera utilizzare solo le cuffie, è sufficiente collegare i pin delle cuffie al pin 26 e GND può ascoltare l'audio. Oppure puoi usare un piccolo amplificatore per riprodurre l'audio con l'altoparlante.

Altri

Alcune breadboard e fili per breadboard

Passaggio 6: interfaccia SD

Interfaccia SD
Interfaccia SD
Interfaccia SD
Interfaccia SD

La scheda breakout LCD ILI9225 includeva anche un pin di breakout per slot crd SD. Può essere utilizzato come bus SPI o bus SD a 1 bit. Come menzionato nelle mie precedenti istruzioni, preferisco utilizzare il bus SD a 1 bit, quindi questo progetto si baserà sul bus SD a 1 bit.

Passaggio 7: mettilo insieme

Mettilo insieme
Mettilo insieme
Mettilo insieme
Mettilo insieme
Mettilo insieme
Mettilo insieme

Le immagini sopra mostrano la piattaforma di test che sto utilizzando in questo progetto. La breadboard bianca è stampata in 3D, puoi scaricarla e stamparla su whativerse:

La connessione effettiva dipende dall'hardware che hai in mano.

Ecco il riepilogo dei collegamenti:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0/MISO -> Resistenza 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

Rif.:

Passaggio 8: programma

Programma
Programma

Arduino IDE

Scarica e installa Arduino IDE se non lo sei ancora fatto:

www.arduino.cc/en/main/software

Supporto ESP32

Segui le istruzioni di installazione per aggiungere il supporto ESP32 se non lo hai ancora fatto:

github.com/espressif/arduino-esp32

Libreria Arduino_GFX

Scarica le ultime librerie Arduino_GFX: (premi "Clone or Download" -> "Download ZIP")

github.com/moononournation/Arduino_GFX

Importa librerie in Arduino IDE. (Menu "Sketch" dell'IDE Arduino -> "Includi libreria" -> "Aggiungi libreria. ZIP" -> seleziona il file ZIP scaricato)

ESP8266Audio

Scarica le ultime librerie ESP8266Audio: (premi "Clone or Download" -> "Download ZIP")

github.com/earlephilhower/ESP8266Audio

Importa librerie in Arduino IDE. (Menu "Sketch" dell'IDE Arduino -> "Includi libreria" -> "Aggiungi libreria. ZIP" -> seleziona il file ZIP scaricato)

Codice di esempio RGB565_video

Scarica l'ultimo codice di esempio RGB565_video: (premi "Clona o scarica" -> "Scarica ZIP")

github.com/moononournation/RGB565_video

Dati della scheda SD

Copia i file convertiti sulla scheda SD e inseriscili nello slot per schede LCD

Compila e carica

  1. Apri SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino nell'IDE di Arduino
  2. Se non stai usando ILI9225, cambia il nuovo codice classe (intorno alla riga 35) per correggere il nome della classe
  3. Premi il pulsante "Carica" dell'IDE Arduino
  4. Se non sei riuscito a caricare il programma, prova a scollegare la connessione tra ESP32 GPIO 2 e SD D0/MISO
  5. Se trovi che l'orientamento non è corretto, cambia il valore di "rotazione" (0-3) nel nuovo codice di classe
  6. Se il programma funziona bene puoi provare altri esempi di avvio con SDMMC_*
  7. Se non hai uno slot per schede SD o non hai FFmpeg installato, puoi comunque provare SPIFFS_* esempio

Passaggio 9: benchmark

Prova delle prestazioni
Prova delle prestazioni

Ecco il riepilogo delle prestazioni per diversi formati video (220x176) e audio (44100 MHz):

Formato Fotogramma al secondo (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Nota:

  • MJPEG + PCM può raggiungere fps più alti ma non è necessario giocare su uno schermo piccolo superiore a 30 fps
  • RGB565 non richiede il processo di decodifica, ma la dimensione dei dati è troppo grande e il tempo impiegato per caricare i dati da SD, bus SD a 4 bit e scheda SD più veloce può migliorarlo un po' (l'ipotesi azzardata può raggiungere circa 12 fps)
  • Processo di decodifica MP3 non ancora ottimizzato, ora è dedicato il core 0 per la decodifica MP3 e il core 1 per la riproduzione di video

Passaggio 10: buon gioco

Buon gioco!
Buon gioco!

Ora puoi riprodurre video e audio con il tuo ESP32, ha sbloccato molte possibilità!

Penso che più tardi realizzerò una piccola TV vintage…

Consigliato: