tksnack spielt nicht ab

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo Forum,

ich war lange nicht mehr hier. Ich brauche für ein Projekt eine simultane Tonausgabe und Mikrofonaufnahme. Ich habe der Einfachheit halber an tksnack gedacht. Die Installation scheint ok zu sein, das Aufnehmen, Einlesen und Abspeichern von WAVs läuft problemlos, aber beim einfachen Abspielen höre ich schlicht nichts. Mein funktionierendes Minimalbeispiel:

Code: Alles auswählen

from Tkinter import *
import tkSnack

root = Tk()
tkSnack.initializeSnack(root)

mysound = tkSnack.Sound()
mysound.read("outsound.wav")
mysound.play()
Der Code läuft bei mir ohne Fehlermeldung durch, aber ich höre nichts. Das Einlesen mit .read läuft sicher, denn ich kann mit mysound.write die Daten aus dem Soundobjekt korrekt abspeichern.

Ich habe keine Idee, wie ich bei der weiteren Fehlersuche vorgehen könnte. Kann mir jemand helfen?

LG,
bernhard
Zuletzt geändert von Anonymous am Samstag 16. März 2013, 22:28, insgesamt 1-mal geändert.
Grund: Quelltexte in Python-Code-Tags gesetzt.
BlackJack

@Bernhard: `play()` läuft asynchron wenn man es nicht mit ``blocking=True`` aufruft. Und da nach dem `play()`-Aufruf Dein Programm auch schon zuende ist, hört der Sound auf bevor er richtig angefangen hat.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo BlakJack,

danke für den Versuch. So wie oben steht es in den Examples und das hier läuft leider auch nicht bzw. es läuft aber man hört nichts:

Code: Alles auswählen

from Tkinter import *
import time
import tkSnack

root = Tk()
tkSnack.initializeSnack(root)

outsound = tkSnack.Sound()
outsound.read("outsound.wav")
outsound.play()
print("play started")
for i in range(1,300):  #Zeit schinden für Arme
    print(".")
Was ich vergessen habe: Python 2.7, Windows 8, Python und tksnack diese Woche heruntergeladen und installiert.

Hat jemand eine Idee, was ich machen könnte? Habe versucht pyAudio zu verstehen, aber dafür bräuchte ich eine umfangreichere Einführung.

LG,
Bernhard
BlackJack

@Bernhard: Das Zeit schinden für Arme schindet nicht wirklich Zeit. Lies meinen Beitrag noch einmal…
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Hallo BlackJack,

Du hast Recht, aber ich verstehe es nicht. Ich wollte blocking=True gerne vermeiden, weil ich während des Abspielens vom Mikrofon aufnehmen will. Deshalb wollte ich gerne nicht-blockierend abspielen und dann die Aufnahme starten. Warum nutzt mein Zeit-Schinden für Arme nichts? Ich sehe, wie in der Konsole die ganzen Pünktchen erscheinen und dachte, mein Programm läuft, bis das Konsole-Prompt kommt. In dieser Zeit hätte ich dann auch mit abspielendem Sound gerechnet. Wo liegt mein Denkfehler?

Auf Dein Insistieren hin habe ich jetzt sound.play(blocking=True) gemacht und jetzt spielt er das File ab. Ich muss halt die Aufnahme unmittelbar vorher starten

Code: Alles auswählen

insound.record()
outsound.play(blocking=True)
insound.stop()
Ich bin damit nur mäßig glücklich, weil ich nicht weiß ob es jetzt Samples gibt, die aufgenommen wurden, bevor die Aufnahme lief bzw. wieviele das maximal sein können. Ich werde damit experimentieren und eine ausreichend große Zahl Samples vorne wegschneiden. Trotzdem würde ich es gerne besser verstehen.

Vielen Dank und liebe Grüße,
Bernhard
BlackJack

@Bernhard: 299 Punkte printen dauert einen winzigen Bruchteil einer Sekunde. Und ich vermute mal, dass die Tk-Hauptschleife laufen muss, damit tkSnack funktioniert. Also *musst* Du nicht `blocking` verwenden, aber halt auch nicht einfach das Programm aufhören lassen.
Bernhard
User
Beiträge: 136
Registriert: Sonntag 15. Januar 2006, 20:31
Wohnort: Greifswald
Kontaktdaten:

Danke, BlackJack, für die Hilfe. Python ist also längst fertig mit dem Ausgeben der 300 Punkte während ich IDLE noch zu sehe, wie es die zwischengespeicherten Punkte ausgibt. Ich werde eine Lösung mit blocking=True umsetzen. Als nächstes bekomme ich noch heraus, wie man Daten in so ein Sound-Objekt hinein und vor allem auch wieder heraus kriegt. Heraus wohl nur als Byte-String. Aber das wird zu gegebener Zeit ein eigener Thread. Du hast mir sehr geholfen.

LG,
Bernhard
Antworten