2016-11-17 6 views
1

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

Спасибо, заранее.

+0

Не уверен, что это напрямую связано с вашей проблемой, но 'frames_per_m_sec = rate // 1000' выглядит мне проблематичным из-за целочисленного деления, которое может потерять вам числовую точность. Если частота дискретизации равна, например, 44,1 кГц, что не является чем-то необычным, вы получите 'frames_per_m_sec = 44', и ваше преобразование времени в смещения кадра будет отключено на несколько процентов. – wildwilhelm

+0

Можете ли вы более подробно описать, как ваш код «не удается» в 24-битных файлах? Как проявляется ваша проблема? – wildwilhelm

+0

Я думаю, что ваше примечание о точности может быть полезно для абсолютно не шумового звука, но у меня все в порядке в 16-битных композициях. Тем не менее, 24-разрядная попытка производит в качестве результата файл, полный noize и без оригинального звука – Lescott

ответ

0

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

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

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

Возможно, это поможет, если вы посмотрите на мой tutorial about the wave module.

 Смежные вопросы

  • Нет связанных вопросов^_^