В настоящее время я делаю небольшое исследование волновых файлов, используя только Python. Одна проблема, которую я не могу решить прямо сейчас, - это разделение данных wav. формат файла с 24-битной глубиной звука.splititng 24 бит глубина wav звук в интервале в чистом питоне
Итак, основная идея: данный t1
- начало и t2
-end, и мне нужно получить slice
, что совершенно ясно.
def split_in_interval(self, start, end):
start *= ONE_SEC_MS
end *= ONE_SEC_MS
header = self.wav_header.header_description
infile = open(self.file_name, 'rb')
rate = header['sample_rate']
frames_per_m_sec = rate // 1000
length = (end - start) * frames_per_m_sec
start_ms = start * frames_per_m_sec
name_str = self._naming_fragment(start, end)
out_file = open(name_str, 'wb')
# as the size changes - need to recalculate only last part of header,
# it takes 4 last bytes of header
out_file.write(infile.read(WAV_HEADER - 4))
size = length * header['block_align']
# header['num_channels'] * width
packed_size = struct.pack('<L', size)
out_file.write(packed_size)
anchor = infile.tell()
infile.seek(anchor + start_ms)
out_file.write(infile.read(size))
out_file.close()
infile.close()
Я думаю, что мой код довольно прямо вперед, и она отлично работает с глубиной 16 и 8 бит звуков, но после того, как я попробовал 24 - он терпит неудачу.
Я принимаю скорость и конвертирую ее в миллисекунды, мои начальные и конечные параметры также преобразуются в ms. И после этого, основываясь на этих вычислениях, полагая, что они правы, я нахожу start_point в своем исходном аудио, а затем пишу с этого момента до конца. Что я могу сделать неправильно? Как решить эту проблему, используя только Python без каких-либо внешних библиотек.
Спасибо, заранее.
Не уверен, что это напрямую связано с вашей проблемой, но 'frames_per_m_sec = rate // 1000' выглядит мне проблематичным из-за целочисленного деления, которое может потерять вам числовую точность. Если частота дискретизации равна, например, 44,1 кГц, что не является чем-то необычным, вы получите 'frames_per_m_sec = 44', и ваше преобразование времени в смещения кадра будет отключено на несколько процентов. – wildwilhelm
Можете ли вы более подробно описать, как ваш код «не удается» в 24-битных файлах? Как проявляется ваша проблема? – wildwilhelm
Я думаю, что ваше примечание о точности может быть полезно для абсолютно не шумового звука, но у меня все в порядке в 16-битных композициях. Тем не менее, 24-разрядная попытка производит в качестве результата файл, полный noize и без оригинального звука – Lescott