Inhaltsverzeichnis:

Video mit ESP32 abspielen – Gunook
Video mit ESP32 abspielen – Gunook

Video: Video mit ESP32 abspielen – Gunook

Video: Video mit ESP32 abspielen – Gunook
Video: Sounds mit dem ESP32 ausgeben - Klingel-Gong, TTS und mehr 2024, November
Anonim
Video abspielen mit ESP32
Video abspielen mit ESP32

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

Hardwarevorbereitung
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

SD-Schnittstelle
SD-Schnittstelle
SD-Schnittstelle
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

Setzen Sie es zusammen
Setzen Sie es zusammen
Setzen Sie es zusammen
Setzen Sie es zusammen
Setzen Sie es zusammen
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

Programm
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

  1. Öffnen Sie SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino in der Arduino IDE
  2. Wenn Sie ILI9225 nicht verwenden, ändern Sie den neuen Klassencode (um Zeile 35), um den Klassennamen zu korrigieren
  3. Drücken Sie die Arduino IDE-Schaltfläche "Hochladen"
  4. Wenn Sie das Programm nicht hochladen konnten, versuchen Sie, die Verbindung zwischen ESP32 GPIO 2 und SD D0/MISO zu trennen
  5. Wenn Sie feststellen, dass die Ausrichtung nicht korrekt ist, ändern Sie den Wert "Rotation" (0-3) im neuen Klassencode
  6. Wenn das Programm gut läuft, können Sie einen anderen Beispielstart mit SDMMC_* versuchen
  7. Wenn Sie keinen SD-Kartensteckplatz haben oder FFmpeg nicht installiert haben, können Sie trotzdem SPIFFS_* Beispiel ausprobieren

Schritt 9: Benchmark

Benchmark
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

Viel Spaß beim Spielen!
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: