Inhaltsverzeichnis:
- Schritt 1: ESP32-Funktionen und -Einschränkungen
- Schritt 2: Videoformat
- Schritt 3: Audioformat
- Schritt 4: Formatkonvertierung
- Schritt 5: Hardwarevorbereitung
- Schritt 6: SD-Schnittstelle
- Schritt 7: Setzen Sie es zusammen
- Schritt 8: Programm
- Schritt 9: Benchmark
- Schritt 10: Viel Spaß beim Spielen
Video: Video mit ESP32 abspielen – Gunook
2024 Autor: John Day | [email protected]. Zuletzt bearbeitet: 2024-01-31 10:15
Diese Instructables zeigen etwas über das Abspielen von Video und Audio mit ESP32.
Schritt 1: ESP32-Funktionen und -Einschränkungen
Merkmale
- 4 SPI-Bus, 2 SPI-Bus für den Benutzerbereich verfügbar, sie sind SPI2 und SPI3 oder werden HSPI und VSPI genannt. Beide SPI-Busse können maximal 80 MHz laufen. Theoretisch kann es 320 x 240 16-Bit-Farbpixel mit 60 fps auf SPI-LCD übertragen, aber es hat noch nicht den Zeitaufwand gezählt, der zum Lesen und Decodieren der Videodaten erforderlich ist.
- 1-Bit/4-Bit-SD-Bus kann SD-Karte im nativen Protokoll verbinden
- I2S interner DAC-Audioausgang
- über 100 KB RAM für Video- und Audiopuffer verfügbar
- Ausreichend Rechenleistung, um JPEG zu dekodieren (Motion JPEG abspielen) und LZW-Datenkompression (Animiertes-g.webp" />
- Die Dual-Core-Version kann das Lesen von Daten von der SD-Karte, das Decodieren und das Pushen auf das SPI-LCD in parallele Multitasks aufteilen und die Wiedergabeleistung steigern
Einschränkungen
- nicht genug interner RAM, um doppelten Bildspeicher für 320x240 in 16-Bit-Farbe zu haben, schränkte dies das Multitask-Design ein. Mit externem PSRAM kann es etwas überstehen, obwohl es langsamer ist als internes RAM
- nicht genügend Rechenleistung zum Decodieren von mp4-Videos
- nicht alle ESP32-Versionen haben 2 Kerne, das Multitask-Beispiel profitiert nur von der Dual-Core-Version
Ref.:
Schritt 2: Videoformat
RGB565
16-Bit-Farbe genannt ist ein Rohdatenformat, das häufig bei der Kommunikation zwischen MCU und Farbdisplay verwendet wird. Jedes Farbpixel wird durch einen 16-Bit-Wert dargestellt, das erste 5-Bit ist ein Rotwert, das folgende 6-Bit ist ein Grünwert und dann ein 5-Bit-Blauwert. Der 16-Bit-Wert kann 65536 Farbvariationen erzeugen, so dass er auch als 64K-Farben bezeichnet wird. 1 Minute 320 x 240 @ 30 fps Video wird also die Größe haben: 16 * 320 * 240 * 30 * 60 = 2211840000 Bits = 276480000 Bytes oder über 260 MB
Animiertes GIF
Dies ist ein gängiges Dateiformat im Web seit den 1990er Jahren. Es begrenzt die Farbvariation für jeden Bildschirm auf bis zu 256 Farben und speichert das Pixel nicht wiederholt, das dieselbe Farbe wie das vorherige Bild hat. So kann die Dateigröße erheblich reduziert werden, insbesondere wenn jeder Animationsrahmen nicht zu viele Details ändert. Die LZW-Komprimierung ist so konzipiert, dass sie von Computern der 1990er Jahre decodiert werden kann, sodass ESP32 auch ausreichend Rechenleistung hat, um sie in Echtzeit zu decodieren.
Motion-JPEG
Oder M-JPEG genannt / MJPEG ist ein gängiges Videokomprimierungsformat für die Videoaufnahmehardware mit begrenzter Verarbeitungsleistung. Es ist eigentlich einfach eine Verkettung von Standbildern im JPEG-Format. Vergleichen Sie mit MPEG oder MP4, Motion JPEG erfordert keine rechenintensive Technik der Interframe-Vorhersage, jeder Frame ist unabhängig. Es erfordert also weniger Ressourcen zum Kodieren und Dekodieren.
Ref.:
en.wikipedia.org/wiki/List_of_monochrome_a…
en.wikipedia.org/wiki/GIF
en.wikipedia.org/wiki/Motion_JPEG
Schritt 3: Audioformat
PCM
Ein Rohdatenformat für digitales Audio. Der ESP32 DAC verwendet eine 16-Bit-Bittiefe, dh alle 16-Bit-Daten repräsentieren ein digital abgetastetes analoges Signal. Die meisten Video- und Song-Audiodaten verwenden normalerweise eine Abtastrate von 44100 MHz, d. h. 44100 abgetastete analoge Signale pro Sekunde. Die Größe der 1-minütigen Mono-Audio-PCM-Rohdaten beträgt also: 16 * 44100 * 60 = 42336000 Bit = 5292000 Byte oder über 5 MB. Die Größe von Stereo-Audio wird verdoppelt, d. h. über 10 MB
MP3
MPEG Layer 3 ist ein komprimiertes Audioformat, das seit den 1990er Jahren weit verbreitet für die Songkomprimierung verwendet wird. Es kann die Dateigröße drastisch auf unter ein Zehntel des rohen PCM-Formats reduzieren
Ref.:
en.wikipedia.org/wiki/Pulse-code_modulatio…
en.wikipedia.org/wiki/MP3
Schritt 4: Formatkonvertierung
Dieses Projekt verwendet FFmpeg, um das Video in ein lesbares ESP32-Format zu konvertieren.
Bitte laden Sie FFmpeg auf der offiziellen Website herunter und installieren Sie es, falls noch nicht:
In PCM-Audio konvertieren
ffmpeg -i input.mp4 -f u16be -acodec pcm_u16le -ar 44100 -ac 1 44100_u16le.pcm
In MP3-Audio konvertieren
ffmpeg -i input.mp4 -ar 44100 -ac 1 -q:a 9 44100.mp3
Konvertieren 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
In animiertes-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
In Motion JPEG konvertieren
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
Notiz:
FFmpeg-konvertiertes animiertes-g.webp" />
Schritt 5: Hardwarevorbereitung
ESP32-Entwicklungsboard
Jedes Dual-Core ESP32-Entwicklungsboard sollte in Ordnung sein, diesmal verwende ich ein TTGO ESP32-Micro.
Farbbildschirm
Jedes Farbdisplay, das Arduino_GFX unterstützt, sollte in Ordnung sein, diesmal verwende ich ein ILI9225-Breakout-Board mit SD-Kartensteckplatz.
Eine Liste der von Arduino_GFX unterstützten Farbdisplays finden Sie auf Github:
github.com/moononournation/Arduino_GFX
SD-Karte
Jede SD-Karte sollte in Ordnung sein, diesmal verwende ich eine SanDisk "normal speed" 8 GB microSD mit SD-Adapter.
Audio
Wenn Sie nur Kopfhörer verwenden möchten, verbinden Sie einfach die Kopfhörer-Pins mit Pin 26 und GND kann den Ton hören. Oder Sie können einen winzigen Verstärker verwenden, um Audio mit Lautsprechern abzuspielen.
Andere
Einige Steckbretter und Steckbrettdrähte
Schritt 6: SD-Schnittstelle
Die LCD-Breakout-Platine ILI9225 enthielt auch Breakout-Pins für einen SD-Kartensteckplatz. Er kann als SPI-Bus oder 1-Bit-SD-Bus verwendet werden. Wie in meinen vorherigen Anleitungen erwähnt, bevorzuge ich die Verwendung eines 1-Bit-SD-Busses, sodass dieses Projekt auf einem 1-Bit-SD-Bus basiert.
Schritt 7: Setzen Sie es zusammen
Die obigen Bilder zeigen die Testplattform, die ich in diesem Projekt verwende. Das weiße Steckbrett ist 3D-gedruckt, Sie können es bei thingiverse herunterladen und ausdrucken:
Die tatsächliche Verbindung hängt davon ab, welche Hardware Sie zur Hand haben.
Hier die Verbindungszusammenfassung:
ESP32
Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0/MISO -> 1k Widerstand -> 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.:
Schritt 8: Programm
Arduino-IDE
Laden Sie die Arduino IDE herunter und installieren Sie sie, wenn Sie dies noch nicht tun:
www.arduino.cc/en/main/software
ESP32-Unterstützung
Befolgen Sie die Installationsanweisungen, um ESP32-Unterstützung hinzuzufügen, wenn Sie dies noch nicht tun:
github.com/espressif/arduino-esp32
Arduino_GFX-Bibliothek
Laden Sie die neuesten Arduino_GFX-Bibliotheken herunter: (drücken Sie "Clone or Download" -> "Download ZIP")
github.com/moononournation/Arduino_GFX
Importieren Sie Bibliotheken in die Arduino-IDE. (Arduino IDE "Skizze"-Menü -> "Bibliothek einschließen" -> ". ZIP-Bibliothek hinzufügen" -> heruntergeladene ZIP-Datei auswählen)
ESP8266Audio
Laden Sie die neuesten ESP8266Audio-Bibliotheken herunter: (drücken Sie "Klonen oder Herunterladen" -> "ZIP herunterladen")
github.com/earlephilhower/ESP8266Audio
Importieren Sie Bibliotheken in die Arduino-IDE. (Arduino IDE "Skizze"-Menü -> "Bibliothek einschließen" -> ". ZIP-Bibliothek hinzufügen" -> heruntergeladene ZIP-Datei auswählen)
RGB565_video-Beispielcode
Laden Sie den neuesten RGB565_video-Beispielcode herunter: (drücken Sie "Klonen oder Herunterladen" -> "ZIP herunterladen")
github.com/moononournation/RGB565_video
SD-Kartendaten
Kopieren Sie die konvertierten Dateien auf die SD-Karte und legen Sie sie in den LCD-Kartensteckplatz ein
Kompilieren & Hochladen
- Öffnen Sie SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino in der Arduino IDE
- Wenn Sie ILI9225 nicht verwenden, ändern Sie den neuen Klassencode (um Zeile 35), um den Klassennamen zu korrigieren
- Drücken Sie die Arduino IDE-Schaltfläche "Hochladen"
- Wenn Sie das Programm nicht hochladen konnten, versuchen Sie, die Verbindung zwischen ESP32 GPIO 2 und SD D0/MISO zu trennen
- Wenn Sie feststellen, dass die Ausrichtung nicht korrekt ist, ändern Sie den Wert "Rotation" (0-3) im neuen Klassencode
- Wenn das Programm gut läuft, können Sie einen anderen Beispielstart mit SDMMC_* versuchen
- Wenn Sie keinen SD-Kartensteckplatz haben oder FFmpeg nicht installiert haben, können Sie trotzdem SPIFFS_* Beispiel ausprobieren
Schritt 9: Benchmark
Hier ist die Leistungsübersicht für verschiedene Video- (220x176) und Audio- (44100 MHz) Formate:
Format | Bilder pro Sekunde (fps) |
MJPEG + PCM | 30 |
15 | |
RGB565 + PCM | 9 |
MJPEG + MP3 | 24 |
Notiz:
- MJPEG + PCM können höhere fps erreichen, aber es ist unnötiges Spielen auf einem winzigen Bildschirm mit mehr als 30 fps
- RGB565 erfordert keinen Dekodierungsprozess, aber die Datengröße ist zu groß und es wird viel Zeit beim Laden von Daten von SD verbraucht, 4-Bit-SD-Bus und schnellere SD-Karte können es ein wenig verbessern (wilde Vermutungen können etwa 12 fps erreichen).
- MP3-Decodierungsprozess noch nicht optimiert, es ist jetzt Core 0 für die MP3-Decodierung und Core 1 für die Wiedergabe von Videos vorgesehen
Schritt 10: Viel Spaß beim Spielen
Jetzt können Sie mit Ihrem ESP32 Video und Audio abspielen, es hat viele Möglichkeiten eröffnet!
Ich denke, ich werde später einen winzigen Vintage-Fernseher machen …
Empfohlen:
Alben mit NFC-Tags zum automatischen Abspielen von Spotify-Musik auf Chromecast - Gunook
Alben mit NFC-Tags zum automatischen Abspielen von Spotify-Musik auf Chromecast: Dieses Projekt begann mit der Idee, eine Albumcollage meiner meistgespielten Künstler auf Spotify zu erstellen. Nachdem ich etwas mit der Spotify-API in Python gespielt hatte, dachte ich, es wäre schön, diese Albumcover mit ihren Spotify-URIs zu verknüpfen und mit dem Abspielen der
Sprechendes Arduino - Abspielen einer MP3 mit Arduino ohne Modul - MP3-Datei von Arduino mit PCM abspielen - Gunook
Sprechendes Arduino | Abspielen einer MP3 mit Arduino ohne Modul | MP3-Datei von Arduino mit PCM abspielen: In dieser Anleitung lernen wir, wie man eine MP3-Datei mit Arduino abspielt, ohne ein Audiomodul zu verwenden
CDs ohne CD-Player abspielen, mit AI und YouTube - Gunook
CDs ohne CD-Player abspielen, mit AI und YouTube: Sie möchten Ihre CDs abspielen, haben aber keinen CD-Player mehr? Hatten Sie keine Zeit, Ihre CDs zu rippen? Gerippt, aber die Dateien sind bei Bedarf nicht verfügbar?Kein Problem. Lassen Sie die KI (künstliche Intelligenz) Ihre CD identifizieren und YouTube spielt sie ab!Ich habe eine Android-App geschrieben, die
Bluetooth auf Sonos mit Raspberry Pi abspielen - Gunook
Spielen Sie Bluetooth auf Sonos mit Raspberry Pi: Ich habe zuvor eine Anleitung geschrieben, in der beschrieben wird, wie Sie Sonos mit einem Raspberry Pi einen Aux- oder analogen Eingang hinzufügen. Ein Leser fragte, ob es möglich sei, Bluetooth-Audio von seinem Telefon auf Sonos zu streamen. Das geht ganz einfach mit einem Bluetooth-Dongle
Musik mit Arduino abspielen! - Gunook
Spielen Sie Musik mit Arduino!: In diesem anweisbaren zeige ich Ihnen, wie ich Musik mit einem Arduino UNO und einem SD-Kartenmodul spiele. Wir werden die SPI-Kommunikation verwenden. Los geht's