【问题标题】:processing an audio stream with python (resampling)用python处理音频流(重采样)
【发布时间】:2018-04-13 13:18:28
【问题描述】:

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

我尝试了audiotools 的运气,但没有成功:

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

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

f.write(msg)

并在另一个线程中从缓冲区中读取:

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 被证明是正确的答案,我该如何正确地做到这一点。

【问题讨论】:

  • 这对 Stack Overflow 来说不是一个好问题,但你试过 ffmpeg 吗?

标签: python audio resampling


【解决方案1】:

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

dataFormat 是流中每个样本的字节数,例如:立体声 16 位将 = 4,original_samples 是源 bin 字符串大小,desired_samples 是所需的位字符串大小,16KHz-> 44K1Hz 例如:原始 = 160 但期望 = 441,pcm 是源 bin 字符串,返回是重新采样的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-03-04
    • 1970-01-01
    • 2014-05-07
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多