В настоящее время я провожу небольшое исследование волновых файлов, используя только Python. Одна проблема, которую я не могу решить прямо сейчас, это разделение данных wav. отформатируйте файл с глубиной звука 24 бита правильно.
Итак, основная идея такова: даны t1
— начало и t2
— конец, а мне нужно получить 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 бита, он терпит неудачу.
Я беру скорость и конвертирую ее в миллисекунды, мои параметры Start и End также конвертируют в мс. И после, основываясь на этих расчетах, предполагая, что они верны, я нахожу start_point в своем исходном аудио и затем пишу от этой точки до конца. Что я могу сделать неправильно? Как решить эту проблему, используя только Python без каких-либо внешних библиотек.
Заранее спасибо.
frames_per_m_sec = rate // 1000
кажется мне проблематичным из-за целочисленного деления, которое может потерять вашу числовую точность. Если частота дискретизации составляет, например, 44,1 кГц, что не редкость, вы получитеframes_per_m_sec = 44
, а ваше преобразование времени в смещения кадров будет отличаться на несколько процентов. - person wildwilhelm   schedule 17.11.2016