MP3 no Kivy. A classe SoundLoader


Tocando um arquivo MP3 no Kivy

Seja para gerar os sons típicos dos jogos, seja para ouvir música ou mesmo como elemento auxiliar na interface com o usuário, saber como “tocar” um arquivo MP3 a partir de um programa Kivy é sempre importante. Felizmente, tocar MP3 no Kivy é muito simples mesmo.

Iremos demonstrar a utilização da classe Kivy “SoundLoader” através de um pequeno programa, que basicamente apresenta dois botões ao usuário. Um deles toca a próxima música disponível no mesmo diretório onde está o programa e o segundo botão para com a música. Depois de chegar ao final das músicas, retorna a primeira música novamente.

As músicas são ordenadas por ordem alfabética do nome do arquivo, e todas devem estar no formato MP3, e armazenadas no mesmo diretório onde está o programa main.py. Neste diretório também deve ficar o arquivo mp3music.kv.

O programa, da forma como está, fica longe das funcionalidades dos atuais “players” MP3 disponíveis no mercado. Mas o objetivo é apenas demonstrar o procedimento para se tocar um MP3 no Kivy. Fica por sua conta incrementar este código básico para competir com os sistemas disponíveis hoje.

Dimensionando a IHM (interface homem máquina)

Vamos separar a parte de interface em um arquivo kv, e a funcionalidade no arquivo py. Os arquivos completos podem ser obtidos na página Todos os arquivos podem ser obtidos na página https://cadernodelaboratorio.com.br/scripts-softwares-e-arquivos-de-configuracao/, sob o nome pack170929.tar.gz. Caso você não tenha tido nenhum contato com a biblioteca Kivy, sugerimos uma visita à página https://cadernodelaboratorio.com.br/2015/05/12/tutorial-kivy-exp1/.

Código Kv comentado

.Destrinchando o código KV 
<MusicPlayer>:  # esta é a classe que será representada graficamente pelo arquivo Kv
	BoxLayout:  # decidimos utilizar o gerenciado de layout "BoxLayout"
                # para detalhes do BoxLayout visite https://cadernodelaboratorio.com.br/2015/05/12/tutorial-kivy-exp3/ 
		
        orientation:'vertical'   #os widgets serão dispostos na vertical , um label e dois botões
		spacing: 50              #entre cada widget teremos um espaço de 50 pixels
		padding: [20,20,20,20]   #em torno de cada widget temos uma "moldura" com espaço em branco de 20 pixels
    
		Label:                   #Temos um texto (label) como primeiro elemento da tela
			text: 'www.cadernodelaboratorio.com.br'
			font_size: '40dp'   #o tamanho do fonte está em dp. Se não souber o que é isto visite
                                #https://cadernodelaboratorio.com.br/2017/09/27/sobre-o-tamanho-dos-widgets-kivy/               
			
            bold: True          #o texto estará em negrito
			color: [1,0,0,0.5]  #a cor será uma mistura de vermelho e azul

			font_name: 'Roboto-Bold'  #este font existe em todas as plataformas
			
            size_hint: None,.5    #aqui definimos o tamanho do label

			pos_hint: {'center_x':.5,'center_y':.5}  #aqui definimos a posição do label 
			
            text_size: None,None   #não restringimos o tamanho do texto em nenhuma dimensão

        
		Button:                         # criamos o primeiro botão
			text: 'Tocar próxima música!'  #este é o texto que irá aparecer no botão
			font_size: '20sp'  # tamanho do font do texto. 
			size_hint: .4,.2   #dimensões x e y do botão
			pos_hint: {'center_x':.5,'center_y':.5}  #posição do botão
  			on_press: root.tocarProxima() # este método será chamado sempre que pressionamos o botão
                                          # o botão pertence a classe MusicPlay, "pai" do botão.


		Button:                        #criamos o segundo botão
			text: 'Parar'              #este é o texto que irá aparecer no botão
			font_size: '20sp'          # tamanho do font do texto. 
			size_hint: .4,.2           #dimensões x e y do botão
			pos_hint: {'center_x':.5,'center_y':.5}  #posição do botão
			on_press: root.pararMusica() # este método será chamado sempre que pressionamos o botão
                                          # o botão pertence a classe MusicPlay, "pai" do botão.

Código py comentado

.Destrinchando o código py 
import kivy                        #importa a biblioteca Kivy
kivy.require('1.10.0')             #esta é  a versão kivy atual (2017/09)


from kivy.app import App           #importação de classes necessárias ao programa
from kivy.uix.widget import Widget
from kivy.core.audio import SoundLoader
from kivy.uix.filechooser import FileSystemLocal
from kivy.uix.boxlayout import BoxLayout


class MusicPlayer(BoxLayout):     #classe principal do programa
   
    
    def __init__(self, **kwargs):                        #ao iniciar procura pelos arquivos MP3 
        super(MusicPlayer, self).__init__(**kwargs)      #disponíveis no mesmo diretório do programa
    
        file_system = FileSystemLocal()                 
    
        self.listaMusicas = []                           #cria uma lista para inserir os nomes dos arquivos
     
        for arquivoMusica  in file_system.listdir('./'): #preenche a lista com todos os nomes de arquivos que contenham 
            if '.mp3' in arquivoMusica:                  #mp3 no nome
                self.listaMusicas.append(arquivoMusica)
            
        self.indexMusicaAtual= 0                         #inicia tocando o arquivo de index 0 na lista
        
      
    
    def pararMusica(self):                              #para a musica através do método stop()
        self.musica.stop()
        
    def tocarProxima(self):
            self.musica = SoundLoader.load(self.listaMusicas[self.indexMusicaAtual]) #cria um objeto tocador de musica 
                                     # o nome do arquivo a ser tocado é dado pelo nome
                                     #disponível na lista de nomes, preenchida na inicialização do programa
                                     
            self.musica.play()      #toca a música
            self.indexMusicaAtual= self.indexMusicaAtual + 1  #atualiza o índice para a próxima música
                                                              #ou retorna à primeira
            if self.indexMusicaAtual == len(self.listaMusicas):
                self.indexMusicaAtual=0



    
class mp3Music(App):          # a aplicação mp3Music instancia um objeto MusicPlayer logo na inicialização
    def build(self):
        return MusicPlayer()
   
     

        
if __name__ == "__main__":     #cria e executa uma aplicação denominada mp3Music
    mp3Music().run()

Em resumo, para tocar um arquivo MP3 basta:

 self.musica = SoundLoader.load('nomedoarquivo')
 self.musica.play()

Se você executar o programa com o comando python main.py, a sua tela deverá ficar assim:

Demostração de um tocador MP3

Este experimento foi realizado numa máquina Linux Mint18.1, utilizando o python3.5 e o Kivy 1.10. Os arquivos mp3 que serão tocados deverão ser inseridos no mesmo diretório do script.

 

Até o nosso próximo encontro!

Deixe um comentário