Odtwarzanie plików audio w Pythonie

38

Szukam dobrze utrzymanej biblioteki Python, która pozwala mi odtwarzać pliki audio na moim Raspberry Pi przy użyciu standardowego wyjścia audio.

Do tej pory wypróbowałem kilka, ale żadna z nich nie działa. Mimo że pyglet działa dobrze na moim zwykłym komputerze, powoduje błąd na Raspberry Pi. Czy istnieje biblioteka Python, która okazała się łatwa w użyciu?

Stein
źródło
Sprawdzona jako łatwy w użyciu jest rodzajem stosunku, ale pisał alternatywę do pygame na podobne pytanie na StackOverflow tutaj . Zasadniczo tą alternatywą jest vlc.py (moduł Python libVLC, który jest bardzo dobrze utrzymany).
Ben
Dalsze pytanie mówi, że Pyglet działa na RPi. Czy możesz zaktualizować swój błąd?
Brian Bulkowski

Odpowiedzi:

31

Polecam popularną grę Pygame. Mogę się mylić, ale wierzę, że jest wstępnie zainstalowany na Pi. Możesz użyć Pygame Mixer Music Module do odtwarzania plików audio. Poniżej zamieściłem przykładowy kod.

Zakładając, że mamy plik audio o nazwie 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

UWAGA: Jeśli to się nie powiedzie, przejdź do terminala i zaktualizuj swój system za pomocą

apt-get update
apt-get upgrade

i spróbuj ponownie.

xxmbabanexx
źródło
2
Jeśli masz więcej niż jeden dźwięk do odtworzenia (co jest prawdopodobne), lepiej dla każdego z nich utworzyć obiekt pygame.mixer.Sound, wtedy możesz przechowywać definicje nazw plików dźwiękowych w jednym miejscu.
francis
Tego właśnie chcę, ale dźwięk mojej płyty głównej nie ma sterownika, więc używam karty dźwiękowej USB. To gra espeakdobrze, ale nie to.
SDsolar
10

Potrzebowałem skryptu, aby odtwarzać utwór w tle z trzydziestu sekund w tle, odpowiadając na opinie innych użytkowników. Potem chciałem, żeby to zakończyło utwór na jakimś wydarzeniu.

Nie sądzę, że jest to szczególnie eleganckie, ale otworzyłem potok do procesu MPlayera w tle.

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

Następnie, gdy chciałem zakończyć proces MPlayera, po prostu napisałem „q”, aby wyjść z potoku.

player.stdin.write("q")

Przejrzyj dokumentację MPlayera, aby znaleźć wszelkiego rodzaju polecenia, które możesz przekazać w ten sposób, aby kontrolować odtwarzanie.

Mam nadzieję, że to nieco pomocne!

użytkownik1616681
źródło
1
To jest naprawdę fajne. Ten poradnik dla adafruita mówi o odtwarzaniu dźwięku, ale go nie zatrzymuje.
gideon
6

Inną opcją jest użycie mpg321i wywołanie go z wiersza poleceń.

apt-get install mpg321

Następnie w Pythonie:

import os

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

Pygame jest prawie na pewno solidniejsza, ale przypuszczam, że zależy to od twoich potrzeb.

Brandorf
źródło
1
Sam o tym myślałem, ale pomyślałem, że nie jest to zbyt eleganckie, ponieważ znacznie utrudnia pauzę, regulację głośności itp.
Stein
To jest strasznie wolne.
Alex
3

Polecam pyglet zamiast Pygame jeśli nie potrzebujesz grafiki. Moim zdaniem jest prostszy, bardziej elegancki i lepiej utrzymany. Z drugiej strony oczekuję, że może to być kwestia gustu.

Bex
źródło
1
Jak z tego korzystasz?
SDsolar
Pyglet wydaje się działać tylko wtedy, gdy dostępny jest wyświetlacz; uruchamianie go zdalnie lub jako demona tylko w celu odtwarzania dźwięków nie działa.
oh7lzb
0

Pygame zapewnia przyjemny i łatwy sposób ładowania i odtwarzania dźwięków na różnych kanałach.

mrpi64
źródło
0

Możesz korzystać z wielu zewnętrznych odtwarzaczy przez rury. Jednak prawie zawsze doświadczasz utraty prędkości. Występuje również problem z kontrolą odtwarzania.

Polecam wam pyaudio, działa dobrze.

Jeśli chcesz również odtwarzać pliki skompresowane, będę mógł swobodnie wskazać Ci mój moduł decoder.py. Możesz go znaleźć na PyPI.

Wykorzystuje również podproces, ale zamiast odtwarzaczy wywołuje dekodery. Nie używają dużo procesora, a niektórzy wiedzą, jak korzystać z akceleracji sprzętowej. Następnie możesz użyć pyaudio lub czegoś innego, aby wyprowadzić surowe dane audio. Jeśli chcesz, możesz nawet użyć pygame, używając pygame.sndarray. W ten sposób możesz odtwarzać więcej formatów niż obsługuje pygame.

Próbowałem decoder.py w środowisku PyQT GUI, z pyaudio, a także używając aplay jako zewnętrznego odtwarzacza. To było na Raspberry Pi B.

Wyniki były w obu przypadkach całkiem satysfakcjonujące.

Prostota może być kwestionowana.

decoder.py sam w sobie jest bardzo prosty, ale musisz go połączyć z innymi bibliotekami lib, co zwiększa linie kodu.

Istnieje przykład odtwarzania plików zawartych w pliku decoder.py.

Dalen
źródło
0

Używam OSMC (Debian) i mam dźwięk do odtwarzania przez głośniki telewizora, które są podłączone przez HDMI. https://youtu.be/p2ljmTE67gs

Moja metoda była oparta na powyższym rozwiązaniu opublikowanym przez @xxmbabanexx, a także tutaj . Zasadniczo, musiałem dodać dtparam=audio=ondo/boot/config.txt

jjinking
źródło
Myślę, że TS miał na myśli gniazdo 3,5 mm, odnosząc się do „standardowego wyjścia audio”. Czy to działa również z gniazdem 3.5?
Bex
Rozumiem. Hmm, prawdopodobnie nie będzie, chociaż tego nie próbowałem.
jjinking