View Full Version : [JAVA]Leggere mp3 da socket
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.
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?
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.
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 ??
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!
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.
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!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.