PDA

View Full Version : [JAVA]Leggere mp3 da socket


Cesco83
15-04-2006, 17:16
Salve,

sto tentando di leggere un file mp3 da un socket in connessione con un web server.

Il file viene ricevuto correttamente, ma certi caratteri "sballano" e il file recuperato suona in modo stranissimo ( effetto "bit wash" ).

Confrontando il file originale e la copia create dal mio "HTTP getter" certi caratteri risultano sballati. Sono sicuro che sia un problema di cofidica quindi... ma come fare?

Ecco il ciclo di lettura da socket

//lettura linea per linea, scrivo linea su file
while ((line = rd.readLine()) != null) {
buffer = buffer+line;
//System.out.println(line);
}
out.write(buffer);
out.close();
System.out.print("DONE!!!");

Avete qualche idea a riguardo?
Grazie

Hell-VoyAgeR
15-04-2006, 21:21
Salve,

sto tentando di leggere un file mp3 da un socket in connessione con un web server.

Il file viene ricevuto correttamente, ma certi caratteri "sballano" e il file recuperato suona in modo stranissimo ( effetto "bit wash" ).

Confrontando il file originale e la copia create dal mio "HTTP getter" certi caratteri risultano sballati. Sono sicuro che sia un problema di cofidica quindi... ma come fare?

Ecco il ciclo di lettura da socket

//lettura linea per linea, scrivo linea su file
while ((line = rd.readLine()) != null) {
buffer = buffer+line;
//System.out.println(line);
}
out.write(buffer);
out.close();
System.out.print("DONE!!!");

Avete qualche idea a riguardo?
Grazie

Perche' leggi linea per linea? un file mp3 e' un file binario, ti conviene fare un ciclo di lettura con un byte[] buffer.
La dimensione del buffer e' a tua scelta... io generalmente mi trovo bene sui 4096 bytes alla volta.

Cesco83
15-04-2006, 23:24
ok,
pero il BufferedReader del socket mi da come metodi di lettura solo
String ReadLine(),
char Read(),
char Read(char buff[]),

quindi nessun metodo che ritorna array di byte! come faccio? grazie!
Francesco

Frank1962
15-04-2006, 23:52
ok,
pero il BufferedReader del socket mi da come metodi di lettura solo
String ReadLine(),
char Read(),
char Read(char buff[]),

quindi nessun metodo che ritorna array di byte! come faccio? grazie!
Francesco
....e se usassi un ByteBuffer?

Cesco83
16-04-2006, 00:32
Ho provato a usare un ByteBuffer e a leggere lo stream direttamente da socket.getInputStream.read(byte [] buffer), ma ancora niente, anzi - i due file ora sembrano molto piu' diversi visti dal blocco note...

Qualcuno sa come intervenire? Qualche esempio?
Grazie.

pinok
16-04-2006, 00:42
Il BufferedReader lo lascerei perdere, visto che servirebbe per il testo e tu hai un binario

Read text from a character-input stream, buffering characters so as to provide for the efficient reading of characters, arrays, and lines

Perché non provi con un semplice read (byte[]) della classe InputStream ??

Dun
16-04-2006, 03:16
Ho provato a usare un ByteBuffer e a leggere lo stream direttamente da socket.getInputStream.read(byte [] buffer), ma ancora niente, anzi - i due file ora sembrano molto piu' diversi visti dal blocco note...

Qualcuno sa come intervenire? Qualche esempio?
Grazie.

Se sei il cesco che credo io..domani ti chiamo a casa...heehhehe


Cya!

PGI-Bis
16-04-2006, 12:54
Ti serve la dimensione del buffer di dati da trasferire. Una volta che hai in mano quella, la lettura è piuttosto semplice:

//Posta length la dimensione del file mp3
ByteBuffer data = ByteBuffer.allocate(length);
ReadableByteChannel in = Channels.newChannel(inputStream);
while(data.hasRemaining()) in.read(data);
data.rewind();

Nota che la dimensione del file mp3 e, in genere, la quantità di dati da trasferire, non coincide necessariamente con la quantità di byte disponibili per la lettura dal flusso (i vari size(), available(), -1 eccetera).

Se desideri trasferire dati dal web e a meno che tu non deva fare un esercizio sui socket, puoi affidarti ad un oggetto URL:

URL addr = //un url
URLConnection conn = addr.openConnection();
ByteBuffer data = ByteBuffer.allocate(conn.getContentLength());
ReadableByteChannel ch = Channels.newChannel(conn.getInputStream());
while(data.hasRemaining()) ch.read(data);
data.rewind();

Nelle indicazioni ho omesso per brevità la gestione delle eccezioni, la chiusura dei canali e la gestione del caso in cui si voglia interrompere il trasferimento.

Cesco83
16-04-2006, 17:09
Ciao a tutti, risolto!

ora riesco a leggere correttamente i bytes del file mp3. Grazie mille per il prontissimo e utilissimo aiuto!

Se sei il cesco che credo io..domani ti chiamo a casa...heehhehe

sgammato... eheheh

Grazie mille a tutti!

flaviocapaccio
25-01-2012, 13:26
Ringrazioe PGI-BIS per la soluzione indicata che mi piace molto! Complimenti!