在纯python的间隔中分裂24位深度的wav声音

时间:2016-11-17 12:47:02

标签: python audio wav wave

目前我只使用Python对wave文件进行了一些小型研究。 我现在无法解决的一个问题是拆分wav数据。正确格式化24位声音深度的文件。

所以基本的想法是:给定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而不使用任何外部库来解决此问题。

提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果您可以使用外部库,我建议使用soundfile模块,它可以开箱即用地处理24位文件。

如果你真的想使用纯Python,你应该至少使用内置的wave模块,它至少会为你处理标题。您仍然必须将原始字节转换为您自己的有意义的字符。

很难说出你的情况出了什么问题,因为你只显示了部分代码。您应该显示适用于16位和8位的代码,并且不适用于24.我在代码中没有看到任何位深度的提及。

如果您查看我的tutorial about the wave module,可能会有所帮助。