Reproduzindo arquivos de áudio com Python

39

Estou procurando uma biblioteca Python bem mantida que permita reproduzir arquivos de áudio no meu Raspberry Pi usando a saída de áudio padrão.

Até agora, tentei várias, mas nenhuma delas parece funcionar. Embora o pyglet funcione bem no meu computador comum, ele causa um erro no Raspberry Pi. Existe uma biblioteca Python que foi provada como fácil de usar?

Stein
fonte
Comprovado como fácil de usar é um tipo de parente, mas eu postei uma alternativa ao pygame para uma pergunta semelhante no StackOverflow aqui . Basicamente, essa alternativa é vlc.py (o módulo libVLC Python, que é muito bem mantido).
Ben
Uma pergunta mais abaixo diz que Pyglet trabalha com RPi. Você pode atualizar com seu erro?
Brian Bulkowski

Respostas:

32

Eu recomendo o Pygame amplamente popular . Posso estar errado, mas acredito que ele esteja pré-instalado no Pi. Você pode usar o Pygame Mixer Music Module para reproduzir arquivos de áudio. Eu incluí alguns exemplos de código abaixo.

Supondo que tenhamos um arquivo de áudio chamado myFile.wav.

import pygame
pygame.mixer.init()
pygame.mixer.music.load("myFile.wav")
pygame.mixer.music.play()
while pygame.mixer.music.get_busy() == True:
    continue

NOTA: Se isso falhar, vá ao terminal e atualize seu sistema com

apt-get update
apt-get upgrade

e tente novamente.

xxmbabanexx
fonte
2
Se você tiver mais de um som para reproduzir (o que é provável), é melhor criar um objeto pygame.mixer.Sound para cada um deles, mantendo as definições dos nomes dos arquivos de som em um único local.
francis
É isso que eu quero, mas o som da minha placa-mãe não possui um driver, então eu uso uma placa de som USB. Toca espeakmuito bem, mas não isso.
SDsolar
11

Eu precisava de um script para tocar uma música de trinta segundos em segundo plano, enquanto respondia a outras informações do usuário. Eu então queria que terminasse a música em algum evento.

Suponho que não seja particularmente elegante, mas abri um canal para um processo MPlayer em segundo plano.

import subprocess
player = subprocess.Popen(["mplayer", "song.mp3", "-ss", "30"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)

Então, quando eu queria encerrar o processo do MPlayer, simplesmente escrevi "q" para sair do canal.

player.stdin.write("q")

Veja na documentação do MPlayer todos os tipos de comandos que você pode transmitir dessa maneira para controlar a reprodução.

Espero que seja um pouco útil!

user1616681
fonte
1
Isso é realmente legal, na verdade. Este tutorial adafruit fala sobre a reprodução de som, mas não sobre a parada.
Gideon
6

Outra opção é usar mpg321e chamar a partir da linha de comando.

apt-get install mpg321

Então, em Python:

import os

os.system('mpg321 foo.mp3 &')

Pygame é quase certamente mais robusto, mas depende, suponho, de quais são suas necessidades.

Brandorf
fonte
1
Eu mesmo pensei nisso, mas achei que não era muito elegante, porque dificulta muito a pausa, o controle de volume etc.
Stein
Isso é muito lento.
287 Alex
3

Eu recomendaria pyglet em vez de pygame se você não precisar de gráficos. Na minha opinião, é mais simples, mais elegante e melhor mantido. Então, novamente, espero que seja uma questão de gosto.

Bex
fonte
1
Então, como você usa?
SDsolar
o pyglet parece funcionar apenas quando uma tela está disponível; executá-lo remotamente ou como um daemon apenas com o objetivo de reproduzir sons não funciona.
oh7lzb
0

O Pygame oferece uma maneira fácil e agradável de carregar e reproduzir sons em vários canais.

mrpi64
fonte
0

Você pode usar vários players externos através de pipes. No entanto, você quase sempre experimentará uma perda de velocidade. Há também um problema com o controle de reprodução.

Eu recomendo que você pyaudio, funciona bem.

Se você quiser reproduzir arquivos compactados também, ficarei livre para apontar para o meu módulo decoder.py. Você pode encontrá-lo no PyPI.

Ele também usa subprocessos, mas chama decodificadores em vez de players. Eles não usam muita CPU e alguns deles sabem como usar a aceleração de hardware. Você pode usar o pyaudio ou algo assim para gerar os dados de áudio não processados. Se quiser, você pode até usar o pygame utilizando pygame.sndarray. Dessa forma, você pode reproduzir mais formatos do que o pygame suporta.

Tentei decoder.py no ambiente da interface gráfica do PyQT, com o pyaudio e também usando o aplay como player externo. Isso foi no Raspberry Pi B.

Os resultados foram bastante satisfatórios em ambos os casos.

A simplicidade pode ser questionada.

O decoder.py em si é muito simples, mas você deve combiná-lo com outras bibliotecas e isso aumenta as linhas de código.

Há um exemplo de como reproduzir arquivos incluídos no decoder.py.

Dalen
fonte
0

Estou executando o OSMC (Debian) e tenho som para reproduzir através dos alto-falantes da minha TV, conectados por HDMI. https://youtu.be/p2ljmTE67gs

Meu método foi baseado na solução acima postada por @xxmbabanexx e aqui . Basicamente, eu tive que adicionar dtparam=audio=ona/boot/config.txt

brincando
fonte
Eu acho que o TS significava o conector de 3,5 mm quando se referia à "saída de áudio padrão". Isso também funciona para o conector 3,5?
Bex
Ah eu vejo. Hmm, provavelmente não vai, embora eu não tenha tentado.
jjinking