Inhoudsopgave:
- Stap 1: ESP32-functies en beperkingen
- Stap 2: Videoformaat
- Stap 3: Audio-indeling
- Stap 4: Formaatconversie
- Stap 5: Hardwarevoorbereiding
- Stap 6: SD-interface
- Stap 7: Zet het samen
- Stap 8: Programmeren
- Stap 9: Benchmark
- Stap 10: Veel plezier met spelen
Video: Video afspelen met ESP32: 10 stappen (met afbeeldingen)
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-31 10:23
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
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
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
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
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
- Open SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino in Arduino IDE
- Als u ILI9225 niet gebruikt, wijzigt u de nieuwe klascode (rond regel 35) om de klasnaam te corrigeren
- Druk op de Arduino IDE "Upload" knop
- Als u het programma niet kon uploaden, probeer dan de verbinding tussen ESP32 GPIO 2 en SD D0/MISO te verbreken
- Als u vindt dat de oriëntatie niet correct is, wijzigt u de "rotatie" -waarde (0-3) in de nieuwe klassecode
- Als het programma goed loopt, kunt u een ander voorbeeld proberen met SDMMC_*
- 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
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
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:
Pratende Arduino - Een MP3 afspelen met Arduino zonder enige module - Mp3-bestand afspelen vanaf Arduino met PCM: 6 stappen
Pratende Arduino | Een MP3 afspelen met Arduino zonder enige module | Mp3-bestand van Arduino afspelen met PCM: in deze instructie leren we hoe we een mp3-bestand met arduino kunnen spelen zonder een audiomodule te gebruiken, hier gaan we de PCM-bibliotheek voor Arduino gebruiken die 16 bit PCM van 8 kHz-frequentie speelt, dus laten we dit doen
Hoe u Facebook kunt stoppen met het automatisch afspelen van video's op Android !!: 10 stappen
Hoe Facebook te stoppen met het automatisch afspelen van video's op Android !!: Deze instructable laat je zien hoe je kunt voorkomen dat Facebook video's automatisch afspeelt op zowel data als wifi op een Android-apparaat Abonneer je op mijn kanaal Bedankt
Cd's afspelen zonder cd-speler, AI en YouTube gebruiken: 10 stappen (met afbeeldingen)
Cd's afspelen zonder cd-speler, AI en YouTube gebruiken: Wil je je cd's afspelen maar heb je geen cd-speler meer? Geen tijd gehad om uw cd's te rippen? Ze zijn geript, maar de bestanden zijn niet beschikbaar wanneer dat nodig is? Geen probleem. Laat AI (kunstmatige intelligentie) je cd identificeren en YouTube speelt hem af! Ik heb een Android-app geschreven die
Muziek afspelen met Arduino!: 5 stappen (met afbeeldingen)
Muziek afspelen met Arduino!: In deze instructable laat ik je zien hoe ik muziek speel met een Arduino UNO en een SD-kaartmodule. We zullen de SPI-communicatie gebruiken. Laten we beginnen
Nummers afspelen met stappenmotor !! 11 stappen (met afbeeldingen) Antwoorden op al uw "Hoe?"
Speel nummers af met behulp van stappenmotor!!: Dit project gaat over het ontwerpen van een eenvoudige dynamische interface, die het mogelijk maakt om op twee verschillende manieren met een stappenmotor te communiceren. De eerste interface regelt de richting en snelheid van de stappenmotor door het gebruik van een eenvoudige GUI, die h