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