Audio MP3 e OGG em seu Sistema/Software Java!

49 respostas
dcbasso

Estou disponibilizando para todos que precisarem utilizar uma classe para tocar músicas/audio MP3 e OGG. Não há muita complicação para utiliza-la, somente para instalar os SPIs, mas no meu blog tem tudo que vocês precisam… Um tuto de como configurar as SPIs, descrição da classe, construtor, métodos…
Ainda tem coisas por alguns métodos que não estão prontos, mas creio que em breve colocarei tudo rodando!

Mais informações, download da classe e das SPIs no link abaixo:

Link: http://dcbasso.blogspot.com/

Abraços a todos, qualquer dúvida só postar lá ou aqui!!!

49 Respostas

sergiolopes

Parabéns pela iniciativa!
Realmente esses SPI sao meio chatos de usar diretamente. Tempos atras estava tentando integra-los com uma aplicacao em JavaFX e sofri um bocado.

dcbasso

O valeu ae! Quero ver se mais pra frente (depois das aulas) faço uma classe boa realmente boa e completinha para utilizar os SPIs…

Mas se tem uma coisa coisa que deveria melhor, é a integração das SPIs com o Eclipse ou até mesmo com a VM, mas isso é coisa que por enquanto esta fora do meu alcance! hehe
Mas ae quem quiser ajudar a implementar algo, até mesmo agora o STOP, ajuda sempre vai bem!

Abraços a todos!

Marky.Vasconcelos

Gostei bastante da ideia e vou ver se consigo fazer algo também.
Parabéns pela iniciativa e se puder coloque um topico na sessão de tutorials com oque você escreveu no blog.

ViniGodoy

Pensei q vc tinha desenvolvido as APIs.

Mas daí vi que é a boa e velha Javazoom mesmo. É realmente bem legal!

dcbasso

é realmente aproveitei a javaZoom, mas se pegamos e fizermos uma classe baseado nela, como metodos mais consiso e prático, ela vira uma boa api!
=]

suricate

aew!!
boa iniciativa, realmente muito prático (:

Marky.Vasconcelos

Eu consegui faze alguma coisa.
Eu criei um jar é só colocar o nome da musica e apertar play^^
Em breve postarei os fontes assim que termina o javadoc

Em anexo o jar

Marky.Vasconcelos

PS: Com Pause e Resume.

E a ProgressBar em baixo está sendo implementada também para saber qual a porcentagem da musica tocada.

suricate

aew man, ficou bem legal :smiley:

dcbasso

Mark, cara brigadão pela força! Vou ver amanhã assim que puder seu jar! Depois de eu ver tudo, e se pudermos, quero trocar um idéia… susse! Mas veremos amanhã!!

Abraçosss

Marky.Vasconcelos

Mas realmente o que fiz acho que foi muito POG. Mas vou colocar os Sources quendo eu terminar a documentação.
PS:Nem começei a documentação tive ocupado o dia inteiro e vou fazer isso amanhã.

dcbasso

hum de fato, melhor com docs e código principalmente!

Abraços
**avise aqui no post quando documentar tudo, abraços

Marky.Vasconcelos

Realmente não consegui fazer uma documentação adequada, o que fiz foi POG mas quem está curioso do que fiz nesse arquivo está os sources

dcbasso

aeeee… tem agora sim! com o sources! valeuuu!!!

Assim que der vou ver o codigo e se der dou uma mexida nele! =]

Abraçossssss

dcbasso

hum, eu arrumaria uma metodo somente (por enquanto) para melhorar o código e diminuir os POGs (hehehe):

public String getExtensao() {
		StringBuilder sb = new StringBuilder();
		
		for (int i = (musica.lastIndexOf('.')+1); i < musica.length(); i++) {
			sb.append(musica.charAt(i));
		}
		return sb.toString().toUpperCase();
	}

acho que assim ficará melhor... não tem muitas alterações, mas acho que o código ficará melhor!

ABraçosss

Andre_Brito

Cara… impressionante isso… hehehe…
Parabéns Mark! Funcionou direitão aqui! Hehe.

Marky.Vasconcelos
dcbasso:
hum, eu arrumaria uma metodo somente (por enquanto) para melhorar o código e diminuir os POGs (hehehe):
public String getExtensao() {
		StringBuilder sb = new StringBuilder();
		
		for (int i = (musica.lastIndexOf('.')+1); i < musica.length(); i++) {
			sb.append(musica.charAt(i));
		}
		return sb.toString().toUpperCase();
	}

acho que assim ficará melhor... não tem muitas alterações, mas acho que o código ficará melhor!

ABraçosss

PS: Eu não fiz esse método, só deixei como está.

dedejava:
Cara... impressionante isso... hehehe... Parabéns Mark! Funcionou direitão aqui! Hehe.

Muito obrigado, e méritos para o dcbasso que forneceu a fonte original.

dcbasso

hahah eh acabei de lembrar… uhauhahu eu mesmo que fiz o erro! mas soh descobri este codigo agora! huahuahua

Valeu ae Mark, voce que relamente colocou uma funcionabilidades boas na classe… =]

Marky.Vasconcelos
dcbasso:
hum, eu arrumaria uma metodo somente (por enquanto) para melhorar o código e diminuir os POGs (hehehe):
public String getExtensao() {
		StringBuilder sb = new StringBuilder();
		
		for (int i = (musica.lastIndexOf('.')+1); i < musica.length(); i++) {
			sb.append(musica.charAt(i));
		}
		return sb.toString().toUpperCase();
	}

acho que assim ficará melhor... não tem muitas alterações, mas acho que o código ficará melhor!

ABraçosss

Alias agora que lembrei que mechi sim

é que anteriormente invés de StringBuilder você tava usando uma String e usando += invés de append^^

Marky.Vasconcelos

Ai ta um player que fiz hoje

Me desculpem por estar tão feio mas funciona :smiley:

http://www.4shared.com/file/36416542/b396e215/Music.html

É no 4Shared porque no fórum não pode fazer upload de mais que 512 Kb

dcbasso

funciona play/pause/stop?

cidao

libera o codigo ae :smiley:

dcbasso

tem uma API mto boa de usar… JMF (java media framework)… le arquivos de video, audio e tem opção de salvar em video e audio em alguns formatos…

hehehe, uma dica ae para quem deseja algo!

cidao

o player que eu estou fazendo usa o JMF, mas eu nao consigo pegar as propriedades da musica, como titulo, autor e outros e nao consigo pausar a musica.

estou a procura de como fazer isso.

dcbasso

eu tinha visto uns sites bem legais sobre o assunto, mas o material fica em casa… não é muita coisa, mas ensina um pouco sobre a JMF! Parece ser mto mto boa a API!

Marky.Vasconcelos

Eu to fazendo um equalizer agora :smiley:
Depois trabalho na tela que ta meio ruim mesmo.

Marky.Vasconcelos

Depois libero código.

dcbasso

Eae Mark… retornando ao Assunto… agora apenas por prazer mesmo! hehehe lazer…
Seguinte, como anda as coisas… andei aprendendo algumas técnicas melhores em JAVA, e vou mexer mais com questões de API e etc… dai to vendo ae se tem alguma novidade sobre o assunto… no mais eh isso!

Abraçosss

magemelli

Galera, no inicio eu fiquei meio assustado com o trabalho de fazer um aplic. em java para tocar mp3, vendo os exemplos de vocês fiquei surpreso e fascinado pelo objetivo final, agora só me falta transformar em um aplicativo via socket, mas me auxiliando de excelentes programadores, sinto minha tarefa menos árdua, prometo que até o fim do ano coloco uma aplicação CLIENTE/SERVIDOR que executa um servidor de audio, com cliente escutando músicas, obrigado.

dcbasso

Acho que eu tinha que tomar vergonha na cara e voltar a mexer com o projetinho!!!

dcbasso

A ideia do socket eh massa eim… Se desse para controlar a lista de arquivos que eu quero que toque em meu PC sei lah, seria 10 tbm!
Por exemplo, acesso o meu servidor de Musicas via net e executo a musica, com playlist e tudo mais que tem direito… e posso pular a musica e tudo… um player 100% web!

magemelli

Kra, eu tava pensando sobre isso, se o kra fizer um arquivo tipo texto com a lista de músicas. No servidor, eu posso acrescentar e deletar itens do arquivo lista, com o nome e o caminho das músicas e passar pro cliente tratar e mostrar através de table, dá uma mão na roda, tipo na execução, porém acho que não dá pra avançar e recuar na própria música…
mas isso ainda é mais adiante, quero tratar um pouco sobre o player local, qualquer avanço eu posto aqui…

dcbasso

Mas voce entendeu, seria como acessar a pasta de músicas dele e escutar no meu PC, mas seria via STREAM que isso iria ocorrer…
Tinha que bolar um projetinho, para ver se seria viável… em termos de consumo de banda e etc…
Por exemplo, no meu pc tenho uns 90gb de músicas MP3 (tamanho médio de cada 4mb), imagina qnt tempo ia ficar baixando a lista de músicas do PC lá… iria demorar mesmo né?
hehehe

magemelli

bah, tempão… teria que ver, que tamanho ficaria essa lista, passando um TXT…
mas seria interessante do kra tentar fazer… no decorrer desse mês vou trabalhar nisso…
nem que o kra tente dividir o TXT em 3 ou 4 pedaços, para passar a cada vez uma parte, ou um numero X de linhas no arquivo texto…
só testando pra ver… de qualquer forma, preciso fazer o trabalho e vou continuar esse projeto hehehe
qualquer coisa tamo aí…

dcbasso

Olha no SQL tem um esquema voce faz um SELECT, e vai pegando o resultado de pouco em pouco e ele controla isso pra voce de boa…
Não sei agora como fazer, mas sei que tem… teria que bolar algo assim… tipo, voce vai descendo o SCROLL BAR, a lista vai sendo baixado… talvez!!!

magemelli

ateh poderia, mas o envolver banco de dados já fica mais complicado… Dá uma olhada nos arquivos m3u do winamp…

Eu peguei uma lista de músicas de mais ou menos 2 gb e 370 músicas, e salvei ela, a lista saiu com 30kb
se você mandar ela abrir com o wordpad, você vai ver como é fácil manipular via arquivo, e não envolve BD…
mas sei lah, ainda estamos trabalhando em teorias hehehe

dcbasso

Sim sim… a 30kb, eh pequeno!!!
Sem trabalhar com Banco, mas tentar tirar proveito da ideia do SQL, e bolar algo parecido…

Bem, eu vou olhar o número de músicas MP3 que tenho… mas não uso o winamp para fazer o teste do arquivo, vou ver se o FOOBAR tem algo parecido com isso.
O que o winamp salva neste arquivo? manda umas 2 linhas de exemplo ae!

magemelli

Quando ví a primeira vez quase nem acredite hehehe

#EXTM3U
#EXTINF:242,Armandinho - 2008 - Semente - 01.Semente
D:\Marco\Músicas\2008 - Semente\01 - Semente.mp3
#EXTINF:194,Armandinho - 2008 - Semente - 02.Morena Nativa
D:\Marco\Músicas\2008 - Semente\02 - Morena Nativa.mp3
#EXTINF:221,Armandinho - 2008 - Semente - 03.A Filha
D:\Marco\Músicas\2008 - Semente\03 - A Filha.mp3
#EXTINF:234,Armandinho - 2008 - Semente - 04.Amigo
D:\Marco\Músicas\2008 - Semente\04 - Amigo.mp3
#EXTINF:207,Armandinho - 2008 - Semente - 05.Onda do Arraial
D:\Marco\Músicas\2008 - Semente\05 - Onda do Arraial.mp3
#EXTINF:250,Armandinho - 2008 - Semente - 06.Babilônia me Chama
D:\Marco\Músicas\2008 - Semente\06 - Babilônia me Chama.mp3

a linha que começa com # define o nome no winamp a linha de baixo define o caminho…

dcbasso

Nossa ele armazena bastante coisa até…
Olha, teria que ver o seguinte antes… A pessoa que acessar remotamente, vai poder trabalhar em cima da lista!
Por exemplo… eu to acessando remoto e não estou querendo todas músicas, só quero ouvir a pasta lá C:\Músicas\Sertanejas 2008, mas o playlist que está aberto tem todas musicas da pasta C:\Músicas\ …

Voce tretende poder abrir arquivos/pastas no playslist remotamente?
Esta manipulação remota, se houver, vai interferir no player local, no playlist e na musica que o usuário estiver tocando localmente?

dcbasso

Assim, se a gente fazer um playlist para mandar remoto ±:

Nome do arquivo: Armandinho - 2008 - Semente.mp3
Nome do aquivo: Armandinho - 2008 - Morena Nativa.mp3

Como poderia ficar no arquivo nosso:

ID, NOME DA MÚSICA

0 , Armandinho - 2008 - Semente

1 , Armandinho - 2008 - Morena Nativa

.
.
.

Estes IDs, seriam gerados pelo aplicação servidor, para ele saber exatamente qual música você gostaria de tocar. Sem pasar o endereço da música por completo, podemos economizar um bom espaço do arquivo!!!
Na hora da aplicação remota pegar uma música para tocar, você apenas manda o ID para o servidor mandar a musica que esta relativo a tal ID!

Aproveitando, acho que seria interessante a aplicação ter algo como sessão, para cada lado saber de qual playlist será tocado, para não dar confusão, a aplicação remota esta vendo Semente no ID 0, e o Servidor estar mandando um outro artista sei la…

marcio.rga

Iniciativa louvável, quando precisar já sei onde recorrer.

Obrigado

magemelli

Realmente, passando o id, você só manda o necessário, mas para cada playlist
e na realização de cada sessão, o servidor teria que ter um id para cada sessão, e disparar uma thread de inicialização do player para cada sessão aberta,isso vai ter que ficar mais adiante…

magemelli

Realmente, passando o id, você só manda o necessário, mas para cada playlist
e na realização de cada sessão, o servidor teria que ter um id para cada sessão, e disparar uma thread de inicialização do player para cada sessão aberta,isso vai ter que ficar mais adiante…

J

O último link no blog está com problema! :lol:

Abraço!!

dcbasso

Sobre o blog, acho que perdi mesmo a classe MP3!
Malditos backups!!!

Gemelli, você qual a sua idéia para este projeto?
Achou mto complexo a idéia que dei?
Ou melhor, toda nova sessão que o cara abrir é uma nova playlist, algo assim!

hvivox

O projeto postado pelo Mark funciona normalmente, porém quando a musica para de tocar é mostrado seguinte erro:

Exception in thread "Thread-7" java.lang.IllegalArgumentException: illegal len: -1
	at com.sun.media.sound.DirectAudioDevice$DirectDL.write(Unknown Source)
	at Musica.play(Musica.java:85)
	at Musica.rawplay(Musica.java:106)
	at Musica.access$0(Musica.java:102)
	at Musica$2.run(Musica.java:71)
	at java.lang.Thread.run(Unknown Source)

Alguem pode ajudar a resolver essa situação?

abraços.

hvivox

Será o projeto está incompatível com a versão 7.1 do JDK?

hvivox

RESOLVIDO…
PARA RESOLVER O PROBLEMA MELHOREI O METODO

hvivox

hvivox:
RESOLVIDO…
PARA RESOLVER O PROBLEMA MELHOREI O METODO

<blockquote>

/**

* Play same part of the music

*/

private void play(byte[] data) throws IOException {

try {

// Read a stream

int length = aIOStream.read(data, 0, data.length);
//REALIZA A LEITURA DO STREAM
		if(length!= -1){
			// Play the stream
			sDLine.write(data, 0, length);
		}
		
		//CONDIÇÃO DESENVOLVIDA PARA EVITAR O ERRO DE ARGUMENTO ILEGAL
		if(length==-1){
			close();
			flag=false;
			System.out.println("SOM FINALIZADO"+length);
		}		
		
		//sDLine.write(data, 0, length);
	} catch (IOException e) {
		throw e;
	}
}

Tentei postar o projeto mais não consegui. De qualquer forma para corrigir o problema basta copiar e colar o trecho do codigo informado na classe Musica.

att.

Criado 16 de outubro de 2007
Ultima resposta 4 de nov. de 2012
Respostas 49
Participantes 11