En regardant les balises Python par ordre d'arrivée, il y avait un article comme celui-ci. Lire un fichier audio à partir de Python avec interruption
J'ai utilisé PyAudio, mais je ne l'ai pas utilisé de cette façon, alors je lisais en pensant: "Je pense que je peux le faire avec PyAudio, mais n'est-ce pas?"
#!/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 = ""
#Drapeau pour arrêter
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:
#Si l'indicateur d'arrêt est défini
if self.paused.is_set():
#Arrête de jouer
self.stream.stop_stream()
#Initialiser le drapeau
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):
#Jouez dans un fil séparé
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)
#Par exemple 0,Passer à une autre source sonore après 5 secondes
sleep(0.5)
#Arrêt 1
player1.paused.set()
#Jouer 2
play(player2)
J'ai pu le faire, mais il y avait un ** bug **. .. .. Si vous arrêtez la partie principale et la rejouez,
if __name__ == "__main__":
player1 = AudioPlayer()
player1.setAudioFile("1.wav")
play(player1)
#Par exemple 0,Jouez à nouveau après 5 secondes
sleep(0.5)
#Arrêt 1
player1.paused.set()
#Jouer à nouveau 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
J'obtiens une erreur, le cas échéant
if __name__ == "__main__":
player1 = AudioPlayer()
player1.setAudioFile("1.wav")
play(player1)
#Par exemple 0,Jouez à nouveau après 5 secondes
sleep(0.5)
#Arrêt 1
player1.paused.set()
#Jouer à nouveau 1
#J'ai une erreur alors je dors
sleep(0.6)
play(player1)
Veuillez le mettre en veille. Dans mon environnement, j'obtiens cette erreur si je ne me repose pas plus de 0,6 seconde.
Recommended Posts