Seite 1 von 1
Binärdaten effektiv verarbeiten ?
Verfasst: Freitag 14. April 2006, 08:41
von snakeseven
Hallo,
ich will binäre Audiodaten mischen und verwende zum Einlesen 'rb' und zum Verarbeiten struct.unpack() und struct.pack(). Das stellt sich aber als sehr langsam heraus. Gibt es eine Möglichkeit, mehr Effizienz in meine Misch-Routine zu bekommen ? Hier die betreffende For-Schleife:
Code: Alles auswählen
result = wave1[:44] #WAV-Header
for i in range(44,length): #length= Länge des Audio-Datenblocks
value = struct.unpack('b',wave1[i])[0] + struct.unpack('b',wave2[i])[0] #wave1,2 = WAV-Dateien
result = result + struct.pack('b ',value/2)
Schön wäre es, die WAV-Dateien [44:] in einem Rutsch 'unpacken' zu können, also nicht in einer For-Schleife. Habe aber nichts dazu gefunden !? Picklen klappe auch nicht.
Fröhliches Eiersuchen !
Seven
Verfasst: Freitag 14. April 2006, 08:55
von rayo
Hi
Gibt einen Array von 44 Byte Elementen. Aber für solche Sachen würde ich mal numpy (
http://numeric.scipy.org/) anschauen. Das hat eine Funktion from_string und ist recht schnell bei berechnungen.
Gruss
Verfasst: Freitag 14. April 2006, 22:39
von snakeseven
Hi,
das klappt schonmal gut und hat die Verarbeitungsgeschwindigkeit verdoppelt. Jetzt ist mir noch der Rückweg versperrt. Wie kann ich die veränderten Werte wieder in eine Binärdatei packen ? Wenn ich die zu packenden Daten direkt übergebe klappts:
Code: Alles auswählen
a = struct.pack('10b',-45,-1,-49,-1,0,0,65,0,112,0)
=> ÓÿÏÿ
Wenn ich die Daten in einer Variable als String übergebe, klappts natürlich nicht:
Code: Alles auswählen
arg = '-45,-1,-49,-1,0,0,65,0,112,0'
a = struct.pack('10b',arg)
=> struct.error: required argument is not an integer
Gibt es eine Form der Parameterübergabe, wo die Zahlen als Integer und nicht als Strings interpretiert werden ? Dann könnte ich die veränderten Audiodaten auf einen Schlag zurück konvertieren, was ebenfalls effektiver wäre, als die For-Schleife mit 111000 struct.pack() Anweisungen.
Gruss, Seven
Verfasst: Freitag 14. April 2006, 23:53
von rayo
Hi
Klas das kannst du so machen:
Beachte das *, das bewirkt dass eine Liste als einzelne Parameter übergeben werden.
Gruss
Verfasst: Samstag 15. April 2006, 07:42
von BlackJack
Reichen für den Anfang vielleicht auch erstmal die Module `wave` und `audioop` aus der Standardbibliothek? Ansonsten würde ich auch
Numpy empfehlen oder
Pyrex um den "Low-Level" Teil zu beschleunigen.
Verfasst: Samstag 15. April 2006, 07:58
von snakeseven
rayo hat geschrieben:Beachte das *, das bewirkt dass eine Liste als einzelne Parameter übergeben werden.
Hi, genau das wars.
Code: Alles auswählen
>>> v = [-45,-1,-49,-1,0,0,65,0,112,0]
>>> e = struct.pack('10b',*v)
>>> print e
ÓÿÏÿ
Werde aber Numpy auf jeden Fall ausprobieren, muss mich nur erstmal durch die Dokumentation arbeiten.
@BlackJack: 'audioop' ist sehr schnell, hat aber den Nachteil, daß man nur gleichlange Dateien miteinander mischen kann, das finde ich unvorteilhaft. 'wave' bietet alles zum Lesen, Schreiben und Analysieren von WAV-Dateien. Funktionen zur Datenmanipulation bietet es leider nicht.
'Pyrex' scheint mir auch ein sehr interessanter Kandidat zur Optimierung !
Gruss, Seven
Verfasst: Samstag 15. April 2006, 09:19
von snakeseven
So, habe das Ergebnis der Arbeit in den Codesnippes gepostet:
http://www.python-forum.de/post-35085.html#35085
Seven