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