[PYTHON] Spielen Sie Audiodateien mit Interrupts mit PyAudio ab

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

Ich habe es geschafft, als ich es bemerkte.

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

Spielen Sie Audiodateien mit Interrupts mit PyAudio ab
Spielen Sie eine Audiodatei von Python mit Interrupt ab
Spielen Sie mit Dajare mithilfe der COTOHA-API
Spiel mit dem Propheten
Spiele mit PyTorch
Spielen Sie mit 2016-Python
Spielen Sie mit CentOS 8
Spiel mit der Pyramide
Spiel mit Fathom
Laden Sie Dateien mit Django hoch
Spiel mit Othello (Reversi)
Discord Bot mit Aufnahmefunktion ab Python: (4) Musikdateien abspielen
Spielen Sie mit der YouTube Data API v3 mit dem Google API Python Client