splititng 24-битный звук wav глубины в интервале в чистом питоне

В настоящее время я провожу небольшое исследование волновых файлов, используя только 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 без каких-либо внешних библиотек.

Заранее спасибо.


person Lescott    schedule 17.11.2016    source источник
comment
Не уверен, что это напрямую связано с вашей проблемой, но frames_per_m_sec = rate // 1000 кажется мне проблематичным из-за целочисленного деления, которое может потерять вашу числовую точность. Если частота дискретизации составляет, например, 44,1 кГц, что не редкость, вы получите frames_per_m_sec = 44, а ваше преобразование времени в смещения кадров будет отличаться на несколько процентов.   -  person wildwilhelm    schedule 17.11.2016
comment
Можете ли вы более конкретно описать, почему ваш код не работает с 24-битными файлами? Как проявляется ваша проблема?   -  person wildwilhelm    schedule 17.11.2016
comment
Я думаю, что ваше замечание о точности может быть полезно для абсолютно нешумного звука, но у меня все нормально в 16-битных композициях. Тем не менее, 24-битная попытка дает в результате файл, полный шума и без оригинального звука.   -  person Lescott    schedule 17.11.2016


Ответы (1)


Если бы вы могли использовать внешнюю библиотеку, я бы рекомендовал модуль звуковой файл, который обрабатывает 24-битные файлы. - из коробки.

Если вы действительно хотите использовать чистый Python, вам следует как минимум использовать встроенную wave, который, по крайней мере, позаботится о заголовке за вас. Вам все равно придется конвертировать необработанные байты во что-то значимое самостоятельно.

Трудно сказать, что не так в вашем случае, потому что вы показываете только часть своего кода. Вы должны показать код, который работает для 16 и 8 бит и не работает для 24 бит. Я не вижу упоминания о разрядности в вашем коде.

Возможно, вам будет полезно взглянуть на мой руководство по модулю wave.

person Matthias    schedule 18.11.2016