Wie Sie in Ihrer eigenen Antwort geschrieben haben, ist der Grund für die Timing-Probleme sehr wahrscheinlich, dass der Audio-Callback entkoppelt vom Rest der Anwendung ausgeführt wird.
Das Audio-Backend verfügt normalerweise über eine Art Uhr, auf die sowohl innerhalb der Callback-Funktion als auch außerhalb davon zugegriffen werden kann. Ich sehe zwei mögliche Lösungen:
eine Bibliothek verwenden, die Ihnen die Callback-Funktion implementieren, können Sie sich, die Startzeiten des Sounds innerhalb der Callback-Funktion berechnen, diese Zeiten mit der aktuellen Zeit des „Audio vergleichen Uhr "und schreiben Sie Ihren Sound an den Ausgang an der entsprechenden Stelle im Ausgabepuffer.
Verwenden Sie eine Bibliothek, mit der Sie die genaue Zeit (in Bezug auf die "Audio Clock") angeben können, wann Sie mit dem Abspielen Ihrer Sounds beginnen sollen. Diese Bibliothek würde die Schritte des vorherigen Punktes für Sie übernehmen.
Für die erste Option, könnten Sie die sounddevice Modul verwenden. Die Callback-Funktion (die Sie implementieren müssen) erhält ein Argument mit dem Namen time
, das ein Attribut time.outputBufferDacTime
hat, das ein Fließkommawert ist, der die Zeit (in Sekunden) angibt, wann das erste Sample des Ausgabepuffers abgespielt wird .
Volle Enthüllung: Ich bin der Autor des sounddevice
Moduls, also ist meine Empfehlung ziemlich voreingenommen.
Ganz kürzlich habe ich angefangen, an dem Modul rtmixer zu arbeiten, das für die zweite Option verwendet werden kann. Bitte beachten Sie, dass dies in einem sehr frühen Entwicklungsstadium ist, also verwenden Sie es mit Vorsicht. Mit diesem Modul müssen Sie keine Callback-Funktion schreiben. Sie können die Funktion rtmixer.Mixer.play_buffer()
verwenden, um einen Audiopuffer zu einer bestimmten Zeit (in Sekunden) abzuspielen. Als Referenz können Sie die aktuelle Zeit von rtmixer.Mixer.time
abrufen.
"Pause von 0,2 Sekunden als 0,7 Sekunden, dann wieder 0,2 Sekunden, es ist sehr unregelmäßig." das klingt für mich nicht sehr unregelmäßig, es klingt zyklisch. Wie lange hält der Ton? Besonders seit '0.7 == (Schlafzeit + 0.2) ' – roganjosh
@roganjosh warum würde es solch einen Zyklus geben? 's.play()' ist nicht blockierend und sollte den Code fortführen – Basj
@roganjosh Ich änderte den Code, um von den Kanälen Gebrauch zu machen, also sollte jeder gespielte Ton nicht einen anderen stören. Problem immer noch vorhanden ... – Basj