Daftar Isi:

Putar Video Dengan ESP32: 10 Langkah (dengan Gambar)
Putar Video Dengan ESP32: 10 Langkah (dengan Gambar)

Video: Putar Video Dengan ESP32: 10 Langkah (dengan Gambar)

Video: Putar Video Dengan ESP32: 10 Langkah (dengan Gambar)
Video: ESP32 CAM with Arduino IDE | Tutorial - [Part.9] Multiple CAM Dashboard With New Features (ft. ⏯️🔴💾) 2024, Juli
Anonim
Putar Video Dengan ESP32
Putar Video Dengan ESP32

Instruksi ini menunjukkan sesuatu tentang memutar video dan audio dengan ESP32.

Langkah 1: Fitur & Batasan ESP32

Fitur

  • 4 bus SPI, 2 bus SPI tersedia untuk ruang pengguna, yaitu SPI2 dan SPI3 atau disebut HSPI dan VSPI. Kedua bus SPI dapat berjalan paling banyak 80 MHz. Secara teoritis dapat mendorong 320x240 piksel warna 16-bit ke LCD SPI pada 60 fps, tetapi belum menghitung overhead waktu yang diperlukan untuk membaca dan mendekode data video.
  • Bus SD 1-bit / 4-bit dapat menghubungkan kartu SD dalam protokol asli
  • Output audio DAC internal I2S
  • lebih dari 100 KB RAM tersedia untuk buffer video dan audio
  • Kekuatan pemrosesan yang cukup adil untuk memecahkan kode JPEG (memutar Motion JPEG) dan kompresi data LZW (memutar-g.webp" />
  • Versi dual-core dapat membagi membaca data dari kartu SD, decode dan push ke SPI LCD menjadi multi-tugas paralel dan meningkatkan kinerja pemutaran

Keterbatasan

  • RAM internal tidak cukup untuk memiliki buffer bingkai ganda untuk 320x240 dalam warna 16-bit, itu membatasi desain multitask. Itu dapat mengatasi sedikit dengan PSRAM eksternal meskipun lebih lambat dari RAM internal
  • tidak cukup daya pemrosesan untuk memecahkan kode video mp4
  • tidak semua versi ESP32 memiliki 2 inti, sampel multi-tugas hanya menguntungkan pada versi dual-core

Referensi:

Langkah 2: Format Video

RGB565

Atau disebut warna 16-bit adalah format data mentah yang biasa digunakan pada komunikasi antara MCU dan tampilan warna. Setiap piksel warna diwakili oleh nilai 16-bit, 5-bit pertama adalah nilai merah, berikut 6-bit adalah nilai hijau dan kemudian nilai biru 5-bit. Nilai 16-bit dapat membuat 65536 variasi warna sehingga disebut juga 64K warna. Jadi video 1 menit 320x240@30 fps akan berukuran: 16 * 320 * 240 * 30 * 60 = 2211840000 bit = 276480000 byte atau lebih dari 260 MB

Ini adalah format file umum di web sejak 1990-an. Ini membatasi variasi warna untuk setiap layar hingga 256 warna dan tidak mengulangi penyimpanan piksel yang sama dengan warna bingkai sebelumnya. Jadi bisa banyak mengurangi ukuran file, terutama ketika setiap frame animasi tidak terlalu banyak mengubah detail. Kompresi LZW dirancang mampu diterjemahkan oleh komputer tahun 1990-an, sehingga ESP32 juga memiliki kekuatan pemrosesan yang cukup untuk memecahkan kode secara real time.

Gerakan JPEG

Atau disebut M-JPEG / MJPEG adalah format kompresi video umum untuk perangkat keras pengambilan video dengan daya pemrosesan terbatas. Ini sebenarnya hanya gabungan dari frame JPEG diam. Bandingkan dengan MPEG atau MP4, Motion JPEG tidak memerlukan teknik prediksi interframe yang intensif secara komputasi, setiap frame bersifat independen. Jadi itu membutuhkan lebih sedikit sumber daya untuk menyandikan dan mendekode.

Referensi:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Langkah 3: Format Audio

PCM

Format data mentah untuk audio digital. ESP32 DAC menggunakan kedalaman 16-bit, yang berarti setiap data 16-bit mewakili sinyal analog sampel digital. Kebanyakan video dan audio lagu umumnya menggunakan sample rate pada 44100 MHz, yang berarti 44100 sinyal analog yang disampel untuk setiap detiknya. Jadi, data mentah PCM audio mono 1 menit akan berukuran: 16 * 44100 * 60 = 42336000 bit = 5292000 byte atau lebih dari 5 MB. Ukuran audio stereo akan menjadi dua kali lipat, yaitu lebih dari 10 MB

MP3

MPEG Layer 3 adalah format audio terkompresi yang banyak digunakan untuk kompresi lagu sejak 1990-an. Ini dapat secara dramatis mengurangi ukuran file hingga di bawah sepersepuluh format PCM mentah

Referensi:

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

en.wikipedia.org/wiki/MP3

Langkah 4: Format Konversi

Proyek ini menggunakan FFmpeg untuk mengubah video menjadi format yang dapat dibaca ESP32.

Silakan unduh dan instal FFmpeg di situs resmi mereka jika belum:

Konversikan ke audio PCM

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

Konversikan ke audio MP3

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

Konversikan ke 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

Konversikan ke-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

Konversikan ke 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

Catatan:

Langkah 5: Persiapan Perangkat Keras

Persiapan Perangkat Keras
Persiapan Perangkat Keras

Papan Pengembang ESP32

Papan dev ESP32 dual-core apa pun seharusnya baik-baik saja, kali ini saya menggunakan TTGO ESP32-Micro.

Tampilan Warna

Tampilan warna apa pun yang didukung Arduino_GFX seharusnya ok, kali ini saya menggunakan papan breakout ILI9225 dengan slot kartu SD.

Anda dapat menemukan daftar tampilan warna yang didukung Arduino_GFX di Github:

github.com/moononournation/Arduino_GFX

Kartu SD

Kartu SD apa pun harusnya baik-baik saja, kali ini saya menggunakan "kecepatan normal" SanDisk micro SD 8 GB dengan adaptor SD.

audio

Jika Anda ingin menggunakan headphone saja, cukup sambungkan pin headphone ke pin 26 dan GND dapat mendengarkan audio. Atau Anda dapat menggunakan amplifier kecil untuk memutar audio dengan speaker.

Yang lain

Beberapa papan tempat memotong roti dan kabel papan tempat memotong roti

Langkah 6: Antarmuka SD

Antarmuka SD
Antarmuka SD
Antarmuka SD
Antarmuka SD

Papan breakout LCD ILI9225 juga menyertakan pin breakout slot SD crd. Ini dapat digunakan sebagai bus SPI atau bus SD 1-bit. Seperti yang disebutkan dalam instruksi saya sebelumnya, saya lebih suka menggunakan bus SD 1-bit, jadi proyek ini akan didasarkan pada bus SD 1-bit.

Langkah 7: Satukan

Satukan
Satukan
Satukan
Satukan
Satukan
Satukan

Gambar di atas menunjukkan platform pengujian yang saya gunakan dalam proyek ini. Papan tempat memotong roti putih dicetak 3D, Anda dapat mengunduh dan mencetaknya di thingiverse:

Koneksi sebenarnya tergantung pada perangkat keras yang Anda miliki.

Berikut ringkasan koneksinya:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0/MISO -> resistor 1k -> Vcc GPIO 14 -> SD CLK GPIO 15 -> SD CMD/MOSI GPIO 18 -> LCD SCK GPIO 19 -> LCD MISO GPIO 22 -> LED LCD GPIO 23 -> LCD MOSI GPIO 27 -> LCD DC/RS GPIO 33 -> LCD RST

Ref.:

Langkah 8: Program

Program
Program

Arduino IDE

Unduh dan instal Arduino IDE jika Anda belum melakukannya:

www.arduino.cc/en/main/software

Dukungan ESP32

Ikuti Petunjuk Instalasi untuk menambahkan dukungan ESP32 jika Anda belum melakukannya:

github.com/espressif/arduino-esp32

Perpustakaan Arduino_GFX

Unduh perpustakaan Arduino_GFX terbaru: (tekan "Klon atau Unduh" -> "Unduh ZIP")

github.com/moononournation/Arduino_GFX

Impor perpustakaan di Arduino IDE. (Menu "Sketsa" Arduino IDE -> "Sertakan Perpustakaan" -> "Tambahkan Perpustakaan. ZIP" -> pilih file ZIP yang diunduh)

ESP8266Audio

Unduh pustaka ESP8266Audio terbaru: (tekan "Klon atau Unduh" -> "Unduh ZIP")

github.com/earlephilhower/ESP8266Audio

Impor perpustakaan di Arduino IDE. (Menu "Sketsa" Arduino IDE -> "Sertakan Perpustakaan" -> "Tambahkan Perpustakaan. ZIP" -> pilih file ZIP yang diunduh)

Kode Sampel RGB565_video

Unduh kode sampel RGB565_video terbaru: (tekan "Klon atau Unduh" -> "Unduh ZIP")

github.com/moononournation/RGB565_video

Data Kartu SD

Salin file yang dikonversi ke kartu SD dan masukkan ke dalam slot kartu LCD

Kompilasi & Unggah

  1. Buka SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino di Arduino IDE
  2. Jika Anda tidak menggunakan ILI9225, ubah kode kelas baru (sekitar baris 35) untuk memperbaiki nama kelas
  3. Tekan tombol "Unggah" Arduino IDE
  4. Jika Anda gagal mengunggah program, coba lepaskan koneksi antara ESP32 GPIO 2 dan SD D0/MISO
  5. Jika Anda menemukan orientasi tidak benar, ubah nilai "rotasi" (0-3) dalam kode kelas baru
  6. Jika program berjalan dengan baik, Anda dapat mencoba sampel lain mulai dengan SDMMC_*
  7. Jika Anda tidak memiliki slot kartu SD atau tidak menginstal FFmpeg, Anda masih dapat mencoba contoh SPIFFS_*

Langkah 9: Tolok Ukur

Tolok ukur
Tolok ukur

Berikut adalah ringkasan performa untuk berbagai format video (220x176) dan audio (44100 MHz):

Format Bingkai per detik (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Catatan:

  • MJPEG + PCM dapat mencapai fps yang lebih tinggi tetapi tidak perlu diputar di layar kecil yang lebih besar dari 30 fps
  • RGB565 tidak memerlukan proses decode tetapi ukuran datanya terlalu besar dan banyak waktu yang dihabiskan untuk memuat data dari SD, bus SD 4-bit dan kartu SD yang lebih cepat dapat meningkatkannya sedikit (tebakan liar dapat mencapai sekitar 12 fps)
  • Proses decode MP3 belum dioptimalkan, sekarang mendedikasikan core 0 untuk decode MP3 dan core 1 untuk memutar video

Langkah 10: Selamat Bermain

Selamat Bermain!
Selamat Bermain!

Sekarang Anda dapat memutar video dan audio dengan ESP32 Anda, itu membuka banyak kemungkinan!

Saya pikir saya akan membuat TV vintage kecil nanti…

Direkomendasikan: