【发布时间】:2016-11-17 12:47:02
【问题描述】:
目前我正在对仅使用 Python 的波形文件进行一些小型研究。 我现在无法解决的一个问题是拆分 wav 数据。正确格式化 24 位声音深度的文件。
所以基本思路是:给定t1-start和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 位之后 - 它失败了。
我采用速率并将其转换为毫秒,我的 Start 和 End 参数也转换为 ms。 之后,根据这个计算,假设它们是正确的,我在源音频中找到 start_point,然后从这一点写到结尾。 我可能会做错什么? 如何解决这个问题,只使用没有任何外部库的 Python。
谢谢,提前。
【问题讨论】:
-
不确定这是否与您的问题直接相关,但
frames_per_m_sec = rate // 1000对我来说似乎有问题,因为整数除法可能会丢失您的数值精度。如果采样率是 44.1 kHz,这并不少见,您会得到frames_per_m_sec = 44,并且您将时间转换为帧偏移量的比例会降低几个百分点。 -
您能否更具体地描述您的代码如何在 24 位文件上“失败”?您的问题是如何体现的?
-
我认为你关于精度的注释可能对绝对无噪声的声音有用,但我在 16 位合成中一切正常。然而,24位尝试产生的结果文件充满噪音,没有原声