Versuche, vom Mikrofon aufzunehmen und in Echtzeit abzuspielen

9

Ich versuche, Daten von meinem Mikrofon aufzunehmen und dann in Echtzeit und mit einigen Verzögerungen durch die Lautsprecher abzuspielen, aber ich habe einige Probleme damit. Ich habe mich für Python und alsaaudio entschieden und mein aktuelles Skript, mit dem ich Probleme habe, kann hier gefunden werden. Dies funktioniert mit dem, was ich bisher habe (nicht der Verzögerungsteil), aber erzeugt ein wenig Klick. alsaaudio docs hat das um zu sagen:

  

Der häufigste Grund für Probleme bei der Wiedergabe von PCM-Audio ist, dass Schreibvorgänge auf PCM-Geräte genau mit der Datenrate des Geräts übereinstimmen müssen.

     

Wenn zu wenig Daten auf das Gerät geschrieben werden, wird es unterlaufen, und hässliche Klickgeräusche werden auftreten. Umgekehrt werden zu viele Daten in das Gerät geschrieben, die Schreibfunktion blockiert entweder (PCM_NORMAL-Modus) oder gibt Null zurück (PCM_NONBLOCK-Modus).

Ich verstehe die Doku falsch, es sagt das über write ():

  

PCM.write (Daten)

     

Schreibt (spielt) den Ton in Daten. Die Länge der Daten muss ein Vielfaches der Rahmengröße sein und genau der Größe eines Zeitraums entsprechen.

ein Punkt in meinem Skript ist 160.

es sagt dies über read ():

  

Im PCM_NORMAL-Modus blockiert diese Funktion, bis eine volle Periode verfügbar ist, und gibt dann ein Tupel (Länge, Daten) zurück, wobei Länge die Anzahl der Bilder der erfassten Daten und Daten die erfassten Soundframes als eine Zeichenfolge darstellen. Die Länge der zurückgegebenen Daten ist die Periodensgröße * Framesize Bytes.

in meinem Skript, period_size * frame_size sollte auch gleich 160 sein, aber wenn ich die Länge (Teil von Tupel read () zurückgibt) bekomme ich 940. Offensichtlich scheint ich nicht die richtige Menge an Daten zu übergeben out.write (), aber ich bin mir nicht sicher, wohin ich gehen soll. Ich habe diesen Code hauptsächlich durch Beispiele zusammengestellt, die ich gefunden habe, und ich habe gerade angefangen, mit alsaaudio / sound zu arbeiten und einige interessante Projekte zusammenzustellen, daher weiß ich noch nicht viel.

Ich wollte auch live vom Mikrofon aufnehmen und dann mit einer Verzögerung von 100ms abspielen, daher die kommentierte time.sleep (). Wenn ich es auskommentiere, scheint die Länge wiederholt von 940 zu -32 zu gehen, was schließlich out.write () verursacht, um eine Ausnahme auszulösen (nicht genug Daten).

Könnte mir jemand sagen, wie (oder was ist mit meinem Skript nicht in Ordnung) Ich würde Schalldaten in Echtzeit und mit einer Verzögerung von 100 ms aufnehmen und wiedergeben?

    
src 18.08.2011, 05:13
quelle

2 Antworten

1

Sie können Sleep (0.1) nicht verwenden, um die Ausgabe um 100ms zu verzögern. Sie müssen einen Puffer erstellen, der die 100ms Audiodaten enthält:

%Vor%

Ändern Sie 10 zu einer Zahl, die eine Verzögerung von 100 ms verursacht.

    
HYRY 18.08.2011 06:59
quelle
0

Haben Sie alsaloop versucht? Versuchen Sie "Mann alsaloop". Sie können die Latenz auch über diesen Befehl auswählen.

    
akostadinov 02.10.2012 12:20
quelle