Reproducción de archivos de audio con Python

39

Estoy buscando una biblioteca Python bien mantenida que me permita reproducir archivos de audio en mi Raspberry Pi utilizando la salida de audio estándar.

Hasta ahora he probado varios, pero ninguno parece funcionar. Aunque pyglet funciona bien en mi computadora normal, causa un error en la Raspberry Pi. ¿Existe una biblioteca de Python que ha demostrado ser fácil de usar?

Stein
fuente
Probado como fácil de usar es relativamente relativo, pero publiqué una alternativa a pygame a una pregunta similar en StackOverflow aquí . Básicamente, esa alternativa es vlc.py (el módulo libVLC Python, que está muy bien mantenido).
Ben
Una pregunta más abajo dice que Pyglet funciona en RPi. ¿Puedes actualizar con tu error?
Brian Bulkowski el

Respuestas:

32

Recomiendo el muy popular Pygame. Puedo estar equivocado, pero creo que está preinstalado en el Pi. Puedes usar el módulo de música Pygame Mixer para reproducir archivos de audio. He incluido un código de ejemplo a continuación.

Suponiendo que tenemos un archivo de audio llamado 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: Si esto falla, vaya al terminal y actualice su sistema con

apt-get update
apt-get upgrade

e intenta de nuevo.

xxmbabanexx
fuente
2
Si tiene más de un sonido para reproducir (lo cual es probable), entonces es mejor crear un objeto pygame.mixer.Sound para cada uno, entonces puede mantener las definiciones de los nombres de los archivos de sonido en un solo lugar.
francis
Esto es lo que quiero, pero el sonido de mi placa base no tiene un controlador, así que uso una tarjeta de sonido USB. Se juega espeakbien, pero no esto.
SDsolar
11

Necesitaba un guión para reproducir una canción de treinta segundos en segundo plano mientras respondía a la entrada de otro usuario. Entonces quería que terminara la canción en algún evento.

No creo que sea particularmente elegante, pero abrí una tubería a un proceso de MPlayer en segundo plano.

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

Luego, cuando quería terminar el proceso de MPlayer, simplemente escribí "q" para salir de la tubería.

player.stdin.write("q")

Consulte la documentación de MPlayer para ver todo tipo de comandos que puede pasar de esta manera para controlar la reproducción.

¡Ojalá sea algo útil!

usuario1616681
fuente
1
Esto es realmente genial en realidad. Este tutorial de adafruit habla sobre reproducir sonido pero no detenerlo.
Gideon
6

Otra opción es usarlo mpg321e invocarlo desde la línea de comandos.

apt-get install mpg321

Luego en Python:

import os

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

Pygame es casi seguro más robusto, pero depende, supongo, de cuáles son sus necesidades.

Brandorf
fuente
1
Pensé en esto yo mismo, pero pensé que no era muy elegante, porque hacía mucho más difícil la pausa, el control de volumen, etc.
Stein
Esto es muy lento.
Alex
3

Recomendaría pyglet en lugar de pygame si no necesita gráficos. En mi opinión, es más simple, más elegante y mejor mantenido. Por otra parte, espero que sea una cuestión de gustos.

Bex
fuente
1
Entonces, ¿cómo se usa?
SDsolar
pyglet solo parece ejecutarse cuando hay una pantalla disponible; ejecutarlo de forma remota o como un demonio solo con el fin de reproducir sonidos no funciona.
oh7lzb
0

Pygame te ofrece una manera agradable y fácil de cargar y reproducir sonidos, en una variedad de canales.

mrpi64
fuente
0

Puedes usar varios jugadores externos a través de las tuberías. Sin embargo, casi siempre experimentará una pérdida de velocidad. También hay un problema con el control de reproducción.

Te recomiendo pyaudio, funciona bien.

Si también desea reproducir archivos comprimidos, tendré la libertad de señalarle mi módulo decoder.py. Lo puedes encontrar en PyPI.

También utiliza subprocesos, pero llama a decodificadores en lugar de jugadores. No usan mucha CPU, y algunos saben cómo usar la aceleración de hardware. Luego puede usar pyaudio o algo para generar los datos de audio sin formato. Si lo desea, incluso puede usar pygame utilizando pygame.sndarray. De esa manera, puedes reproducir más formatos de los que admite Pygame.

Intenté decoder.py en el entorno PyQT GUI, con pyaudio y también usando aplay como reproductor externo. Eso fue en Raspberry Pi B.

Los resultados fueron bastante satisfactorios en ambos casos.

La simplicidad puede ser cuestionada.

decoder.py en sí es muy simple, pero tienes que combinarlo con otras librerías y eso aumenta las líneas de código.

Hay un ejemplo sobre cómo reproducir archivos incluidos con decoder.py.

Dalen
fuente
0

Estoy ejecutando OSMC (Debian) y tengo sonido para reproducir a través de los altavoces de mi televisor, que está conectado por HDMI. https://youtu.be/p2ljmTE67gs

Mi método se basó en la solución anterior publicada por @xxmbabanexx, así como aquí . Básicamente, tuve que agregar dtparam=audio=ona/boot/config.txt

jjinking
fuente
Creo que el TS significaba el conector de 3.5 mm cuando se refería a la "salida de audio estándar". ¿Funciona esto también para el jack 3.5?
Bex
Oh ya veo. Hmm probablemente no lo hará, aunque no lo he probado.
jjinking