Innehållsförteckning:

Spela upp video med ESP32: 10 steg (med bilder)
Spela upp video med ESP32: 10 steg (med bilder)

Video: Spela upp video med ESP32: 10 steg (med bilder)

Video: Spela upp video med ESP32: 10 steg (med bilder)
Video: VMS твоя СИСТЕМА ВИДЕОНАБЛЮДЕНИЯ на ПК ноутбуке 2024, November
Anonim
Spela upp video med ESP32
Spela upp video med ESP32

Denna instruktion visar något om att spela upp video och ljud med ESP32.

Steg 1: ESP32 -funktioner och begränsningar

Funktioner

  • 4 SPI -bussar, 2 SPI -bussar tillgängliga för användarutrymme, de är SPI2 och SPI3 eller kallas HSPI och VSPI. Båda SPI -bussarna kan köras högst 80 MHz. Teoretiskt kan den skjuta 320x240 16-bitars färgpixlar till SPI LCD vid 60 fps, men den har ännu inte räknat den tid som krävs för att läsa och avkoda videodata.
  • 1-bitars / 4-bitars SD-buss kan ansluta SD-kort i inbyggt protokoll
  • I2S intern DAC -ljudutgång
  • över 100 KB RAM tillgängligt för video- och ljudbuffert
  • Lagom stor processorkraft för att avkoda JPEG (spela upp Motion JPEG) och LZW -datakomprimering (spela upp animerad GIF)
  • Dubbelkärnig version kan dela läsdata från SD-kort, avkoda och skjuta till SPI LCD i parallella multi-uppgifter och öka uppspelningsprestandan

Begränsningar

  • inte tillräckligt med internt RAM-minne för att ha dubbelrambuffert för 320x240 i 16-bitars färg, det begränsade multitask-designen. Det kan övervinna lite med extern PSRAM men det är långsammare än internt RAM
  • inte tillräckligt med processorkraft för att avkoda mp4 -video
  • inte alla ESP32-versioner har två kärnor, samplingsprovet har endast fördelar med versionen med två kärnor

Ref.:

Steg 2: Videoformat

RGB565

Eller kallas 16-bitars färg är ett rådataformat som vanligtvis används i kommunikationen mellan MCU och färgdisplay. Varje färgpixel representeras av ett 16-bitars värde, den första 5-bitars är rött värde, efter 6-bitars är grönt värde och sedan 5-bitars blått värde. 16-bitars värde kan göra 65536 färgvariationer så det kallas också 64K färger. Så 1 minut 320x240@30 fps video kommer att vara stor: 16 * 320 * 240 * 30 * 60 = 2211840000 bitar = 276480000 byte eller över 260 MB

Animerad GIF

Detta är ett vanligt filformat på webben sedan 1990 -talet. Det begränsar färgvariationen för varje skärm upp till 256 färger och upprepa inte pixeln med samma färg som föregående ram. Så det kan mycket minska filstorleken, särskilt när varje animationsram inte ändrar för mycket detaljer. LZW -komprimeringen är avsedd att avkodas av 1990 -talets dator, så ESP32 har också tillräckligt med processorkraft för att avkoda den i realtid.

Rörelse JPEG

Eller kallas M-JPEG / MJPEG är ett vanligt videokomprimeringsformat för videoinspelningshårdvaran med begränsad processorkraft. Det är faktiskt helt enkelt en sammanfogning av stilla JPEG -ramar. Jämför med MPEG eller MP4, Motion JPEG behöver inte beräkningsteknisk intensiv teknik för ramramsprognoser, varje bildruta är oberoende. Så det kräver mindre resurs att koda och avkoda.

Ref.:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Steg 3: Ljudformat

PCM

Ett rådataformat för digitalt ljud. ESP32 DAC använder 16-bitars bitdjup, det betyder att varje 16-bitars data representerar en digital samplad analog signal. De flesta video- och låtljud använder vanligtvis samplingsfrekvens vid 44100 MHz, det betyder 44100 samplad analog signal för varje sekund. Så, 1 minuts mono -ljud -PCM -rådata kommer att vara storlek: 16 * 44100 * 60 = 42336000 bitar = 5292000 byte eller över 5 MB. Storleken på stereoljud kommer att vara dubbelt, dvs. över 10 MB

MP3

MPEG Layer 3 är ett komprimerat ljudformat som har använts mycket för låtkomprimering sedan 1990 -talet. Det kan dramatiskt minska filstorleken till under en tiondel av rå PCM-format

Ref.:

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

en.wikipedia.org/wiki/MP3

Steg 4: Formatera konvertering

Detta projekt använder FFmpeg konvertera videon till ESP32 läsbart format.

Ladda ner och installera FFmpeg på deras officiella webbplats om inte ännu:

Konvertera till PCM -ljud

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

Konvertera till MP3 -ljud

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

Konvertera till RGB565

ffmpeg -i input.mp4 -vf "fps = 9, skala = -1: 176: flaggor = lanczos, beskära = 220: in_h: (in_w -220)/2: 0" -c: v rawvideo -pix_fmt rgb565be 220_9fps. rgb

Konvertera till animerad GIF

ffmpeg -i input.mp4 -vf "fps = 15, skala = -1: 176: flaggor = lanczos, beskära = 220: in_h: (in_w -220)/2: 0, dela [s0] [s1]; [s0] palettegen [p]; [s1] [p] paletteuse "-loop -1 220_15fps.gif

Konvertera till Motion JPEG

ffmpeg -i input.mp4 -vf "fps = 30, skala = -1: 176: flaggor = lanczos, beskära = 220: in_h: (in_w -220)/2: 0" -q: v 9 220_30fps.mjpeg

Notera:

FFmpeg -konverterat Animerat-g.webp" />

Steg 5: Förberedelse av maskinvara

Förberedelse av hårdvara
Förberedelse av hårdvara

ESP32 Dev Board

Varje ESP32 dev-kort med två kärnor ska vara ok, den här gången använder jag en TTGO ESP32-Micro.

Färgdisplay

Vilken färgskärm som helst som Arduino_GFX stöder bör vara ok, den här gången använder jag en ILI9225 breakout board med SD -kortplats.

Du hittar Arduino_GFX färglista som stöds på Github:

github.com/moononournation/Arduino_GFX

SD-kort

Alla SD -kort ska vara ok, den här gången använder jag en SanDisk "normal hastighet" 8 GB micro SD med SD -adapter.

Audio

Om du bara vill använda hörlurar ansluter du bara hörlans stift till stift 26 och GND kan lyssna på ljudet. Eller så kan du använda en liten förstärkare för att spela upp ljud med högtalare.

Andra

Några brödbrädor och trådbräda

Steg 6: SD -gränssnitt

SD -gränssnitt
SD -gränssnitt
SD -gränssnitt
SD -gränssnitt

ILI9225 LCD -brytkort innehåller också en SD crd -kortplats. Den kan användas som SPI-buss eller 1-bitars SD-buss. Som nämnts i mina tidigare instruktioner, föredrar jag att använda 1-bitars SD-buss, så detta projekt kommer att baseras på 1-bitars SD-buss.

Steg 7: Sätt ihop det

Sätt ihop det
Sätt ihop det
Sätt ihop det
Sätt ihop det
Sätt ihop det
Sätt ihop det

Bilderna ovan visar testplattformen jag använder i detta projekt. Den vita brödbrädan är 3D -tryckt, du kan ladda ner och skriva ut den på thingiverse:

Den faktiska anslutningen beror på vilken hårdvara du har i handen.

Här är sammanfattningen av anslutningen:

ESP32

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

Steg 8: Programmera

Program
Program

Arduino IDE

Ladda ner och installera Arduino IDE om du inte ännu gör det:

www.arduino.cc/en/main/software

Support för ESP32

Följ installationsanvisningarna för att lägga till ESP32 -stöd om du inte gör det ännu:

github.com/espressif/arduino-esp32

Arduino_GFX -bibliotek

Ladda ner de senaste Arduino_GFX -biblioteken: (tryck på "Klona eller ladda ner" -> "Ladda ner ZIP")

github.com/moononournation/Arduino_GFX

Importera bibliotek i Arduino IDE. (Arduino IDE "Sketch" -meny -> "Inkludera bibliotek" -> "Lägg till. ZIP -bibliotek" -> välj nedladdad ZIP -fil)

ESP8266Ljud

Ladda ner senaste ESP8266Ljudbibliotek: (tryck på "Klona eller ladda ner" -> "Ladda ner ZIP")

github.com/earlephilhower/ESP8266Audio

Importera bibliotek i Arduino IDE. (Arduino IDE "Sketch" -meny -> "Inkludera bibliotek" -> "Lägg till. ZIP -bibliotek" -> välj nedladdad ZIP -fil)

RGB565_video Provkod

Ladda ner den senaste RGB565_video -provkoden: (tryck på "Klona eller ladda ner" -> "Ladda ner ZIP")

github.com/moononournation/RGB565_video

SD -kortdata

Kopiera de konverterade filerna till SD -kortet och sätt in i LCD -kortplatsen

Kompilera och ladda upp

  1. Öppna SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino i Arduino IDE
  2. Om du inte använder ILI9225 ändrar du den nya klasskoden (runt rad 35) till rätt klassnamn
  3. Tryck på Arduino IDE "Upload" -knappen
  4. Om du inte lyckades ladda upp programmet, försök koppla bort anslutningen mellan ESP32 GPIO 2 och SD D0/MISO
  5. Om du tycker att orienteringen inte är korrekt ändrar du "rotation" -värdet (0-3) i den nya klasskoden
  6. Om programmet fungerar bra kan du prova annan provstart med SDMMC_*
  7. Om du inte har SD -kortplats eller om du inte har FFmpeg installerat kan du fortfarande prova SPIFFS_* -exempel

Steg 9: Benchmark

Benchmark
Benchmark

Här är prestandasammanfattningen för olika video (220x176) och ljud (44100 MHz):

Formatera Bildruta per sekund (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Notera:

  • MJPEG + PCM kan nå högre fps men det är onödigt att spela på en liten skärm som är större än 30 fps
  • RGB565 kräver inte avkodningsprocessen men datastorleken är för stor och det tar mycket tid att ladda data från SD, 4-bitars SD-buss och snabbare SD-kort kan förbättra det lite (vild gissning kan nå runt 12 fps)
  • MP3 -avkodningsprocessen ännu inte optimerad, den är nu dedikerad kärna 0 för MP3 -avkodning och kärna 1 för uppspelning av video

Steg 10: Lycka till

Lycka till!
Lycka till!

Nu kan du spela upp video och ljud med din ESP32, det låste upp många möjligheter!

Jag tror att jag kommer att göra en liten vintage -tv senare …

Rekommenderad: