Olá, estou tentando desenvolver uma aplicação pra reproduzir músicas sem compressão (PCM) de um servidor.
O servidor lê uma pasta contendo as músicas e envia todos os arquivos pelo socket.
A questão é que até consigo reproduzir os dados de áudio da primeira música vindos direto do fluxo (classe InputStream), mas
quando o player começa a executar a segunda música a aplicação me retorna o seguinte erro:
[quote]D:\ESTUDOS\FACULDADE\TCC\TESTE DO PROTOCOLO\Protocolo Multimídia\test>java Player 192.168.0.139 39000
Trying to connect to 192.168.0.139 39000
Made server connection.
java.io.IOException: mark/reset not supported
at java.io.InputStream.reset(InputStream.java:334)
at java.io.FilterInputStream.reset(FilterInputStream.java:200)
at com.sun.media.sound.WaveFileReader.getFMT(WaveFileReader.java:258)
at com.sun.media.sound.WaveFileReader.getAudioInputStream(WaveFileReader.java:160)
at javax.sound.sampled.AudioSystem.getAudioInputStream(AudioSystem.java:1094)
at Player.player(Player.java:35)
at Player.main(Player.java:29)
D:\ESTUDOS\FACULDADE\TCC\TESTE DO PROTOCOLO\Protocolo Multimídia\test>[/quote]
Aqui estão as partes do problema, o método de Server readMusic(), que lê os arquivos da pasta e envia os bytes pelo socket,
[code]// Le os arquivos do diretorio e trata os dados para o fluxo de saida,
// como quantidade de arquivos(o), nome e conteudo.
public void readMusic(Socket clientConn)
{
try
{
OutputStream os = clientConn.getOutputStream();
// Lista os arquivos do diretorio
File qntFile = new File(dir);
String files[] = qntFile.list();
int qnt_files = files.length;
// Trata os dados para o fluxo de saida.
System.out.println("Sending File...");
for (int cur_file = 0; cur_file < qnt_files; cur_file++)
{
String fileStr = dir + files[cur_file];
// Envia o conteudo do arquivo.
byte b[] = new byte[1024];
InputStream in = new FileInputStream(new File(fileStr));
int numRead=0;
BufferedInputStream stream = new BufferedInputStream(in);
if(cur_file > 0)
if(stream.markSupported() != true)
stream.mark(0);
while ( ( numRead = stream.read(b, 0, b.length)) > 0) {
os.write(b, 0, numRead);
}
os.flush();
}
}
catch(Exception e)
{
e.printStackTrace();
listen(); // volta a verificar a porta se algum erro acontecer
}
System.exit(1);
} // Fim do metodo readMusic().[/code]
e o método player() de Player
[code]public static void player(InputStream in) {
try {
while(in != null){
AudioInputStream stream = AudioSystem.getAudioInputStream(in);
// codificacao ALAW e ULAW precisam ser convertidas
// para PCM_SIGNED antes de serem reproduzidas.
AudioFormat format = stream.getFormat();
if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) {
format = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
format.getSampleRate(),
format.getSampleSizeInBits()*2,
format.getChannels(),
format.getFrameSize()*2,
format.getFrameRate(),
true);
stream = AudioSystem.getAudioInputStream(format, stream);
}
// Cria o canal de comunicacao com o driver de som
SourceDataLine.Info info = new DataLine.Info(
SourceDataLine.class, stream.getFormat(),
((int)stream.getFrameLength()*format.getFrameSize()));
SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info);
line.open(stream.getFormat());
line.start();
// Le e reproduz continuamente os pedacos do arquivos de audio.
int numRead = 0;
byte[] buf = new byte[line.getBufferSize()];
while ((numRead = stream.read(buf, 0, buf.length)) >= 0) {
int offset = 0;
while (offset < numRead) {
offset += line.write(buf, offset, numRead-offset);
}
}
line.drain();
line.stop();
}
}
catch (IOException e) {
e.printStackTrace();
}
catch (LineUnavailableException e) {
e.printStackTrace();
}
catch (UnsupportedAudioFileException e) {
e.printStackTrace();
}
} // Fim do metodo player().[/code]
Se alguém puder ajudar. Por favor, é para o famigerado trabalho de conclusão de curso.
Hernane Orlando