Wenn man sich die Python-Tags in der Reihenfolge ihres Neuankömmlings ansieht, gibt es einen Artikel wie diesen. Audiodatei von Python mit Interrupt abspielen
Ich habe PyAudio verwendet, aber ich habe es nicht so verwendet, also las ich, während ich dachte: "Ich denke, ich kann es mit PyAudio tun, aber kann ich nicht?"
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pyaudio
import wave
from time import sleep
import threading
CHUNK = 1024
class AudioPlayer:
""" A Class For Playing Audio """
def __init__(self):
self.audio_file = ""
#Flagge zum Stoppen
self.paused = threading.Event()
def setAudioFile(self, audio_file):
self.audio_file = audio_file
def playAudio(self):
if (self.audio_file == ""):
return
self.wf = wave.open(self.audio_file, "rb")
p = pyaudio.PyAudio()
self.stream = p.open(format=p.get_format_from_width(self.wf.getsampwidth()),
channels=self.wf.getnchannels(),
rate=self.wf.getframerate(),
output=True)
data = self.wf.readframes(CHUNK)
# play stream (3)
while len(data) > 0:
#Wenn das Stopp-Flag gesetzt ist
if self.paused.is_set():
#Hör auf zu spielen
self.stream.stop_stream()
#Initialisieren Sie das Flag
self.paused.clear()
break
self.stream.write(data)
data = self.wf.readframes(CHUNK)
# stop stream (4)
self.stream.stop_stream()
self.stream.close()
# close PyAudio (5)
p.terminate()
def play(player):
#Spielen Sie in einem separaten Thread
audio_thread = threading.Thread(target=player.playAudio)
audio_thread.start()
if __name__ == "__main__":
player1 = AudioPlayer()
player1.setAudioFile("1.wav")
player2 = AudioPlayer()
player2.setAudioFile("2.wav")
play(player1)
#Zum Beispiel 0,Wechseln Sie nach 5 Sekunden zu einer anderen Tonquelle
sleep(0.5)
#Stop 1
player1.paused.set()
#Spielen Sie 2
play(player2)
Ich konnte es schaffen, aber es gab einen ** Bug **. .. .. Wenn Sie den Hauptteil anhalten und erneut spielen,
if __name__ == "__main__":
player1 = AudioPlayer()
player1.setAudioFile("1.wav")
play(player1)
#Zum Beispiel 0,Spielen Sie das gleiche nach 5 Sekunden erneut
sleep(0.5)
#Stop 1
player1.paused.set()
#Spielen Sie noch einmal 1
play(player1)
Python(39927,0x105607000) malloc: *** error for object 0x100886800: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
zsh: abort python audio.py
Ich erhalte eine entsprechende Fehlermeldung
if __name__ == "__main__":
player1 = AudioPlayer()
player1.setAudioFile("1.wav")
play(player1)
#Zum Beispiel 0,Spielen Sie das gleiche nach 5 Sekunden erneut
sleep(0.5)
#Stop 1
player1.paused.set()
#Spielen Sie noch einmal 1
#Ich bekomme eine Fehlermeldung, damit ich schlafe
sleep(0.6)
play(player1)
Bitte legen Sie es in den Schlaf. In meiner Umgebung wird dieser Fehler angezeigt, wenn ich mich nicht länger als 0,6 Sekunden ausruhe.
Recommended Posts