Inhoudsopgave:

Video afspelen met ESP32: 10 stappen (met afbeeldingen)
Video afspelen met ESP32: 10 stappen (met afbeeldingen)

Video: Video afspelen met ESP32: 10 stappen (met afbeeldingen)

Video: Video afspelen met ESP32: 10 stappen (met afbeeldingen)
Video: Montageprogramma opent video niet?! | Zo werkt Handbrake | de Videomakers 2024, November
Anonim
Video afspelen met ESP32
Video afspelen met ESP32

Deze Instructables laten iets zien over het afspelen van video en audio met ESP32.

Stap 1: ESP32-functies en beperkingen

Functies

  • 4 SPI-bus, 2 SPI-bus beschikbaar voor gebruikersruimte, ze zijn SPI2 en SPI3 of worden HSPI en VSPI genoemd. Beide SPI-bussen kunnen maximaal 80 MHz lopen. Theoretisch kan het 320x240 16-bits kleurenpixels naar SPI LCD sturen met 60 fps, maar het heeft nog niet de overhead geteld die nodig is voor het lezen en decoderen van de videogegevens.
  • 1-bit / 4-bit SD-bus kan SD-kaart aansluiten in native protocol
  • I2S interne DAC-audio-uitgang
  • meer dan 100 KB RAM beschikbaar voor video- en audiobuffer
  • Redelijk genoeg verwerkingskracht om JPEG (play Motion JPEG) en LZW-gegevenscompressie (play Animated GIF) te decoderen
  • Dual-core versie kan leesgegevens van SD-kaart splitsen, decoderen en pushen naar SPI LCD in parallelle multi-taken en de afspeelprestaties verbeteren

Beperkingen

  • niet genoeg interne RAM om dubbele framebuffer te hebben voor 320x240 in 16-bits kleur, het beperkte het multitask-ontwerp. Het kan een beetje overwinnen met externe PSRAM, hoewel het langzamer is dan interne RAM
  • niet genoeg verwerkingskracht om mp4-video te decoderen
  • niet alle ESP32-versies hebben 2 cores, het multi-task-voorbeeld profiteert alleen van de dual-core-versie

Ref.:

Stap 2: Videoformaat

RGB565

Of 16-bits kleur genoemd, is een onbewerkt gegevensformaat dat vaak wordt gebruikt voor de communicatie tussen MCU en kleurenscherm. Elke kleurpixel wordt vertegenwoordigd door een 16-bits waarde, de eerste 5-bit is de rode waarde, de volgende 6-bit is de groene waarde en vervolgens de 5-bits blauwe waarde. 16-bits waarde kan 65536 kleurvariatie maken, dus het wordt ook wel 64K-kleuren genoemd. Dus 1 minuut 320x240@30 fps video heeft het formaat: 16 * 320 * 240 * 30 * 60 = 2211840000 bits = 276480000 bytes of meer dan 260 MB

Geanimeerde GIF

Dit is een veelgebruikte bestandsindeling op internet sinds de jaren negentig. Het beperkt de kleurvariatie voor elk scherm tot 256 kleuren en slaat de pixel niet herhaaldelijk op in dezelfde kleur als het vorige frame. Het kan dus de bestandsgrootte aanzienlijk verkleinen, vooral wanneer elk animatieframe niet te veel details verandert. De LZW-compressie is ontworpen om te worden gedecodeerd door een computer uit de jaren 90, dus ESP32 heeft ook voldoende verwerkingskracht om het in realtime te decoderen.

Bewegings-JPEG

Of genaamd M-JPEG / MJPEG is een veelgebruikt videocompressieformaat voor de video-opnamehardware met beperkte verwerkingskracht. Het is eigenlijk gewoon een aaneenschakeling van stilstaande JPEG-frames. Vergelijk met MPEG of MP4, Motion JPEG heeft geen rekenintensieve techniek van interframe-voorspelling nodig, elk frame is onafhankelijk. Het vereist dus minder middelen om te coderen en te decoderen.

ref.:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Stap 3: Audio-indeling

PCM

Een onbewerkt gegevensformaat voor digitale audio. ESP32 DAC gebruikt 16-bits bitdiepte, wat betekent dat elke 16-bits data een digitaal gesampled analoog signaal vertegenwoordigt. De meeste video- en songaudio gebruiken gewoonlijk een samplefrequentie van 44100 MHz, dat wil zeggen 44100 gesampled analoog signaal voor elke seconde. Dus, 1 minuut mono audio PCM onbewerkte data zal worden gedimensioneerd: 16 * 44100 * 60 = 42336000 bits = 5292000 bytes of meer dan 5 MB. De grootte van stereo-audio zal dubbel zijn, d.w.z. meer dan 10 MB

MP3

MPEG Layer 3 is een gecomprimeerd audioformaat dat sinds de jaren negentig veel wordt gebruikt voor het comprimeren van nummers. Het kan de bestandsgrootte drastisch verkleinen tot minder dan een tiende van het onbewerkte PCM-formaat

ref.:

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

en.wikipedia.org/wiki/MP3

Stap 4: Formaatconversie

Dit project gebruikt FFmpeg om de video om te zetten in een leesbaar ESP32-formaat.

Download en installeer FFmpeg op hun officiële site als dat nog niet het geval is:

Converteren naar PCM-audio

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

Converteren naar MP3-audio

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

Converteren naar 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

Converteren naar geanimeerde GIF

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

Converteren naar 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

Opmerking:

Met FFmpeg geconverteerde geanimeerde-g.webp" />

Stap 5: Hardwarevoorbereiding

Hardwarevoorbereiding
Hardwarevoorbereiding

ESP32-ontwikkelbord

Elk dual-core ESP32-ontwikkelbord zou in orde moeten zijn, deze keer gebruik ik een TTGO ESP32-Micro.

Kleurenscherm

Elk kleurenscherm dat Arduino_GFX ondersteunt, zou in orde moeten zijn, deze keer gebruik ik een ILI9225 breakout-bord met SD-kaartsleuf.

U kunt de door Arduino_GFX ondersteunde kleurenweergavelijst vinden op Github:

github.com/moononournation/Arduino_GFX

SD-kaart

Elke SD-kaart zou in orde moeten zijn, deze keer gebruik ik een SanDisk "normale snelheid" 8 GB micro SD met SD-adapter.

Audio

Als u alleen een hoofdtelefoon wilt gebruiken, sluit u gewoon de hoofdtelefoonpinnen aan op pin 26 en GND kan de audio beluisteren. Of u kunt een kleine versterker gebruiken om audio af te spelen met een luidspreker.

anderen

Sommige breadboards en breadboard-draden

Stap 6: SD-interface

SD-interface
SD-interface
SD-interface
SD-interface

ILI9225 LCD breakout board bevatte ook een SD crd slot breakout pins. Het kan worden gebruikt als SPI-bus of 1-bit SD-bus. Zoals vermeld in mijn vorige instructables, gebruik ik liever 1-bit SD-bus, dus dit project zal gebaseerd zijn op 1-bit SD-bus.

Stap 7: Zet het samen

Zet het samen
Zet het samen
Zet het samen
Zet het samen
Zet het samen
Zet het samen

De bovenstaande foto's tonen het testplatform dat ik in dit project gebruik. Het witte breadboard is 3D geprint, je kunt het downloaden en printen op thingiverse:

De daadwerkelijke verbinding hangt af van welke hardware je in handen hebt.

Hier is het verbindingsoverzicht:

ESP32

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

Stap 8: Programmeren

Programma
Programma

Arduino IDE

Download en installeer Arduino IDE als je het nog niet doet:

www.arduino.cc/en/main/software

ESP32-ondersteuning:

Volg de installatie-instructies om ESP32-ondersteuning toe te voegen als u dit nog niet doet:

github.com/espressif/arduino-esp32

Arduino_GFX-bibliotheek

Download de nieuwste Arduino_GFX-bibliotheken: (druk op "Clone or Download" -> "Download ZIP")

github.com/moononournation/Arduino_GFX

Importeer bibliotheken in Arduino IDE. (Arduino IDE "Sketch" Menu -> "Include Library" -> "Add. ZIP Library" -> selecteer gedownload ZIP-bestand)

ESP8266Audio

Download de nieuwste ESP8266Audio-bibliotheken: (druk op "Clone or Download" -> "Download ZIP")

github.com/earlephilhower/ESP8266Audio

Importeer bibliotheken in Arduino IDE. (Arduino IDE "Sketch" Menu -> "Include Library" -> "Add. ZIP Library" -> selecteer gedownload ZIP-bestand)

RGB565_video Voorbeeldcode

Download de nieuwste RGB565_video voorbeeldcode: (druk op "Clone or Download" -> "Download ZIP")

github.com/moononournation/RGB565_video

SD-kaartgegevens

Kopieer de geconverteerde bestanden naar de SD-kaart en plaats ze in de LCD-kaartsleuf

Compileren en uploaden

  1. Open SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino in Arduino IDE
  2. Als u ILI9225 niet gebruikt, wijzigt u de nieuwe klascode (rond regel 35) om de klasnaam te corrigeren
  3. Druk op de Arduino IDE "Upload" knop
  4. Als u het programma niet kon uploaden, probeer dan de verbinding tussen ESP32 GPIO 2 en SD D0/MISO te verbreken
  5. Als u vindt dat de oriëntatie niet correct is, wijzigt u de "rotatie" -waarde (0-3) in de nieuwe klassecode
  6. Als het programma goed loopt, kunt u een ander voorbeeld proberen met SDMMC_*
  7. Als je geen SD-kaartsleuf hebt of als je FFmpeg niet hebt geïnstalleerd, kun je nog steeds het SPIFFS_*-voorbeeld proberen

Stap 9: Benchmark

Benchmark
Benchmark

Hier zijn de prestatiesamenvattingen voor verschillende video (220x176) en audio (44100 MHz) formaten:

Formaat Frame per seconde (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Opmerking:

  • MJPEG + PCM kunnen hogere fps bereiken, maar het is onnodig om te spelen op een klein scherm van meer dan 30 fps
  • RGB565 vereist geen decoderingsproces, maar de gegevensgrootte is te groot en kost veel tijd bij het laden van gegevens van SD, 4-bit SD-bus en snellere SD-kaart kan het een beetje verbeteren (wilde gok kan ongeveer 12 fps bereiken)
  • MP3-decoderingsproces is nog niet geoptimaliseerd, het is nu gewijd aan core 0 voor MP3-decodering en core 1 voor het afspelen van video

Stap 10: Veel plezier met spelen

Veel plezier met spelen!
Veel plezier met spelen!

Nu kun je video en audio afspelen met je ESP32, het heeft veel mogelijkheden ontgrendeld!

Ik denk dat ik later een kleine vintage tv ga maken…

Aanbevolen: