Mục lục:

Phát video với ESP32: 10 bước (có hình ảnh)
Phát video với ESP32: 10 bước (có hình ảnh)

Video: Phát video với ESP32: 10 bước (có hình ảnh)

Video: Phát video với ESP32: 10 bước (có hình ảnh)
Video: CHỤP HÌNH ẢNH LƯU THẺ NHỚ DÙNG ESP32- CAM || TAKE PICTURE TO SD WITH ESP32- CAM 2024, Tháng mười một
Anonim
Phát video với ESP32
Phát video với ESP32

Tài liệu hướng dẫn này cho thấy điều gì đó về phát video và âm thanh với ESP32.

Bước 1: Tính năng & Hạn chế của ESP32

Đặc trưng

  • 4 SPI bus, 2 SPI bus có sẵn cho không gian người dùng, chúng là SPI2 và SPI3 hoặc được gọi là HSPI và VSPI. Cả hai xe buýt SPI có thể chạy tối đa 80 MHz. Về mặt lý thuyết, nó có thể đẩy 320x240 pixel màu 16-bit lên SPI LCD ở tốc độ 60 khung hình / giây, nhưng nó chưa tính thời gian cần thiết để đọc và giải mã dữ liệu video.
  • Bus SD 1-bit / 4-bit có thể kết nối thẻ SD trong giao thức gốc
  • Đầu ra âm thanh DAC bên trong I2S
  • hơn 100 KB RAM có sẵn cho bộ đệm video và âm thanh
  • Công suất xử lý đủ tốt để giải mã JPEG (phát JPEG chuyển động) và nén dữ liệu LZW (phát-g.webp" />
  • Phiên bản lõi kép có thể chia dữ liệu đã đọc từ thẻ SD, giải mã và đẩy sang SPI LCD thành các tác vụ đa nhiệm song song và tăng hiệu suất phát lại

Hạn chế

  • không đủ RAM bên trong để có bộ đệm khung đôi cho 320x240 ở màu 16-bit, điều này làm hạn chế thiết kế đa nhiệm. Nó có thể khắc phục một chút với PSRAM bên ngoài mặc dù nó chậm hơn RAM bên trong
  • không đủ sức mạnh xử lý để giải mã video mp4
  • không phải tất cả phiên bản ESP32 đều có 2 lõi, mẫu đa tác vụ chỉ có lợi trên phiên bản lõi kép

Tham khảo:

Bước 2: Định dạng video

RGB565

Hay được gọi là 16-bit màu là một định dạng dữ liệu thô thường được sử dụng trên giao tiếp giữa MCU và màn hình màu. Mỗi pixel màu được biểu thị bằng giá trị 16 bit, 5 bit đầu tiên là giá trị màu đỏ, 6 bit tiếp theo là giá trị xanh lá cây và sau đó là giá trị 5 bit màu xanh lam. Giá trị 16-bit có thể tạo ra 65536 biến thể màu nên nó còn được gọi là 64K màu. Vì vậy, video 1 phút 320x240 @ 30 khung hình / giây sẽ có kích thước: 16 * 320 * 240 * 30 * 60 = 2211840000 bit = 276480000 byte hoặc hơn 260 MB

Đây là định dạng tệp phổ biến trên web từ những năm 1990. Nó giới hạn sự biến đổi màu sắc cho mỗi màn hình lên đến 256 màu và không lặp lại lưu trữ pixel có cùng màu với khung hình trước đó. Vì vậy, nó có thể làm giảm kích thước tập tin đi rất nhiều, đặc biệt là khi mỗi khung hình ảnh động không thay đổi quá nhiều chi tiết. Nén LZW được thiết kế có khả năng giải mã bởi máy tính những năm 1990, do đó, ESP32 cũng có sức mạnh xử lý đủ công bằng để giải mã nó trong thời gian thực.

JPEG chuyển động

Hay được gọi là M-JPEG / MJPEG là một định dạng nén video phổ biến cho phần cứng quay video có khả năng xử lý hạn chế. Nó thực sự chỉ đơn giản là sự ghép nối các khung hình JPEG tĩnh. So với MPEG hoặc MP4, Motion JPEG không cần kỹ thuật tính toán chuyên sâu về dự đoán giữa các khung hình, mọi khung hình đều độc lập. Vì vậy, nó yêu cầu ít tài nguyên hơn để mã hóa và giải mã.

Tham chiếu:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

Bước 3: Định dạng âm thanh

PCM

Một định dạng dữ liệu thô cho âm thanh kỹ thuật số. ESP32 DAC sử dụng độ sâu bit 16 bit, có nghĩa là mỗi dữ liệu 16 bit đại diện cho một tín hiệu tương tự được lấy mẫu kỹ thuật số. Hầu hết âm thanh video và bài hát thường sử dụng tốc độ lấy mẫu ở 44100 MHz, có nghĩa là 44100 tín hiệu tương tự được lấy mẫu cho mỗi giây. Vì vậy, dữ liệu thô PCM âm thanh đơn âm 1 phút sẽ có kích thước: 16 * 44100 * 60 = 42336000 bit = 5292000 byte hoặc hơn 5 MB. Kích thước của âm thanh nổi sẽ tăng gấp đôi, tức là hơn 10 MB

MP3

MPEG Layer 3 là một định dạng âm thanh nén được sử dụng rộng rãi để nén bài hát từ những năm 1990. Nó có thể giảm đáng kể kích thước tệp xuống dưới 1/10 định dạng PCM thô

Tham chiếu:

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

en.wikipedia.org/wiki/MP3

Bước 4: Định dạng chuyển đổi

Dự án này sử dụng FFmpeg chuyển đổi video thành định dạng có thể đọc được ESP32.

Vui lòng tải xuống và cài đặt FFmpeg tại trang web chính thức của họ nếu chưa có:

Chuyển đổi sang âm thanh PCM

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

Chuyển đổi sang âm thanh MP3

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

Chuyển đổi sang 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

Chuyển đổi sang-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] Palette [p]; [s1] [p] Palette "-loop -1 220_15fps.gif

Chuyển đổi sang 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

Ghi chú:

Một số công cụ web có thể tối ưu hóa thêm-g.webp" />

Bước 5: Chuẩn bị phần cứng

Chuẩn bị phần cứng
Chuẩn bị phần cứng

Bảng nhà phát triển ESP32

Bất kỳ bảng nhà phát triển ESP32 lõi kép nào cũng được, lần này tôi đang sử dụng TTGO ESP32-Micro.

Màn hình màu

Bất kỳ màn hình màu nào hỗ trợ Arduino_GFX đều ổn, lần này tôi đang sử dụng bảng đột phá ILI9225 có khe cắm thẻ nhớ SD.

Bạn có thể tìm thấy danh sách hiển thị màu được hỗ trợ Arduino_GFX tại Github:

github.com/moononournation/Arduino_GFX

Thẻ SD

Bất kỳ thẻ SD nào cũng được, lần này tôi đang sử dụng micro SD 8 GB "tốc độ bình thường" của SanDisk với bộ chuyển đổi SD.

Âm thanh

Nếu bạn chỉ muốn sử dụng tai nghe, chỉ cần kết nối chân tai nghe với chân 26 và GND có thể nghe âm thanh. Hoặc bạn có thể sử dụng một bộ khuếch đại nhỏ để phát âm thanh với loa.

Khác

Một số breadboard và dây breadboard

Bước 6: Giao diện SD

Giao diện SD
Giao diện SD
Giao diện SD
Giao diện SD

Bảng đột phá LCD ILI9225 cũng bao gồm một chân đột phá khe cắm SD crd. Nó có thể được sử dụng như bus SPI hoặc bus SD 1-bit. Như đã đề cập trong các hướng dẫn trước đây của tôi, tôi thích sử dụng bus SD 1 bit, vì vậy dự án này sẽ dựa trên bus SD 1 bit.

Bước 7: Kết hợp nó lại với nhau

Đặt nó lại với nhau
Đặt nó lại với nhau
Đặt nó lại với nhau
Đặt nó lại với nhau
Đặt nó lại với nhau
Đặt nó lại với nhau

Những hình ảnh trên cho thấy nền tảng thử nghiệm tôi đang sử dụng trong dự án này. Breadboard trắng được in 3D, bạn có thể tải về và in tại thingiverse:

Kết nối thực tế phụ thuộc vào phần cứng bạn có trong tay.

Dưới đây là tóm tắt kết nối:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0 / MISO -> 1k điện trở -> 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

Tham khảo:

Bước 8: Chương trình

Chương trình
Chương trình

Arduino IDE

Tải xuống và cài đặt Arduino IDE nếu bạn chưa thực hiện:

www.arduino.cc/en/main/software

Hỗ trợ ESP32

Làm theo Hướng dẫn cài đặt để thêm hỗ trợ ESP32 nếu bạn chưa thực hiện:

github.com/espressif/arduino-esp32

Thư viện Arduino_GFX

Tải xuống các thư viện Arduino_GFX mới nhất: (nhấn "Sao chép hoặc Tải xuống" -> "Tải xuống ZIP")

github.com/moononournation/Arduino_GFX

Nhập thư viện trong Arduino IDE. (Menu Arduino IDE "Sketch" -> "Bao gồm Thư viện" -> "Thêm Thư viện. ZIP" -> chọn tệp ZIP đã tải xuống)

ESP8266Audio

Tải xuống thư viện ESP8266Audio mới nhất: (nhấn "Sao chép hoặc Tải xuống" -> "Tải xuống ZIP")

github.com/earlephilhower/ESP8266Audio

Nhập thư viện trong Arduino IDE. (Menu Arduino IDE "Sketch" -> "Bao gồm Thư viện" -> "Thêm Thư viện. ZIP" -> chọn tệp ZIP đã tải xuống)

Mã mẫu RGB565_video

Tải xuống mã mẫu RGB565_video mới nhất: (nhấn "Sao chép hoặc Tải xuống" -> "Tải xuống ZIP")

github.com/moononournation/RGB565_video

Dữ liệu thẻ SD

Sao chép các tập tin đã chuyển đổi sang thẻ SD và lắp vào khe cắm thẻ LCD

Biên dịch & Tải lên

  1. Mở SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino trong Arduino IDE
  2. Nếu bạn không sử dụng ILI9225, hãy thay đổi mã lớp mới (khoảng dòng 35) để sửa tên lớp
  3. Nhấn nút "Tải lên" Arduino IDE
  4. Nếu bạn không tải lên được chương trình, hãy thử ngắt kết nối giữa ESP32 GPIO 2 và SD D0 / MISO
  5. Nếu bạn thấy hướng không chính xác, hãy thay đổi giá trị "xoay" (0-3) trong mã lớp mới
  6. Nếu chương trình chạy tốt, bạn có thể thử bắt đầu mẫu khác với SDMMC_ *
  7. Nếu bạn không có khe cắm thẻ SD hoặc bạn chưa cài đặt FFmpeg, bạn vẫn có thể thử SPIFFS_ * example

Bước 9: Điểm chuẩn

Điểm chuẩn
Điểm chuẩn

Dưới đây là tóm tắt hiệu suất cho các định dạng video (220x176) và âm thanh (44100 MHz) khác nhau:

Sự sắp xếp Khung hình trên giây (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

Ghi chú:

  • MJPEG + PCM có thể đạt fps cao hơn nhưng không cần thiết phải phát trong màn hình nhỏ hơn 30 fps
  • RGB565 không yêu cầu quá trình giải mã nhưng kích thước dữ liệu quá lớn và tiêu tốn nhiều thời gian khi tải dữ liệu từ SD, bus SD 4-bit và thẻ SD nhanh hơn có thể cải thiện nó một chút (dự đoán có thể đạt khoảng 12 khung hình / giây)
  • Quá trình giải mã MP3 chưa được tối ưu hóa, nó hiện dành lõi 0 cho giải mã MP3 và lõi 1 để phát video

Bước 10: Chơi vui vẻ

Chơi vui vẻ!
Chơi vui vẻ!

Giờ đây, bạn có thể phát video và âm thanh với ESP32 của mình, nó mở ra nhiều khả năng!

Tôi nghĩ sau này tôi sẽ làm một chiếc TV cổ điển nhỏ bé…

Đề xuất: