hier eine einfache Funktion zum Zusammenmischen von WAV-Dateien.
Einfach deshalb, weil keine Überprüfung der übergebenen Daten stattfindet, das kann man sich aber bei Bedarf dazubasteln. Es müsste nur der WAV-Header ausgewertet werden (http://www.sonicspot.com/guide/wavefiles.html).
Gegenüber der 'add'-Funktion vom Modul 'audioop' können hier auch Files unterschiedlicher Länge zusammengemischt werden. Es bedarf zudem keiner Extrapakete wie 'Snack' oder 'Pymedia'. Verbesserungsvorschläge willkommen !
Gruss, Seven
Code: Alles auswählen
def mix(wave1,wave2):
#Mischt 2 Wavefiles zusammen
#Von beiden Wavefiles wird zunächst die Länge ermittelt.
#Das kürzere Wavefile wird zum Längeren dazugemischt
#
import struct
length1 = struct.unpack('l',wave1[40:44])[0]
length2 = struct.unpack('l',wave2[40:44])[0]
if length1 >= length2:
mixlen = length2
header = wave1[:44]
rest = wave1[length2:length1]
audioblock1 = struct.unpack(str(length1)+'b',wave1[44:]) #0-44 = Headerbytes. Audioblock beginnt bei #44.
audioblock2 = struct.unpack(str(length2)+'b',wave2[44:]) #Die Daten sind im Format 'signed byte' (-128 <= number <= 127)
else:
mixlen = length1
header = wave2[:44]
rest = wave2[length1:length2]
audioblock1 = struct.unpack(str(length2)+'b',wave2[44:])
audioblock2 = struct.unpack(str(length1)+'b',wave1[44:])
temp = []
for i in range(0,mixlen):
value = audioblock1[i] + audioblock2[i]
if value < -128: temp.append(-128) #Falls Clippen, begrenzen auf gültigen Wertebereich
elif value > 127: temp.append(127)
else: temp.append(value)
result = header + struct.pack(str(mixlen)+'b',*temp) + rest
return result
Code: Alles auswählen
import winsound
f = open('E:/Testwav1.wav', "rb")
sound1= f.read()
f.close()
f = open('E:/Testwav2.wav', "rb")
sound2= f.read()
f.close()
sound1 = mix(sound1,sound2)
f = open('E:/Testwav3.wav', "wb")
f.write(sound1)
f.close()
winsound.PlaySound("E:/Testwav3.wav",winsound.SND_FILENAME)