Поток MP3 . Чтение и Metadata (ЕSP32)
- Войдите на сайт для отправки комментариев
Добрый день, как говорится, Коллеги! :)
Я не один день мучился: гуглил и кодил. Но всегда начинаю сначала. Я программировал в очень разных средах до этого, "ардуинами" занялся недавно как решил попробовть ESP32.
Помогите решить 2 задачи:
1. Чтение потока правильно. Не совсем понимаю какой вид переменной использовать верно будет для хранения считанного байта. Далее хочу его поместить в массив и т.о. сделать буфер. Само собой для последущего скармливания этого материала некому "плееру" для наслаждения моих ушей. Я бы начал с малого: прочитать байт, рассмотреть его и понять где начало "даты" и где она закончилась и началась "метадата", которая идет символьная...
2. Поиск в нем метаданных. Если коротко о теории, нашел такой текст: "...включите этот следующий заголовок! Icy-MetaData:1 Это сообщает серверу, что вы хотите метаданные. Теперь отправьте пару <CrLf>. Хорошо, сервер ответит кучей заголовков, а затем начнет отправлять вам данные. В этих заголовках будет icy-metaint:8192 или аналогичный. Этот 8192 является метаинтервалом. Это важно и действительно единственное значение, которое вам нужно. Обычно это 8192, но не всегда, поэтому обязательно прочитайте это значение! В основном это означает, что вы получите 8192 байта данных MP3, а затем фрагмент мета, за которым следуют 8192 байта данных MP3, а затем фрагмент мета." Взято отсюда https://fooobar.com/questions/301373/pulling-track-info-from-an-audio-stream-using-php
В теории прям легко :)
Итак, с чего я начал? Простое подключение через WiFiClient
const char * streamLink3 ="mp3.ffh.de";
const char * streamPath3 ="/radioffh/hqlivestream.mp3";
unsigned int streamPort3 =80;
while(!client.connect(streamLink3, streamPort3))
{
Serial.println("!client.connect - RETRY");
}
client.print(String("GET ") + streamPath3 + " HTTP/1.1\r\n" +
"Host: " + streamLink3 + "\r\n" +
"Accept: */*\r\n"+
"Accept-Encoding: gzip, deflate, br\r\n"+
"Connection: keep-alive\r\n\r\n"
);
Serial.println("connection is OK"); И вот в "лупе" у меня уже есть несколько вариантов но ни 1 из них не работает.
Самое простое это побайтно прочитать , это уже азы и все так умеют.
Если сделать вот так, то я получаю некий байт. Он может быть символом, а может и не быть. Не знаю что с этой картиной делать. Нашел некую закономерность, но а дальше тупняк.
uint8_t tmpbuff = client.read();
Увидел на просторах интернетиков небольшой цикл вроде как по поиску такого "мета" , но на Java. Немного округлил, оно взлетело на "ардуино". Да, когда интерпретировал код мне не понравилось, что в Java int брался для чтения данных. У меня с ним не работало правило while ((b = client.read()) != -1) и я переделал на uint8_t. Что-то стало крутится после этого. int metaDataOffset=16000 я взял из потока данного немецкого стрима "mp3.ffh.de" (что в коде выше). У "нашего радио" кажется этот параметр 8192.
int metaDataOffset=16000; //8192; //TODO
uint8_t b;
int count = 0;
int metaDataLength = 4080; // 4080 is the max length
boolean inData = false;
String metaData;
int newStrCounter=0;
// Stream position should be either at the beginning or right after headers
while ((b = client.read()) != -1) {
count++;
// Length of the metadata
if (count == metaDataOffset + 1) {
metaDataLength = b * 16;
}
if (count > metaDataOffset + 1 && count < (metaDataOffset + metaDataLength)) {
inData = true;
} else {
inData = false;
}
if (inData) {
if (b != 0) {
metaData += (char )b;
//Serial.println("[");
newStrCounter++;
if (newStrCounter>100)
{ newStrCounter=0;
Serial.println(" ");
}
Serial.print( b);
//Serial.println("]");
}
}
if (count > (metaDataOffset + metaDataLength))
{
Serial.println("break---");
break;
}
}Это про то как я узнал размер "фрейма"
В общем прошу помощи. Для начала бы просто в цикле читать данные, научится понимать этот блок и раскидывать в 2 кучи: метадата и дата (mp3)
Прошу помощи. Может кому-то вместе со мной будет интересно разобрать такой материал , а может кто-то уже решил таких задач десятки - поделитесь. Заранее всем спасибо!
Питоновец - да? Привык за слова не отвечать, а в си придется...
Питоновец - да? Привык за слова не отвечать, а в си придется...
не, с питоном никогда не знаком :) начинал я в C++, а дальше понесло в PHP и 1С,
Вы бы по делу что-нибудь написали
не, с питоном никогда не знаком :) начинал я в C++, а дальше понесло в PHP и 1С,
Вы бы по делу что-нибудь написали
Вот как-то не верю после этого вопроса: "Не совсем понимаю какой вид переменной использовать верно будет для хранения считанного байта. "
ну ладно вам! человек переработал. Уже голова кипит. А тут целый день 1С ковырял. Накладывает свой отпечаток. Я с потоками и байтами имею дело раз в год. По большим праздникам
Нет "в Ардуине" никаких потоков, в сущности. Массивы создаёшь байтовые и сохраняешь туда из регистров читанные байты. А потом интерпретируешь как текст или как raw-данные. Контроллеру все равно абсолютно.
Update с фронтов. Метадату удалось увидеть, она все-таки существует!
Буду дальше думать над задачами.
https://prnt.sc/vesdrd
Update с фронтов. Метадату удалось увидеть, она все-таки существует!
Буду дальше думать над задачами.
https://prnt.sc/vesdrd
Это с какой-такой программы такие метах-данные? Я ее не видел и не целовал.
даже я знакомое слово увидел - LAME3.99.5 )))
Update с фронтов. Метадату удалось увидеть, она все-таки существует!
Буду дальше думать над задачами.
https://prnt.sc/vesdrd
Это с какой-такой программы такие метах-данные? Я ее не видел и не целовал.
да ну что вы. данные такие с любого MP3 потока получаются (возможно и AAC) , а программа - это монитор порта Arduino
да ну что вы. данные такие с любого MP3 потока получаются (возможно и AAC) , а программа - это монитор порта Arduino
Ой, подкололи :) А откуда берутся данные для монитора порта Вы догадываетесь?
мда... не ожидал такой "теплой" встречи. Думал, найду единомышленников. В итоге одни подколы и странные вопросы.
В первом посте я описал задачу свою. Что я читаю и откуда. Даже ссылку на сайт дал.
Одному "питон жмет", второй не поймет какая программа? Да вроде форум "ардуино", программа ведь так же называется. Никаких других программ не использую. Девайс только у меня ESP32. Но это я указал в названии топика.
Злые вы, уйду я от вас!
p.s. понимаю, что уровень моей "грамоты" не самый высокий. Но ведь для этого люди и общаются и задают вопросы. И форум кажется для этого и сделан. Иначе нахуа?
В жизни вообще нет единомышленников. Разве что в пивной, после второй кружки.
мда... не ожидал такой "теплой" встречи. Думал, найду единомышленников. В итоге одни подколы и странные вопросы.
Но ведь для этого люди и общаются и задают вопросы. И форум кажется для этого и сделан. Иначе нахуа?
Если бы Вы придерживались правил сетевой этики, то знали бы:
- зачем нужен этот форум (совсем не для того, для чего Вы предполагаете),
- что указывать старожилам, для чего нужен форум - mauvais ton на данном форуме.