0

Ich spiele ein Audio und gleichzeitig eine Eingabe von der Tastatur. Ich habe Threading verwendet, um dies zu erreichen. Ich habe einen neuen Thread erstellt, um das Audio abzuspielen und die Eingabe vom Haupt-Thread zu hören. Aber ich möchte das Abspielen von Audio stoppen, basierend auf einer bestimmten Eingabe von der Tastatur.Wie wird ein Audio vom Abspielen abhängig von der Bedingung in Python gestoppt?

Da ich einen Thread aus einem anderen Thread nicht "töten" kann und ich den Audio-Thread nicht auf den Haupt-Thread hören kann, wenn er nicht aufgehört hat, den Ton zu spielen, wie erreiche ich das?

EDIT: ich diesen Code geschrieben haben:

from multiprocessing import Process 
import os 

p = Process(target=os.system, args=("aplay path/to/audio/file",)) 
p.start()                             
print("started")                
while p.is_alive(): 
    print("inside loop") 
    inp = input("give input") 
    if inp is not None: 
     p.terminate() 
     print(p.is_alive())  # Returns True for the first time, False for the second time 
     print("terminated") 

Dies ist die Ausgabe:

started 
inside loop 
give input2 
True 
terminated 
inside loop 
give input4 
False 
terminated 

Warum ist das passiert? Auch nach der zweiten Schleifeniteration wird der Prozess beendet (p.is_alive() gibt false zurück), aber das Audio wird weiter abgespielt. Der Ton hört nicht auf.

Antwort

0

Die Lösung für dieses Problem ist die gemeinsame Variable/Flag zwischen den beiden Threads. Die Variable signalisiert, dass der Audio-Wiedergabefaden endet oder darauf wartet, dass er geändert wird.

Hier ist ein Beispiel für das gleiche.

In diesem Fall wird der Thread beendet, wenn das Signal empfangen wird.

import time 
import winsound 
import threading 

class Player(): 
    def __init__(self, **kwargs): 
     # Shared Variable. 
     self.status = {} 
     self.play = True 
     self.thread_kill = False 
    def start_sound(self): 
     while True and not self.thread_kill: 
      # Do somthing only if flag is true 
      if self.play == True: 
       #Code to do continue doing what you want. 


    def stop_sound(self): 
     # Update the variable to stop the sound 
     self.play = False 
     # Code to keep track of saving current status 

    #Function to run your start_alarm on a different thread 
    def start_thread(self): 
     #Set Alarm_Status to true so that the thread plays the sound 
     self.play = True 
     t1 = threading.Thread(target=self.start_sound) 
     t1.start() 

    def run(self): 
     while True: 
      user_in = str(raw_input('q: to quit,p: to play,s: to Stop\n')) 
      if user_in == "q": 
       #Signal the thread to end. Else we ll be stuck in for infinite time. 
       self.thread_kill = True 
       break 
      elif user_in == "p": 
       self.start_thread() 
      elif user_in == "s": 
       self.stop_sound() 
      else: 
       print("Incorrect Key") 

if __name__ == '__main__': 
    Player().run() 
+0

Ich versuche nicht, eine Audiodatei in einer Schleife abzuspielen. Es ist nur eine lange Audiodatei, die ich unterbrechen muss. Diese Zeile 'while self.alarm_status == True: winsound.PlaySound (" alarm.wav ", winsound.SND_FILENAME)' funktioniert nur, wenn die Audiodatei in einer Schleife abgespielt wird. Es kann nur den Zustand nach jeder vollständigen Wiedergabe überprüfen. Es wird nicht den Zustand zwischen dem Abspielen der Audiodatei überprüfen. – anomaly

+0

Bitte sehen Sie meine Bearbeitung. Ich habe Multiprocessing verwendet. – anomaly

+0

Ich habe meine Antwort bearbeitet, um die Arbeit in einem anderen Thread anzuhalten und fortzusetzen, aber um den Ton zu pausieren, müssen Sie entweder die Datei selbst entschlüsseln und streamen oder eine solche Bibliothek verwenden oder die Kontrolle über den verwendeten Player haben (höchstwahrscheinlich unterstützt aplay das pausieren nicht. – CodeCollector

Verwandte Themen