Audio in streaming

Salve ragazzi io avrei la necessita di ascoltare da remoto quindi magari via adsl una sorgente audio. Ovviamente la sorgente audio la vorrei collegare con arduino che con l'ethernet shield va in rete. Dall'altra parte non so ancora cosa utilizare, magari semplicemente un browser.
Qualcuno può darmi qualche idea?

Non penso che l'arduino abbia abbastanza ram (2kb) e processore per fare quello che chiedi!!
Fa fatica a fornire le pagine HTML!!

l'audio è normalmente campionato a 44100Hz pari a 44.1KHz, pari a 0.0441MHz quindi arduino (che lavora a 16MHz) dovrebbe farcela. certo, mancano i tempi di fetch del dato, inserimento nel pacchetto e invio, ma credo che ce la faccia alla grande per un client solo, soprattutto se usa il wiznet che si occupa del (pesantissimo) protocollo ISO/OSI.
per un server multiclient dovrebbe farcela usando uno streaming multicast UDP.

Allora, makky, quali sono le tue competenze informatiche? sai programmare? hai mai programmato giocando con l'audio? e con la rete? sai la differenza tra un firewall e una nat? insomma, sicuro di aver le competenze per portare avanti un progetto del genere, o è meglio se prima aggiusti la mira?

insomma io partirei così: lettura di un file TXT da microSD
lettura di un mp3 da microSD
stream di un dato via TCP e programma a PC che lo salvi su disco (magari in java così lo puoi anche inserire nelle pagine html come applet)
stream dell'mp3 e uso del precedente programma, giusto per controllare che l'mp3 venga inviato e ricevuto correttamente
modifica del programma lato PC per riprodurre lo stream.

Molto programmi come VLC, media player, etc... supportano vari tipi di streaming, però sono protocolli che dovresti implementare seguendo le RFC, il che complica un poco la storia perchè dubito che siano stati pensati per risparmiare risorse lato cpu/memoria, ma solo a lato network

l'UDP è migliore per queste cose del TCP, ma devi lottare con il problema che non c'è sicurezza che i dati arrrivino, o siano corretti, o i provider bloccano i multicast.
Devi fare anche i conti con MTU, banda disponibile (in upload a lato server, il dowload a lato client di solito è molto alto).
Se ti tocca fare un sistema multiclient senza sfruttare il multicast, allora forse ti conviene usare 3 arduino: uno si occupa del layer ISO/OSI, invia le richieste di connessione al secondo arduino, che le gestisce, mentre il trzo arduino si occupa solo del recupero del file mp3 e della sua pacchetizzazione.

L'argomento era stato affrontato qualche topic fa e dopo varie valutazioni tutti d'accordo abbiamo lasciato "morire" la cosa non perchè a livello matematico non ce la faccia ma perchè il convertitore A/D contenuto nell'ATmega non ce la fà..... essendo troppo lento .....

ratto non ti seguo. Stai tirando in mezzo l'ADC, che assolutamente non serve per fare streaming di un mp3 salvato su di una smart card.
Non puoi campionare musica, o riprodurla, (forse i MIDI) ma stiamo parlando di altre cose.

lesto:
ratto non ti seguo. Stai tirando in mezzo l'ADC, che assolutamente non serve per fare streaming di un mp3 salvato su di una smart card.
Non puoi campionare musica, o riprodurla, (forse i MIDI) ma stiamo parlando di altre cose.

Ops... perdonatemi... mi devo essere confuso io con qulache vecchio topic.... sorry.... :blush:

Ovviamente la sorgente audio la vorrei collegare con arduino

Io ho inteso la fonte come un microfono...
Magari è come dice @lesto ed intende una SD!

comunque anche con un microfono (e qualche componente hw in più come un amplificatore) si può fare..
http://lab.robomotic.com/index.php?option=com_content&view=article&id=52:audio-beacon-part-1&catid=37:beginners&Itemid=28

questi hanno fatto esattamente ciò che ti serve fino al punto 3 del mio primo post però con stream attraverso la seriale
carto, campiona a 8KHz, ma è la stessa frequenza dei telefoni di casa... Frequenza di campionamento - Wikipedia

Guglio:

Ovviamente la sorgente audio la vorrei collegare con arduino

Io ho inteso la fonte come un microfono...
Magari è come dice @lesto ed intende una SD!

Comunque anch io capirei some sorgente un microfono o un altra fonte analogica.

Vediamo cosa dice makky

Ciao Uwe

Anche parlando di uno strem audio basato su un file mp3 letto da SD avrei qualche dubbio sul fatto che Arduino sia in grado di gestire il flusso dati in real time.
Non scordiamoci che la SD e l'Ethernet shield condividono il bus SPI e che sia leggere la SD, blocchi di 512 byte per volta, che inviare i dati su Ethernet, con relativa gestione dello stream non sono operazioni leggere dal punto di vista elaborazione.

non sapevo che l'ethernet usava la SPI... Non ho mai usato la SPI, può gestire contemporaneamente 2 host? io sapevo che lòa SD la puoi leggere in i2c..
con 1,5MB al minuto (media degli mp3 che ho) son ~26300 Byte al secondo... ovvero 50 letture al secondo..
Quanto è la velocità in byte di i2c e SPI?

ratto93:

lesto:
ratto non ti seguo. Stai tirando in mezzo l'ADC, che assolutamente non serve per fare streaming di un mp3 salvato su di una smart card.
Non puoi campionare musica, o riprodurla, (forse i MIDI) ma stiamo parlando di altre cose.

Ops... perdonatemi... mi devo essere confuso io con qulache vecchio topic.... sorry.... :blush:

Beh se non altro non solo io avevo capito che si voleva usare un microfono.....

lesto:
non sapevo che l'ethernet usava la SPI... Non ho mai usato la SPI, può gestire contemporaneamente 2 host? io sapevo che lòa SD la puoi leggere in i2c..

La SPI è un bus multidrop, cioè più device possono coesistere in parallelo, però richiede un pin aggiuntivo di controllo, il CS, per ogni dispositivo collegato al master.
Le SD usano la SPI.

con 1,5MB al minuto (media degli mp3 che ho) son ~26300 Byte al secondo... ovvero 50 letture al secondo..
Quanto è la velocità in byte di i2c e SPI?

I2C su Arduino al massimo 400 kbps, la SPI non credo arrivi olte 2 Mbps.
Però quello che conta non è tanto la velocità di trasferimento dei dati quanto tutti i passaggi intermedi e il fatto che prima devi leggere il blocco dati, 512 byte per volta, dalla SD e poi inviarlo alla Ethernet shield, gestendo il relativo protocollo, il tutto più velocemente del tempo necessario per riprodurre i dati, altrimenti lo stream audio comincia ad andare a singhiozzo.
Se poi ci mettiamo di mezzo pure wiring con tutti i colli di bottiglia che, per ovvi motivi, crea ecco che non riesci ad inviare in modo continuo il flusso dati.
Da varie prove che ho fatto con la ethernet shield in modalità server ho visto che si fa fatica ad aggiornare più di poche volte al secondo una semplicissima pagina web, figuriamoci ad inviare oltre 26 kBytes al secondo costantemente usando un protocollo dedicato per lo streaming che non mi pare sia gestito direttamente dal WIZ.

il wix supporterà l'upd, credo, che va più che bene. Poi come ho detto prima per una cosa professionale 3 atmega, unio per gestire i flussi, uno per gestire le connessioni(non serve con multicast) e uno per leggere la SD o campionare il microfono

edit se l'i2c va a 50kB/s forze è un poco al limite. La SPI non dovrebbe aver problemi, capisco che il problema sia la richiesta dei dati, ma il fatto che la SPI sia gestita via hardware dovrebbe semplificare le cose no? oppure la SPI è una virtualizzazione di Wiring/arduino?

ps. ogni aggiornamento di pagina HTML è una creazione di connesione, distruzione della stessa, e invio di molti pacchetti che probabilmente non raggiungono nemmeno metà MTU... cosa che invece nello streaming si tende a riempire, creando così un buffer.

Ragazzi scusatemi se rispondo solo ora, ma sono stato fuori tutta la giornata. Innanzitutto grazie mille per il vostro interessamento.
Per prima cosa vorrei precisare forse perchè non l'ho spiegato esplicitamente che a me interessa ascoltare in streaming una sorgente audio collegata magari ad arduino quindi possiamo intenderlo come microfono che poi potrebbe essere un ingresso RCA. Il campionamento a me va bene anche a 8Khz e mi va bene anche il collegamento con un unico client. Io sinceramente pensavo di fare una shield con l'hardware appositamente studiato che fa tutto il lavoro di campionamento e quant'altro da usare ovviamente con un arduino e una shield ethernet.
Lesto ho buone basi per cominciare differenze tra nat e firewall le conosco, come conosco C e conosco l'elettronica.
Arduino lo conosco da poco, da qualche mese giusto il tempo di provarlo un po' con qualche applicazione abbastanza semplice. Prima programmavo le FoxBoard.
Spero di farcela a farlo con Arduino (ovviamente anche con il vostro aiuto) perchè mi piace molto come scheda.
Grazie

Ovviamente non l'ho specificato ma credo si era capito, che non ci capisco niente di audio XD

Saluto tutti i partecipanti a questa interessante discusione.
Io invece di audio ne capisco abbastanza..è il mio lavoro e mi unisco volentieri a questo gruppo perchè vorrei fare esattamente l'inverso di Makky e cioè mettere un pc con un software tipo VLC o Winamp in play, creare dello streaming audio (magari anche in formato AAC che occupa meno banda) e provar a creare con Arduino un player audio via lan.(Ho acuistato al momento l'arduino uno, il modulo ethernet e un modulo che dovrebbe permettere almeno da SD di fare la decodifica da AAC ad audio.

Questo sarebbe il primo passo; poi l'implementazione prevederebbe la possibilità di gestire su arduino tramite un webserver gli indirizzi e le porte di connessione del client(arduino) al serverdi streaming UDP(l'idea è un multicast uno a molti) tramite browser.

E l'ultima implementazione (ma questa è da malati me ne rendo conto) sarebbe poter generare sul pc dei codici da trasferire insieme allo streaimng audio su arduino che con una scheda ad optoisolatori o rele possa fare commutazioni a seconda dei codici ricevuti..

Ok non insultatemi.. :slight_smile:

Mie conoscenze..?audio, informatica, assembler, pascal, qualcosa di Visual Basic e abbastanza di elettronica a partire dallo Z80 e dall' 8255; tempo a disposizione per sviluppare questa idea..anche anni.. :wink: la soddisfazione non ha prezzo..ne fretta

paolottino, ti sei posto un bel traguardo.
Per cominciare il flusso stream avviene via tcp/udp o qualche altro protocollo?
se non è TCP o UDP ti devi implementare anche il protocollo...

poi dovresti implementare il codec AAC, se parti da qualche implementazione opensource è più facile, ma dovrai molto probabilmente litigare con la mancanza di risorse dell'arduino, in particolare la mancanza di memoria per il programma e la RAM, salvo che non usi uno shield già precotto (ma ne esistono per l'AAC?)

makky io non ho mai lavorato sull'audio, ma probabilmente quello che devi fare è il seguente:
capire l'MTU della rete (in pratica il massimo di dati che stanno in un frame, quindi devi aggiungere il peso dell'UDP(64byte) o del TCP(circa 200byte).
creare un array di byte della dimensione dell'MTU (e già mi sa che siamo oltre la ram dell'ATMEGA, magari puoi sfruttare la EEPROM o una SD... almeno in remoto la MTU tende ad essere 1500, in locale è molto più grande, io la ho a 16436)
in loop
fare un numero di letture analogiche dal circuito del microfono pari alla grandezza dell'array / 2 (poichè un inte sono 2 byte)
inviare l'array
fine loop

poi a lato PC leggi questi dati e li ricostruisci nel formato che vuoi.

Lo streaming dovrebbe avvenire in UDP, i pacchetti vengono inviati senza controllo sul fatto che vengano effettivamente ricevuti(l'audio è un segnale realtime e quando è perso è perso..meglio un interruzzioncina ognitanto che bufferizzare e poi grndi salti).
Per quello che riguarda la codifica da AAC in relatà ho appena comprato un arduino, una scheda ethernet da applicargli e questa..

che non so ancora come usare, se funziona, come interfacciare..ma mi sembrava interessante averla per il progetto..
L'udio in lineare vuole circa 1,4 Mbits di banda mentre con l'AAC già con 32Kbits si ha una buona qualità.
Temo che la difficoltà maggiore sia la decodifica per cui possano mancare risorse, ma confido nella schedina di cui sopra..
In realtà la mia scheda lo streaming deve solo riceverlo dalla lan e decodificarlo in audio e mandarlo in uscita sul Jack da 2,5mm della schedina.

Il resto..?non lo so...io appena mi arriva il materiale ci provo..poi ci siete voi.. ;o)