הפעל סרטון עם ESP32: 10 שלבים (עם תמונות)
הפעל סרטון עם ESP32: 10 שלבים (עם תמונות)
Anonim
הפעל וידאו באמצעות ESP32
הפעל וידאו באמצעות ESP32

מדריכים אלה מראים משהו על הפעלת וידאו ושמע עם ESP32.

שלב 1: תכונות ומגבלות ESP32

מאפיינים

  • 4 אוטובוס SPI, 2 אוטובוס SPI זמין עבור מרחב משתמש, הם SPI2 ו- SPI3 או נקראים HSPI ו- VSPI. שני האוטובוסים SPI יכולים לפעול לכל היותר 80 מגה -הרץ. תיאורטית הוא יכול לדחוף 320x240 פיקסלים בצבע 16 סיביות ל- SPI LCD במהירות של 60 fps, אך הוא עדיין לא ספר את תקרת הזמן הנדרשת לקריאת ופענוח נתוני הווידאו.
  • אוטובוס SD של 1 סיביות / 4 סיביות יכול לחבר כרטיס SD בפרוטוקול מקורי
  • יציאת שמע DAC פנימית של I2S
  • מעל 100 KB RAM זמין למאגר וידאו ושמע
  • כוח עיבוד הוגן מספיק לפענוח JPEG (הפעלת Motion JPEG) ודחיסת נתוני LZW (הפעלת-g.webp" />
  • גרסת ליבה כפולה יכולה לפצל נתוני קריאה מכרטיס SD, לפענח ולדחוף ל- SPI LCD למשימות מרובות במקביל ולהגביר את ביצועי ההפעלה

מגבלות

  • אין מספיק זיכרון RAM פנימי בכדי שיהיה לו מאגר מסגרות כפול עבור 320x240 בצבע של 16 סיביות, הוא הגביל את עיצוב ריבוי המשימות. זה יכול להתגבר קצת עם PSRAM חיצוני למרות שהוא איטי יותר מ- RAM פנימי
  • אין מספיק כוח עיבוד לפענוח וידאו mp4
  • לא בכל גרסת ESP32 יש 2 ליבות, הדוגמא מרובת המשימות מרוויחה רק בגרסה כפולה

הפניה:

שלב 2: פורמט וידאו

RGB565

או שנקרא צבע 16 סיביות הוא פורמט נתונים גולמי הנפוץ בתקשורת בין MCU לתצוגת צבעים. כל פיקסל צבע המיוצג על ידי ערך 16 סיביות, הראשון של 5 סיביות הוא ערך אדום, אחרי 6 סיביות הוא ערך ירוק ולאחר מכן ערך כחול של 5 סיביות. ערך 16 סיביות יכול ליצור 65536 וריאציות צבע ולכן הוא נקרא גם 64K צבעים. אז גודל הדקה של 320x240@30 fps יהיה בגודל: 16 * 320 * 240 * 30 * 60 = 2211840000 סיביות = 276480000 בתים או מעל 260 מגה

זהו פורמט קובץ נפוץ באינטרנט מאז שנות התשעים. הוא מגביל את וריאציית הצבעים של כל מסך עד 256 צבעים ואל תחזור אחסן את הפיקסל באותו צבע כמו המסגרת הקודמת. אז זה יכול להקטין הרבה את גודל הקובץ, במיוחד כאשר כל מסגרת אנימציה לא תשנה יותר מדי פרטים. דחיסת LZW מיועדת לפענוח על ידי מחשב שנות התשעים, כך של- ESP32 יש גם כוח עיבוד הוגן מספיק כדי לפענח אותו בזמן אמת.

Motion JPEG

או שנקרא M-JPEG / MJPEG הוא פורמט דחיסת וידאו נפוץ עבור חומרת לכידת הווידיאו עם כוח עיבוד מוגבל. למעשה זה רק שילוב של מסגרות JPEG דוממות. השווה עם MPEG או MP4, Motion JPEG אין צורך בטכניקה אינטנסיבית חישובית של חיזוי מסגרות, כל מסגרת היא עצמאית. אז זה דורש פחות משאבים כדי לקודד ולפענח.

הפניה:

en.wikipedia.org/wiki/List_of_monochrome_a…

en.wikipedia.org/wiki/GIF

en.wikipedia.org/wiki/Motion_JPEG

שלב 3: פורמט אודיו

PCM

פורמט נתונים גולמיים לאודיו דיגיטלי. ESP32 DAC משתמשים בעומק סיביות של 16 סיביות, כלומר כל נתוני 16 סיביות מייצגים אות אנלוגי מדוגם דיגיטלי. רוב אודיו הווידיאו והשיר משתמשים בדרך כלל בקצב מדגם ב -44100 מגה -הרץ, כלומר 44100 אות אנלוגי מדוגם בכל שנייה. אז, נתוני גלם PCM מונו של אודיו של דקה אחת יהיו בגודל: 16 * 44100 * 60 = 42336000 סיביות = 5292000 בתים או מעל 5 מגה. גודל אודיו הסטריאו יהיה כפול, כלומר מעל 10 מגה -בתים

MP3

MPEG Layer 3 הוא פורמט אודיו דחוס שנמצא בשימוש נרחב לדחיסת שירים מאז שנות התשעים. הוא יכול להקטין באופן דרמטי את גודל הקובץ עד לעשירית מתבנית ה- PCM הגולמית

הפניה:

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

en.wikipedia.org/wiki/MP3

שלב 4: עיצוב המרה

פרויקט זה משתמש ב- FFmpeg להמיר את הסרטון לפורמט ESP32 קריא.

אנא הורד והתקן את FFmpeg באתר הרשמי שלהם אם עדיין לא:

המרת אודיו PCM

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

המרה לאודיו MP3

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

המר ל- 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

המרה ל--g.webp

ffmpeg -i input.mp4 -vf "fps = 15, קנה מידה = -1: 176: דגלים = lanczos, חיתוך = 220: in_h: (in_w -220)/2: 0, פיצול [s0] [s1]; [s0] palettegen [p]; [s1] [p] paletteuse "-loop -1 220_15fps.gif

המרה ל- 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

הערה:

ניתן להשתמש באופטימיזציה נוספת של-g.webp" />

שלב 5: הכנת חומרה

הכנת חומרה
הכנת חומרה

לוח Dev ESP32

כל לוח ESP32 dev-core צריך להיות בסדר, הפעם אני משתמש ב- TTGO ESP32-Micro.

תצוגת צבע

כל תצוגת צבע שתומכת ב- Arduino_GFX צריכה להיות בסדר, הפעם אני משתמש בלוח פריצה ILI9225 עם חריץ לכרטיס SD.

תוכל למצוא את רשימת תצוגת הצבעים הנתמכת של Arduino_GFX ב- Github:

github.com/moononournation/Arduino_GFX

כרטיס זיכרון

כל כרטיס SD צריך להיות בסדר, הפעם אני משתמש ב- SanDisk "מהירות רגילה" של 8 ג'יגה -בייט מיקרו SD עם מתאם SD.

שֶׁמַע

אם אתה רוצה להשתמש באוזניות בלבד, פשוט חבר את סיכות האוזניות לסיכה 26 ו- GND יכול להאזין לשמע. או שאתה יכול להשתמש במגבר זעיר להשמעת אודיו עם רמקול.

אחרים

כמה לוחות לחוטים וקרש לחם

שלב 6: ממשק SD

ממשק SD
ממשק SD
ממשק SD
ממשק SD

לוח פריצה LCD ILI9225 כלל גם סיכות פריצה של חריץ SD crd. זה יכול לשמש כאוטובוס SPI או אוטובוס SD של 1 סיביות. כפי שצוין בהוראות הקודמות שלי, אני מעדיף להשתמש באוטובוס SD של 1 סיביות, כך שהפרויקט הזה יתבסס על אוטובוס SD של 1 סיביות.

שלב 7: חבר אותו יחד

שים את זה ביחד
שים את זה ביחד
שים את זה ביחד
שים את זה ביחד
שים את זה ביחד
שים את זה ביחד

התמונות לעיל מציגות את פלטפורמת הבדיקה בה אני משתמשת בפרויקט זה. לוח הלחם הלבן מודפס בתלת מימד, ניתן להוריד ולהדפיס אותו ב thingiverse:

החיבור בפועל תלוי איזו חומרה יש לך ביד.

להלן סיכום החיבור:

ESP32

Vcc -> LCD Vcc GND -> LCD GND GPIO 2 -> SD D0/MISO -> נגד 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

עיין:

שלב 8: תכנית

תכנית
תכנית

Arduino IDE

הורד והתקן את Arduino IDE אם עדיין אינך עושה זאת:

www.arduino.cc/en/main/software

תמיכה ב- ESP32

עקוב אחר הוראות ההתקנה כדי להוסיף תמיכה ב- ESP32 אם עדיין אינך עושה זאת:

github.com/espressif/arduino-esp32

ספריית Arduino_GFX

הורד את ספריות Arduino_GFX האחרונות: (לחץ על "שיבוט או הורד" -> "הורד ZIP")

github.com/moononournation/Arduino_GFX

ייבוא ספריות ב- Arduino IDE. (תפריט "סקיצה" של Arduino IDE -> "כלול ספרייה" -> "הוסף ספריית ZIP" -> בחר קובץ ZIP שהורדת)

אודיו ESP8266

הורד את ספריות האודיו העדכניות ביותר ESP8266: (לחץ על "שיבוט או הורד" -> "הורד ZIP")

github.com/earlephilhower/ESP8266 אודיו

ייבוא ספריות ב- Arduino IDE. (תפריט "סקיצה" של Arduino IDE -> "כלול ספרייה" -> "הוסף ספריית ZIP" -> בחר קובץ ZIP שהורדת)

קוד לדוגמה של RGB565_video

הורד את קוד הדוגמה העדכני ביותר של RGB565_video: (לחץ על "שיבוט או הורד" -> "הורד ZIP")

github.com/moononournation/RGB565_video

נתוני כרטיס SD

העתק את הקבצים המומרים לכרטיס SD והכנס אותם לחריץ כרטיס ה- LCD

הידור והעלאה

  1. פתח את SDMMC_MJPEG_video_PCM_audio_dualSPI_multitask.ino ב- Arduino IDE
  2. אם אינך משתמש ב- ILI9225, שנה את קוד המחלקה החדש (סביב שורה 35) לשם הנכון של הכיתה
  3. לחץ על כפתור "העלאה" של Arduino IDE
  4. אם לא הצלחת להעלות את התוכנית, נסה לנתק את החיבור בין ESP32 GPIO 2 לבין SD D0/MISO
  5. אם אתה מוצא שהכיוון אינו נכון, שנה את ערך "הסיבוב" (0-3) בקוד המחלקה החדש
  6. אם התוכנית פועלת היטב אתה יכול לנסות דוגמא אחרת להתחיל עם SDMMC_*
  7. אם אין לך חריץ לכרטיס SD או שאין לך FFmpeg מותקן, עדיין תוכל לנסות דוגמת SPIFFS_*

שלב 9: אמת מידה

אמת מידה
אמת מידה

להלן סיכום הביצועים לפורמט וידאו שונה (220x176) ושמע (44100 MHz):

פוּרמָט מסגרת לשנייה (fps)
MJPEG + PCM 30
15
RGB565 + PCM 9
MJPEG + MP3 24

הערה:

  • MJPEG + PCM יכול להגיע ל- fps גבוה יותר, אך אין צורך בהפעלה במסך זעיר העולה על 30 fps
  • RGB565 אינו דורש תהליך פענוח אך גודל הנתונים גדול מדי ונדרש זמן רב בעת טעינת נתונים מ- SD, אוטובוס SD של 4 סיביות וכרטיס SD מהיר יותר יכול לשפר אותו מעט (ניחוש פרוע יכול להגיע סביב 12 fps)
  • תהליך פענוח MP3 עדיין לא מותאם, הוא מוקדש כעת ליבה 0 לפענוח MP3 וליבה 1 להפעלת וידאו

שלב 10: משחק שמח

משחק שמח!
משחק שמח!

עכשיו אתה יכול לנגן וידאו ושמע עם ESP32 שלך, הוא פתח אפשרויות רבות!

אני חושב שאעשה אחר כך טלוויזיה וינטג 'קטנטנה …