[PYTHON] Lire des fichiers audio avec des interruptions à l'aide de PyAudio

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?"

Je l'ai fait quand je l'ai remarqué.

#!/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

Lire des fichiers audio avec des interruptions à l'aide de PyAudio
Lire un fichier audio à partir de Python avec interruption
Jouez avec Dajare en utilisant l'API COTOHA
Jouez avec Prophet
Jouez avec PyTorch
Jouez avec 2016-Python
Jouez avec CentOS 8
Jouez avec Pyramid
Jouez avec Fathom
Télécharger des fichiers avec Django
Jouer avec Othello (Reversi)
Discord Bot avec fonction d'enregistrement commençant par Python: (4) Lire des fichiers musicaux
Jouez avec l'API de données YouTube v3 à l'aide du client Python de l'API Google