使用Python处理音频流(重采样)

2024-06-16 11:47:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python脚本,它接收二进制原始音频数据的块,我想将这些块的采样率更改为16000,然后将它们传输到另一个组件。在

我用audiotools试过运气,但没有成功:

# f is a filelike FIFO buffer
reader = PCMFileReader(f, 44100, 1, 1, 16)
conv = PCMConverter(reader, 16000, 1, 1, 16)

然后我随时向缓冲区写入数据,得到一个新的数据块:

^{pr2}$

从另一个线程的缓冲区读取:

while not reader.file.closed:
    fl = conf.read(10)
    chunk = fl.to_bytes(False, True)

问题是我得到了这个值错误,它似乎来自一个“samplerate.c”库:

ValueError: SRC_DATA->data_out is NULL

此错误仅在重新采样时发生。如果我关掉这一步,那么一切都很好,我得到可播放的音频。在

因此,我的问题是:什么是完成这项任务的好工具?如果audiotools是正确的答案,我该怎么做才能正确呢。在


Tags: 数据脚本isbuffer错误二进制组件音频
1条回答
网友
1楼 · 发布于 2024-06-16 11:47:01

这是一个简化的重采样代码

dataFormat是流中每个样本的字节数,例如:立体声16位等于4,original_samples是源bin字符串大小,desired_samples是所需的位字符串大小,16KHz->;44K1Hz ex:original=160 but designed=441,pcm是源bin字符串,return是重采样的bin字符串):

def resampleSimplified(pcm, desired_samples, original_samples, dataFormat):

    samples_to_pad = desired_samples - original_samples

    q, r = divmod(desired_samples, original_samples)
    times_to_pad_up = q + int(bool(r))
    times_to_pad_down = q

    pcmList = [pcm[i:i+dataFormat] for i in range(0, len(pcm), dataFormat)]

    if samples_to_pad > 0:
        # extending pcm times_to_pad times
        pcmListPadded = list(itertools.chain.from_iterable(
            itertools.repeat(x, times_to_pad_up) for x in pcmList)
            )
    else:
        # shrinking pcm times_to_pad times
        if times_to_pad_down > 0:
            pcmListPadded = pcmList[::(times_to_pad_down)]
        else:
            pcmListPadded = pcmList

    padded_pcm = ''.join(pcmListPadded[:desired_samples])

    return padded_pcm

相关问题 更多 >