này là rất phụ thuộc của định dạng này là trong Dưới đây là một ví dụ về làm thế nào để làm điều đó giả định 2 byte rộng, mẫu ít về cuối nhỏ:.
import wave
w1 = wave.open("/path/to/wav/1")
w2 = wave.open("/path/to/wav/2")
#get samples formatted as a string.
samples1 = w1.readframes(w1.getnframes())
samples2 = w2.readframes(w2.getnframes())
#takes every 2 bytes and groups them together as 1 sample. ("123456" -> ["12", "34", "56"])
samples1 = [samples1[i:i+2] for i in xrange(0, len(samples1), 2)]
samples2 = [samples2[i:i+2] for i in xrange(0, len(samples2), 2)]
#convert samples from strings to ints
def bin_to_int(bin):
as_int = 0
for char in bin[::-1]: #iterate over each char in reverse (because little-endian)
#get the integer value of char and assign to the lowest byte of as_int, shifting the rest up
as_int <<= 8
as_int += ord(char)
return as_int
samples1 = [bin_to_int(s) for s in samples1] #['\x04\x08'] -> [0x0804]
samples2 = [bin_to_int(s) for s in samples2]
#average the samples:
samples_avg = [(s1+s2)/2 for (s1, s2) in zip(samples1, samples2)]
Và bây giờ tất cả những gì còn lại để làm là chuyển đổi samples_avg
quay lại chuỗi nhị phân và ghi vào tệp bằng cách sử dụng wave.writeframes
. Đó chỉ là nghịch đảo của những gì chúng tôi vừa làm, vì vậy nó không phải là quá khó để tìm ra. Đối với chức năng int_to_bin của bạn, có thể bạn sẽ những gì để tận dụng các chức năng chr(code)
, mà trả về nhân vật với mã ký tự của code
(đối diện của ord)
Cảm ơn code.I sẽ nhìn vào nó một chút nhiều hơn và xem nó hoạt động như thế nào. – james