目前我只使用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而不使用任何外部库来解决此问题。
提前谢谢。
答案 0 :(得分:0)
如果您可以使用外部库,我建议使用soundfile模块,它可以开箱即用地处理24位文件。
如果你真的想使用纯Python,你应该至少使用内置的wave模块,它至少会为你处理标题。您仍然必须将原始字节转换为您自己的有意义的字符。
很难说出你的情况出了什么问题,因为你只显示了部分代码。您应该显示适用于16位和8位的代码,并且不适用于24.我在代码中没有看到任何位深度的提及。
如果您查看我的tutorial about the wave
module,可能会有所帮助。