Riproduzione di file audio con Python


39

Sto cercando una libreria Python ben mantenuta che mi permetta di riprodurre file audio sul mio Raspberry Pi usando l'uscita audio standard.

Finora ne ho provati diversi, ma nessuno di loro sembra funzionare. Sebbene pyglet funzioni correttamente sul mio normale computer, provoca un errore sul Raspberry Pi. Esiste una libreria Python che è stata dimostrata facile da usare?


Dimostrato che è facile da usare è una specie di parente, ma ho pubblicato un'alternativa a pygame a una domanda simile su StackOverflow qui . Fondamentalmente questa alternativa è vlc.py (il modulo libVLC Python, che è molto ben mantenuto).
Ben,

Una domanda più in basso afferma che Pyglet funziona su RPi. Puoi aggiornare con il tuo errore?
Brian Bulkowski,

Risposte:


32

Raccomando il famoso Pygame. Potrei sbagliarmi, ma credo che sia preinstallato sul Pi. È possibile utilizzare il modulo musicale Pygame Mixer per riprodurre file audio. Ho incluso un codice di esempio di seguito.

Supponendo che abbiamo un file audio chiamato 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: in caso contrario, andare al terminale e aggiornare il sistema con

apt-get update
apt-get upgrade

e prova ancora.


2
Se hai più di un suono da riprodurre (che è probabile), allora è meglio creare un oggetto pygame.mixer.Sound per ognuno, quindi puoi mantenere le definizioni dei nomi dei file audio in un posto.
francia,

È quello che voglio, ma il suono della mia scheda madre non ha un driver, quindi uso una scheda audio USB. Suona espeakbene, ma non questo.
SDsolar,

11

Avevo bisogno di uno script per riprodurre un brano da trenta secondi in background mentre rispondevo all'input di altri utenti. Volevo quindi che terminasse la canzone in qualche evento.

Suppongo che non sia particolarmente elegante, ma ho aperto la pipa a un processo MPlayer in background.

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

Quindi, quando volevo interrompere il processo di MPlayer, ho semplicemente scritto "q" per uscire dalla pipe.

player.stdin.write("q")

Guarda la documentazione di MPlayer per tutti i tipi di comandi che puoi passare in questo modo per controllare la riproduzione.

Speriamo che sia un po 'utile!


1
Questo è davvero pulito in realtà. Questo tutorial di adafruit parla della riproduzione del suono ma non della sua interruzione.
Gideon,

6

Un'altra opzione è quella di usarlo mpg321e invocarlo dalla riga di comando.

apt-get install mpg321

Quindi in Python:

import os

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

Pygame è quasi sicuramente più robusto, ma dipende, suppongo, da quali sono le tue esigenze.


1
Ci ho pensato da solo, ma ho pensato che non fosse molto elegante, perché rendere molto più difficile la pausa, il controllo del volume ecc.
Stein,

Questo è terribilmente lento.
Alex,

3

Consiglierei pyglet piuttosto che pygame se non hai bisogno di grafica. Dal mio punto di vista è più semplice, più elegante e meglio mantenuto. Inoltre, mi aspetto che potrebbe essere una questione di gusti.


1
Quindi come lo usi?
SDsolar,

pyglet sembra funzionare solo quando è disponibile un display; eseguirlo in remoto o come demone solo allo scopo di riprodurre suoni non funziona.
oh7lzb,

0

Pygame ti offre un modo semplice e piacevole per caricare e riprodurre suoni, su una vasta gamma di canali.


0

Puoi usare un numero di giocatori esterni attraverso le pipe. Tuttavia, si verificherà quasi sempre una perdita di velocità. C'è anche un problema con il controllo della riproduzione.

Ti consiglio pyaudio, funziona benissimo.

Se vuoi anche riprodurre file compressi, sarò così libero di indicarti il ​​mio modulo decoder.py. Lo puoi trovare su PyPI.

Utilizza anche i sottoprocessi, ma chiama i decodificatori anziché i giocatori. Non usano molta CPU e alcuni di loro sanno come usare l'accelerazione hardware. È quindi possibile utilizzare pyaudio o qualcosa del genere per produrre dati audio non elaborati. Se vuoi, puoi persino usare pygame utilizzando pygame.sndarray. In questo modo puoi giocare a più formati di quelli supportati da pygame.

Ho provato decoder.py in ambiente PyQT GUI, con pyaudio e usando anche aplay come lettore esterno. Quello era su Raspberry Pi B.

I risultati sono stati abbastanza soddisfacenti in entrambi i casi.

La semplicità può essere messa in discussione.

decoder.py stesso è molto semplice, ma devi combinarlo con altre librerie e questo aumenta le righe di codice.

C'è un esempio su come riprodurre file inclusi con decoder.py.


0

Sto eseguendo OSMC (Debian) e ho il suono da riprodurre attraverso i miei altoparlanti TV, che sono collegati tramite HDMI. https://youtu.be/p2ljmTE67gs

Il mio metodo si basava sulla soluzione di cui sopra pubblicata da @xxmbabanexx e anche qui . Fondamentalmente, ho dovuto aggiungere dtparam=audio=ona/boot/config.txt


Penso che TS intendesse il jack da 3,5 mm quando si riferiva all '"uscita audio standard". Funziona anche con il jack 3.5?
Bex,

Oh, capisco. Hmm probabilmente non lo farà, anche se non l'ho provato.
tremando il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.