Я написал простую программу на Python для чтения волнового файла и после его изменения сохранял его как новый файл.
import codecs, wave
#convert a number to its two's complemented value (For positive it is equal itself)
def convert_to_twos(value, wid_len=16):
if value < 0 :
value = value + (1 << wid_len)
return value
#receive the value of a two's complemented number.
def twos_back_value(value, wid_len=16):
if value & (1 << wid_len -1):
value = value - (1 << wid_len)
return value
#opening files
input_file = wave.open(r"<address of input wave file>", 'r')
output_file = wave.open(r"<an address for output wave file>", 'w')
#Get input file parameters and set them to the output file after modifing the channel number.
out_params = [None, None, None, None, None, None]
in_params = input_file.getparams()
out_params[0] = 1 # I want to have a mono type wave file in output. so I set the channels = 1
out_params[1] = in_params[1] #Frame Width
out_params[2] = in_params[2] #Sample Rate
out_params[3] = in_params[3] #Number of Frames
out_params[4] = in_params[4] #Type
out_params[5] = in_params[5] #Compressed or not
output_file.setparams(out_params)
#reading frames from first file and storing in the second file
for frame in range(out_params[2]):
value = int(codecs.getencoder('hex')(input_file.readframes(1))[0][:4], 16) #converting first two bytes of each frame (let assume each channel has two bytes frame length) to int (from byte string).
t_back_value = twos_back_value( value ,out_params[1]*8)
new_value = int(t_back_value * 1)
new_twos = convert_to_twos(new_value, out_params[1]*8)
to_write = new_twos.to_bytes((new_twos.bit_length() + 7) // 8, 'big')
output_file.writeframes(to_write)
#closing files
input_file.close()
output_file.close()
Проблема в том, что когда я запускаю указанную выше программу и играю в выходной файл, я слышу только шум и ничего больше! (Пока жду тот же файл только в одноканальном режиме!)
Обновление:
У меня что-то странное. Согласно документации, функция readframes(n)
Читает и возвращает не более n кадров звука в виде строки байтов. Поэтому я ожидаю, что эта функция вернет только шестнадцатеричные значения. Но на самом деле я вижу некоторые странные нешестнадцатеричные значения:
read_frame = input_file.readframes(1)
print (read_frame)
print (codecs.getencoder('hex')(read_frame)[0])
print ("")
выше кода, в цикле for верните это:
b'\xe3\x00\xc7\xf5'
b'e300c7f5'
b'D\xe8\xa1\xfd'
b'44e8a1fd'
b'\xde\x08\xb2\x1c'
b'de08b21c'
b'\x17\xea\x10\xe9'
b'17ea10e9'
b'{\xf7\xbc\xf5'
b'7bf7bcf5'
b'*\xf6K\x08'
b'2af64b08'
Как видите, в read_frame
! есть несколько нешестнадцатеричных значений. (*, }, D, ... например). Что это?