Abspielen von Audiodateien mit Python

38

Ich bin auf der Suche nach einer gut gepflegten Python-Bibliothek, mit der ich Audiodateien auf meinem Raspberry Pi mit der Standard-Audioausgabe abspielen kann.

Bisher habe ich mehrere ausprobiert, aber keine davon scheint zu funktionieren. Obwohl Pyglet auf meinem normalen Computer einwandfrei funktioniert, verursacht es einen Fehler auf dem Raspberry Pi. Gibt es eine Python-Bibliothek, die sich als benutzerfreundlich erwiesen hat?

Stein
quelle
Bewährte so einfach zu bedienen ist eine Art relativ, aber ich gepostet eine Alternative zu pygame auf ähnliche Frage auf Stackoverflow hier über . Grundsätzlich ist diese Alternative vlc.py (das sehr gut gepflegte libVLC-Python-Modul).
Ben
Eine Frage weiter unten besagt, dass Pyglet an RPi arbeitet. Können Sie mit Ihrem Fehler aktualisieren?
Brian Bulkowski

Antworten:

31

Ich empfehle das beliebte Pygame. Ich kann mich irren, aber ich glaube, dass es auf dem Pi vorinstalliert ist. Mit dem Pygame Mixer Music Module können Sie Audiodateien abspielen. Ich habe unten einen Beispielcode eingefügt.

Angenommen, wir haben eine Audiodatei namens 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

HINWEIS: Wenn dies fehlschlägt, gehen Sie zum Terminal und aktualisieren Sie Ihr System mit

apt-get update
apt-get upgrade

und versuche es noch mal.

xxmbabanexx
quelle
2
Wenn Sie mehr als einen Sound abspielen möchten (was wahrscheinlich ist), ist es besser, ein pygame.mixer.Sound-Objekt für jeden zu erstellen. Dann können Sie die Definitionen der Sound-Dateinamen an einem Ort aufbewahren.
Francis
Das ist, was ich will, aber mein Motherboard-Sound hat keinen Treiber, deshalb benutze ich eine USB-Soundkarte. Es spielt sich espeakgut, aber nicht so.
SDsolar
10

Ich brauchte ein Skript, um einen Song aus 30 Sekunden im Hintergrund abzuspielen und gleichzeitig auf andere Benutzereingaben zu reagieren. Ich wollte dann, dass das Lied irgendwann endet.

Ich nehme an, es ist nicht besonders elegant, aber ich habe eine Pipe für einen MPlayer-Hintergrundprozess geöffnet.

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

Als ich dann den MPlayer-Prozess beenden wollte, schrieb ich einfach "q" für das Beenden der Pipe.

player.stdin.write("q")

In der MPlayer-Dokumentation finden Sie alle Arten von Befehlen, die Sie zur Steuerung der Wiedergabe auf diese Weise übergeben können.

Hoffentlich ist das etwas hilfreich!

user1616681
quelle
1
Das ist wirklich ordentlich. In diesem Adafruit-Tutorial geht es darum, Sound zu spielen, aber nicht anzuhalten.
Gideon
6

Eine andere Option besteht darin mpg321, sie über die Befehlszeile zu verwenden und aufzurufen.

apt-get install mpg321

Dann in Python:

import os

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

Pygame ist mit ziemlicher Sicherheit robuster, aber es kommt wohl darauf an, was Sie brauchen.

Brandorf
quelle
1
Ich habe selbst darüber nachgedacht, aber ich fand es nicht sehr elegant, weil es Pausen, Lautstärkeregelung usw. sehr viel schwieriger macht.
Stein
Das ist furchtbar langsam.
Alex
3

Ich würde Pyglet anstelle von Pygame empfehlen, wenn Sie keine Grafiken benötigen. Meiner Meinung nach ist es einfacher, eleganter und besser gepflegt. Andererseits denke ich, dass es Geschmackssache sein könnte.

Bex
quelle
1
Also, wie benutzt du es?
SDsolar
Pyglet scheint nur zu laufen, wenn eine Anzeige verfügbar ist. Es funktioniert nicht, wenn Sie es aus der Ferne oder als Daemon ausführen, um Sounds abzuspielen.
Oh7lzb
0

Pygame bietet Ihnen eine schöne und einfache Möglichkeit, Sounds auf einer Reihe von Kanälen zu laden und abzuspielen.

mrpi64
quelle
0

Sie können mehrere externe Player über Pipes verwenden. Es kommt jedoch fast immer zu Geschwindigkeitsverlusten. Es gibt auch ein Problem mit der Wiedergabesteuerung.

Ich empfehle dir pyaudio, es funktioniert gut.

Wenn Sie auch komprimierte Dateien abspielen möchten, kann ich Sie auf mein Modul decoder.py verweisen. Sie finden es auf PyPI.

Es verwendet auch Unterprozesse, ruft jedoch Decoder anstelle von Playern auf. Sie verbrauchen nicht viel CPU und einige von ihnen wissen, wie man die Hardwarebeschleunigung einsetzt. Sie können dann Pyaudio oder etwas verwenden, um die Audio-Rohdaten auszugeben. Wenn Sie möchten, können Sie Pygame auch mit pygame.sndarray verwenden. Auf diese Weise können Sie mehr Formate abspielen, als Pygame unterstützt.

Ich habe decoder.py in einer PyQT-GUI-Umgebung mit pyaudio und aplay als externem Player ausprobiert. Das war auf Raspberry Pi B.

Die Ergebnisse waren in beiden Fällen ziemlich zufriedenstellend.

Die Einfachheit kann in Frage gestellt werden.

decoder.py selbst ist sehr einfach, aber Sie müssen es mit anderen Bibliotheken kombinieren und das erhöht die Codezeilen.

Es gibt ein Beispiel zum Abspielen von Dateien in decoder.py.

Dalen
quelle
0

Ich verwende OSMC (Debian) und habe Sound über meine TV-Lautsprecher, die über HDMI angeschlossen sind. https://youtu.be/p2ljmTE67gs

Meine Methode basierte auf der obigen Lösung von @xxmbabanexx sowie hier . Im Grunde hatte ich hinzufügen dtparam=audio=onzu/boot/config.txt

Wichsen
quelle
Ich denke, der TS meinte die 3,5-mm-Buchse, wenn man sich auf den "Standard-Audio-Ausgang" bezieht. Funktioniert das auch für die 3.5-Buchse?
Bex
Oh ich verstehe. Hmm, wird es wahrscheinlich nicht, obwohl ich es nicht ausprobiert habe.
5.