Spisu treści:

Odtwórz wideo z ESP32: 10 kroków (ze zdjęciami)
Odtwórz wideo z ESP32: 10 kroków (ze zdjęciami)

Wideo: Odtwórz wideo z ESP32: 10 kroków (ze zdjęciami)

Wideo: Odtwórz wideo z ESP32: 10 kroków (ze zdjęciami)
Wideo: Tablet Manta jako dawca czyli WIFI MOD Realtek RTL8188ETV 2024, Listopad
Anonim
Odtwórz wideo z ESP32
Odtwórz wideo z ESP32

Te instrukcje pokazują coś o odtwarzaniu wideo i audio za pomocą ESP32.

Krok 1: Funkcje i ograniczenia ESP32

Cechy

  • 4 magistrale SPI, 2 magistrale SPI dostępne dla przestrzeni użytkownika, są to SPI2 i SPI3 lub nazywane HSPI i VSPI. Obie magistrale SPI mogą pracować z maksymalną częstotliwością 80 MHz. Teoretycznie może przesyłać 16-bitowe kolorowe piksele 320x240 do SPI LCD z szybkością 60 fps, ale jeszcze nie policzył narzutu czasowego wymaganego do odczytu i dekodowania danych wideo.
  • 1-bitowa / 4-bitowa magistrala SD może łączyć kartę SD w natywnym protokole
  • Wewnętrzne wyjście audio DAC I2S
  • ponad 100 KB pamięci RAM dostępnej dla bufora wideo i audio
  • Wystarczająca moc przetwarzania do dekodowania JPEG (odtwarzania Motion JPEG) i kompresji danych LZW (odtwarzania animowanego GIF)
  • Wersja dwurdzeniowa może dzielić odczytane dane z karty SD, dekodować i przesyłać do SPI LCD na równoległe zadania wielozadaniowe i zwiększać wydajność odtwarzania

Ograniczenia

  • niewystarczająca ilość wewnętrznej pamięci RAM, aby mieć podwójny bufor ramki dla 320x240 w 16-bitowym kolorze, ograniczało to projekt wielozadaniowy. Może trochę przezwyciężyć z zewnętrznym PSRAM-em, chociaż jest wolniejszy niż wewnętrzna pamięć RAM
  • niewystarczająca moc obliczeniowa do dekodowania wideo mp4
  • nie wszystkie wersje ESP32 mają 2 rdzenie, próbka wielozadaniowa przynosi korzyści tylko w wersji dwurdzeniowej

Nr ref.:

Krok 2: Format wideo

RGB565

Lub nazywany kolorem 16-bitowym jest formatem nieprzetworzonych danych powszechnie używanym w komunikacji między MCU a kolorowym wyświetlaczem. Każdy piksel koloru reprezentowany przez wartość 16-bitową, pierwszy 5-bit to wartość czerwona, następny 6-bit to wartość zielona, a następnie 5-bitowa wartość niebieska. Wartość 16-bitowa może dać 65536 wariacji kolorów, więc nazywa się ją również kolorami 64K. Więc 1 minuta 320x240@30 fps będzie miała rozmiar: 16 * 320 * 240 * 30 * 60 = 2211840000 bitów = 276480000 bajtów lub ponad 260 MB

Animowany gif

Jest to popularny format plików w sieci od lat 90. XX wieku. Ogranicza zmienność kolorów dla każdego ekranu do 256 kolorów i nie powtarza przechowywania piksela, który ma taki sam kolor jak poprzednia klatka. Może więc znacznie zmniejszyć rozmiar pliku, zwłaszcza gdy każda klatka animacji nie zmienia zbyt wielu szczegółów. Kompresja LZW jest przystosowana do dekodowania przez komputer z lat 90., więc ESP32 ma również wystarczającą moc obliczeniową, aby dekodować ją w czasie rzeczywistym.

Ruch JPEG

Lub nazywany M-JPEG / MJPEG jest popularnym formatem kompresji wideo dla sprzętu do przechwytywania wideo o ograniczonej mocy obliczeniowej. W rzeczywistości jest to po prostu połączenie nieruchomych ramek JPEG. W porównaniu z MPEG lub MP4, Motion JPEG nie ma potrzeby intensywnej obliczeniowo techniki przewidywania międzyramkowego, każda klatka jest niezależna. Więc wymaga mniej zasobów do kodowania i dekodowania.

Nr ref.:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Krok 3: Format audio

PCM

Surowy format danych dla dźwięku cyfrowego. ESP32 DAC wykorzystuje 16-bitową głębię, co oznacza, że każde 16-bitowe dane reprezentują cyfrowy próbkowany sygnał analogowy. Większość audio wideo i piosenek zwykle używa częstotliwości próbkowania 44100 MHz, co oznacza 44100 próbkowanego sygnału analogowego na każdą sekundę. Tak więc, 1-minutowe nieprzetworzone dane audio PCM będą miały rozmiar: 16 * 44100 * 60 = 42336000 bitów = 5292000 bajtów lub ponad 5 MB. Wielkość dźwięku stereo będzie podwojona, czyli ponad 10 MB

MP3

MPEG Layer 3 to skompresowany format audio szeroko stosowany do kompresji utworów od lat 90. XX wieku. Może radykalnie zmniejszyć rozmiar pliku do mniej niż jednej dziesiątej nieprzetworzonego formatu PCM

Nr ref.:

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

en.wikipedia.org/wiki/MP3

Krok 4: Konwersja formatu

Ten projekt używa FFmpeg do konwersji wideo do formatu czytelnego dla ESP32.

Pobierz i zainstaluj FFmpeg na ich oficjalnej stronie, jeśli jeszcze nie:

Konwertuj na dźwięk PCM

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

Konwertuj na dźwięk MP3

ffmpeg -i wejście.mp4 -ar 44100 -ac 1 -q:a 9 44100.mp3

Konwertuj na 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

Konwertuj na animowany 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

Konwertuj na 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

Notatka:

Animowany-g.webp" />

Krok 5: Przygotowanie sprzętu

Przygotowanie sprzętu
Przygotowanie sprzętu

Płytka rozwojowa ESP32

Każda dwurdzeniowa płyta deweloperska ESP32 powinna być w porządku, tym razem używam TTGO ESP32-Micro.

Kolorowy wyświetlacz

Każdy kolorowy wyświetlacz obsługujący Arduino_GFX powinien być w porządku, tym razem używam płytki zaciskowej ILI9225 z gniazdem kart SD.

Listę obsługiwanych kolorów Arduino_GFX można znaleźć na Github:

github.com/mononournation/Arduino_GFX

Karta SD

Każda karta SD powinna być w porządku, tym razem używam karty SanDisk "normalnej szybkości" 8 GB micro SD z adapterem SD.

Audio

Jeśli chcesz używać tylko słuchawek, po prostu podłącz piny słuchawek do pinu 26, a GND może słuchać dźwięku. Możesz też użyć małego wzmacniacza do odtwarzania dźwięku z głośnikiem.

Inni

Niektóre płytki stykowe i przewody do płytek stykowych

Krok 6: Interfejs SD

Interfejs SD
Interfejs SD
Interfejs SD
Interfejs SD

Płytka zaciskowa ILI9225 LCD zawierała również piny zaciskowe gniazda karty SD. Może być używany jako magistrala SPI lub 1-bitowa magistrala SD. Jak wspomniano w moich poprzednich instrukcjach, wolę używać 1-bitowej magistrali SD, więc ten projekt będzie oparty na 1-bitowej magistrali SD.

Krok 7: Złóż to razem

Złóż to razem
Złóż to razem
Złóż to razem
Złóż to razem
Złóż to razem
Złóż to razem

Powyższe zdjęcia przedstawiają platformę testową, której używam w tym projekcie. Biała płytka prototypowa jest wydrukowana w 3D, możesz ją pobrać i wydrukować na stronie thingiverse:

Rzeczywiste połączenie zależy od posiadanego sprzętu.

Oto podsumowanie połączenia:

ESP32

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

Nr ref.:

Krok 8: Program

Program
Program

IDE Arduino

Pobierz i zainstaluj Arduino IDE, jeśli jeszcze tego nie zrobiłeś:

www.arduino.cc/en/main/software

Obsługa ESP32

Postępuj zgodnie z instrukcjami instalacji, aby dodać obsługę ESP32, jeśli jeszcze tego nie zrobiłeś:

github.com/espressif/arduino-esp32

Biblioteka Arduino_GFX

Pobierz najnowsze biblioteki Arduino_GFX: (naciśnij "Klonuj lub Pobierz" -> "Pobierz ZIP")

github.com/mononournation/Arduino_GFX

Importuj biblioteki w Arduino IDE. (Menu „Szkic” Arduino IDE -> „Dołącz bibliotekę” -> „Dodaj bibliotekę. ZIP” -> wybierz pobrany plik ZIP)

ESP8266Audio

Pobierz najnowsze biblioteki ESP8266Audio: (naciśnij "Klonuj lub Pobierz" -> "Pobierz ZIP")

github.com/earlephilhower/ESP8266Audio

Importuj biblioteki w Arduino IDE. (Menu Arduino IDE „Sketch” -> „Include Library” -> „Add. ZIP Library” -> wybierz pobrany plik ZIP)

Przykładowy kod RGB565_video

Pobierz najnowszy przykładowy kod RGB565_video: (naciśnij „Klonuj lub Pobierz” -> „Pobierz ZIP”)

github.com/mononournation/RGB565_video

Dane karty SD

Skopiuj przekonwertowane pliki na kartę SD i włóż do gniazda karty LCD

Kompiluj i prześlij

  1. Otwórz SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino w Arduino IDE
  2. Jeśli nie używasz ILI9225, zmień nowy kod klasy (około linii 35) na poprawną nazwę klasy
  3. Naciśnij przycisk „Prześlij” Arduino IDE
  4. Jeśli nie udało się wgrać programu, spróbuj rozłączyć połączenie między ESP32 GPIO 2 a SD D0/MISO
  5. Jeśli orientacja nie jest prawidłowa, zmień wartość „rotacji” (0-3) w nowym kodzie zajęć
  6. Jeśli program działa dobrze, możesz wypróbować inną próbkę, zacznij od SDMMC_*
  7. Jeśli nie masz gniazda na kartę SD lub nie masz zainstalowanego FFmpeg, nadal możesz wypróbować przykład SPIFFS_*

Krok 9: Benchmark

Reper
Reper

Oto podsumowanie wydajności dla różnych formatów wideo (220x176) i audio (44100 MHz):

Format Klatki na sekundę (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Notatka:

  • MJPEG + PCM może osiągać wyższe fps, ale jest to niepotrzebne granie na malutkim ekranie większym niż 30 fps
  • RGB565 nie wymaga procesu dekodowania, ale rozmiar danych jest zbyt duży i dużo czasu zajmuje ładowanie danych z SD, 4-bitowa szyna SD i szybsza karta SD mogą go nieco poprawić (dzikie zgadywanie może osiągnąć około 12 kl/s)
  • Proces dekodowania MP3 nie został jeszcze zoptymalizowany, teraz dedykuje rdzeń 0 do dekodowania MP3 i rdzeń 1 do odtwarzania wideo

Krok 10: Miłej gry

Miłej gry!
Miłej gry!

Teraz możesz odtwarzać wideo i audio za pomocą swojego ESP32, odblokowało to wiele możliwości!

Myślę, że później zrobię mały telewizor w stylu vintage…

Zalecana: