สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
เนื่องจากการแพร่หลายของไมโครคอนโทรลเลอร์ที่รวดเร็วขึ้น เช่น ESP32 และ ARM M series MP3 ไม่จำเป็นต้องใช้ฮาร์ดแวร์ผู้เชี่ยวชาญอีกต่อไป ตอนนี้การถอดรหัสสามารถทำได้ในซอฟต์แวร์
มีห้องสมุดที่ยอดเยี่ยมจาก Earlephilhower ที่แสดงวิธีถอดรหัสไฟล์เสียงที่หลากหลายและเล่นบนไมโครคอนโทรลเลอร์ ESP ด้วยแรงบันดาลใจจากสิ่งนี้ ฉันได้ดัดแปลงโค้ดบางส่วนเพื่อสร้างวิธีการอ่านไฟล์ MP3 แบบแยกส่วนบนไมโครคอนโทรลเลอร์
ความหวังของฉันคือวิธีการนี้จะเป็นแบบทั่วไปเพียงพอสำหรับใช้กับไมโครคอนโทรลเลอร์ที่เร็วพอ (ไม่ใช่แค่บอร์ด ESP32) แต่ ณ ตอนนี้ฉันได้ทดสอบบน ESP32 เท่านั้น
เสบียง
อย่างที่ฉันพูดไปก่อนหน้านี้ ฉันหวังว่าวิธีนี้จะใช้ได้กับไมโครคอนโทรลเลอร์ที่รวดเร็ว แต่อาจไม่เป็นเช่นนั้น ดังนั้นเพื่อทำซ้ำผลลัพธ์ของฉัน คุณจะต้อง:
- บอร์ด ESP32
- กระดานฝ่าวงล้อม SD
- การ์ด SD
- สายจัมเปอร์
- เขียงหั่นขนม
- สาย micro USB (สำหรับอัพโหลดภาพร่าง)
- Arduino IDE
ขั้นตอนที่ 1: วางเขียงหั่นขนม
วาง ESP32 และ SD card breakout บนเขียงหั่นขนม
ขั้นตอนที่ 2: การเดินสายการ์ด SD
การเชื่อมต่อการ์ด SD (ESP32 SD breakout) มีดังนี้:
GND GND
3v3 VDD
23 DI (MOSI)
19 DO (มิโซะ)
18 SCLK
5 CS
โปรดทราบว่าการเชื่อมต่อเหล่านี้จะแตกต่างกันหากคุณใช้ไมโครคอนโทรลเลอร์ตัวอื่น
ขั้นตอนที่ 3: ไลบรารีซอฟต์แวร์
หากคุณไม่ได้ติดตั้ง ESP-IDF ให้ไปที่เว็บไซต์และติดตั้ง
จากนั้นติดตั้งไลบรารี microdecoder คุณสามารถทำได้โดยดาวน์โหลดที่เก็บและวางไว้ในโฟลเดอร์ Arduino Libraries ของคุณ ปัจจุบันไลบรารี microdecoder รองรับไฟล์.wav และ.mp3
โดยไม่คำนึงถึงรูปแบบ มีวิธีการทั่วไปสองสามวิธีที่เกี่ยวข้องกับแต่ละคลาส และครอบคลุมในโค้ดด้านล่าง ซึ่งรวมถึงการรับข้อมูลเมตาของไฟล์และการพิมพ์ไปยังจอภาพแบบอนุกรม
#include "SD.h" // อินพุต
#include "mp3.h" // ตัวถอดรหัส #include "pcm.h" // ที่เก็บข้อมูลเสียงดิบ mp3 MP3; การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); // ตั้งค่า Serial SD.begin(); // ตั้งค่าไฟล์การเชื่อมต่อ SD = SD.open("/cc.mp3"); // เปิดไฟล์ MP3 MP3.begin(ไฟล์); // บอกคลาส MP3 ว่าไฟล์ใดที่จะประมวลผล MP3.getMetadata(); // รับ metadata Serial.print ("บิตต่อตัวอย่าง: "); Serial.println (MP3.bitsPerSample); // พิมพ์บิตต่อตัวอย่าง Serial.print("Sample Rate: "); Serial.println(MP3. Fs); // และอัตราตัวอย่าง } วงเป็นโมฆะ () { }
ขั้นตอนที่ 4: พล็อตข้อมูล MP3 บน Serial Monitor
ด้วยรหัสด้านล่าง คุณสามารถพล็อตข้อมูลเสียงบางส่วนบนจอภาพแบบอนุกรม การดำเนินการนี้จะช้ามากแต่จะแสดงให้คุณเห็นถึงวิธีใช้ไลบรารี MP3 นอกจากนี้ยังลดขนาดข้อมูลลงเป็น 16 เท่า เพื่อให้เมื่อวางแผนข้อมูลแล้ว ข้อมูลจะดูเหมือนรูปคลื่นเสียง รหัสนี้นำมาจากตัวอย่าง SPI_MP3_Serial.ino ที่มาพร้อมกับไลบรารี microdecoder แน่นอน ก้าวไปข้างหน้าคุณจะต้องการเล่นข้อมูลเสียงนี้อย่างใด แต่นั่นเป็นหัวข้อของคำสั่งอื่น
#include "SD.h" // อินพุต
#include "mp3.h" // ตัวถอดรหัส mp3 MP3; // MP3 คลาส pcm เสียง; // การตั้งค่าข้อมูลเสียงดิบเป็นโมฆะ () { Serial.begin (115200); // ตั้งค่า Serial SD.begin(); // ตั้งค่าไฟล์การเชื่อมต่อ SD = SD.open("/cc.mp3"); // เปิดไฟล์ MP3 MP3.begin(ไฟล์); // ส่งไฟล์ไปที่คลาส MP3 } void loop () { เสียง = MP3.decode (); // ถอดรหัสข้อมูลเสียงเป็นคลาส pcm /* มี 32 ตัวอย่างใน audio.interleaved (16 ซ้ายและ 16 ขวา) * แต่เรากำลังจะพล็อตจุดข้อมูลแรกในแต่ละช่องเท่านั้น * ลดขนาดข้อมูลอย่างมีประสิทธิภาพด้วยปัจจัย 16 (สำหรับ * ดูรูปคลื่นเท่านั้น) */ Serial.print(audio.interleaved[0]); // ช่องซ้าย Serial.print(" "); Serial.println(เสียง.อินเตอร์ลีฟ[1]); // ช่องขวา }