Библиотека извлечения информации ID3v2 из MP3
Я использую Adafruit Music Maker с TFT-экраном на Mega 2560. Я могу вытащить данные ID3v1 из конца MP3, но я хотел бы получить данные ID3v2, так как затем я могу перенести обложку альбома на TFT вместе с названием/исполнителем/альбомом/и т. Д.
Мои первоначальные поиски ничего не дали для библиотеки, которая извлекает заголовки ID3v2. Прежде чем я начну самостоятельно раскалывать этот орех, я хочу убедиться, что ничего не упускаю из виду.
Кто-нибудь использовал библиотеку для извлечения данных ID3v2 из MP3?
@Mighty Ferengi, 👍0
2 ответа
Существует SD - библиотека, предназначенная для использования с VS1053, которая имеет некоторую дополнительную поддержку тегов id3. Проверьте это здесь : https://github.com/mpflaga/Arduino_Library-vs1053_for_SdFat
Вот что я написал до сих пор. Это извлекает данные из заголовка ID3v2 в начале mp3-файла.
void frameInfo(File track, char tvalue[64], char albval[64], char artval[64],
char fname[30], bool showpic) {
uint32_t start = 10;
uint32_t lastfrm = 10;
bool done = false;
track.getName(fname,max_chars);
while (!done) {
uint8_t buff[4];
uint32_t ltwo[4];
char tag[5];
uint32_t fsize;
track.seek(start);
track.read((uint8_t *)tag, 4);
tag[5] = 0;
track.seek(start + 4);
track.read((uint8_t *)buff,4);
ltwo[0] = buff[0];
ltwo[1] = buff[1];
ltwo[2] = buff[2];
ltwo[3] = buff[3];
fsize = (ltwo[0] << 24) | (ltwo[1] << 16) | (ltwo[2] << 8) | ltwo[3];
start = start + 10;
if (tag[0] == 'T' && tag[1] == 'I' && tag[2] == 'T' && tag[3] == '2') {
uint32_t i;
int vlen = 0;
char val[fsize];
track.seek(start);
track.read((uint8_t *)val, fsize);
for (i=0;i<fsize;i++) {
if (isAlphaNumeric(val[i])) {
tvalue[vlen] = val[i];
vlen++;
}
else if (val[i] == '(' || val[i] == ')' || val[i] == ' ') {
tvalue[vlen] = val[i];
vlen++;
}
}
tvalue[vlen] = '\0';
}
else if (tag[0] == 'T' && tag[1] == 'A' && tag[2] == 'L' && tag[3] == 'B') {
uint32_t i;
int vlen = 0;
char val[fsize];
track.seek(start);
track.read((uint8_t *)val, fsize);
for (i=0;i<fsize;i++) {
if (isAlphaNumeric(val[i])) {
albval[vlen] = val[i];
vlen++;
}
else if (val[i] == '(' || val[i] == ')' || val[i] == ' ') {
albval[vlen] = val[i];
vlen++;
}
}
albval[vlen] = '\0';
}
else if (tag[0] == 'T' && tag[1] == 'P' && tag[2] == 'E' && tag[3] == '1') {
uint32_t i;
int vlen = 0;
char val[fsize];
track.seek(start);
track.read((uint8_t *)val, fsize);
for (i=0;i<fsize;i++) {
if (isAlphaNumeric(val[i])) {
artval[vlen] = val[i];
vlen++;
}
else if (val[i] == '(' || val[i] == ')' || val[i] == ' ') {
artval[vlen] = val[i];
vlen++;
}
}
artval[vlen] = '\0';
}
else if (tag[0] == 'A' && tag[1] == 'P' && tag[2] == 'I' && tag[3] == 'C') {
uint32_t i;
int vlen = 0;
char val[30];
char test[30];
uint8_t raw[fsize - 11];
track.seek(start);
track.read((uint8_t *)val, 11);
for (i=0;i<11;i++) {
if (isAlphaNumeric(val[i])) {
test[vlen] = val[i];
vlen++;
}
else if (val[i] == '(' || val[i] == ')' || val[i] == ' ') {
test[vlen] = val[i];
vlen++;
}
}
test[vlen] = '\0';
if (fsize < 200000) {
track.seek(start+11);
Serial.println(fsize+11);
//track.read((uint8_t *)pic, fsize-11);
}
}
else {
}
start = start + fsize;
if ((start == lastfrm + 10) || start > musicPlayer.mp3_ID3Jumper(track)) {
done = true;
}
else {
lastfrm = start;
}
}
track.rewind();
}
Это извлекает текстовые данные для заголовка/исполнителя/альбома, но проблема в том, как прочитать изображение из заголовка, не перегружая Мега. Большинство изображений имеют размер около 30 тысяч байт, но в оперативной памяти Mega нет места для такого пространства. У меня есть скетч, настроенный на чтение формата jpeg, преобразование его в BMP, а затем запись в TFT. Есть ли какой-то метод, который я мог бы использовать, чтобы скетч записал байты в файл на SD-карте, а затем прочитал их оттуда?
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Arduino и 2 модуля Adafruit Fingerprint работающие вместе
- Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
- Почему я получаю ошибку "SendCommand не был объявлен"
- Как добавить условие в пример RFID?
- Как заставить двигатели постоянного тока работать одновременно?
- Как подключить 2 датчика отпечатков пальцев к Arduino Mega? Пожалуйста помоги
- у меня возникают странные проблемы при попытке прочитать форму последовательного соединения gps
Я нашел это, но он читает только теги ID3v1, которые находятся в конце файла и содержат только информацию об исполнителе/названии/альбоме., @Mighty Ferengi