【问题标题】:Alsaaudio record and playbackAlsaaudio 录音和播放
【发布时间】:2017-10-21 01:34:38
【问题描述】:

我只是在使用 python 在树莓派上玩声音输入和输出。 我的计划是读取麦克风的输入,操纵它并播放操纵的音频。目前我试图阅读和播放音频。 读取似乎有效,因为我在最后一步将读取的数据写入了波形文件,并且波形文件看起来很好。 但播放只是噪音。 播放波形文件也很好,所以耳机很好。 我想我的设置或输出格式可能有问题。 代码:

import alsaaudio as audio
import time
import audioop


#Input & Output Settings
periodsize = 1024
audioformat = audio.PCM_FORMAT_FLOAT_LE
channels = 16
framerate=8000

#Input Device
inp = audio.PCM(audio.PCM_CAPTURE,audio.PCM_NONBLOCK,device='hw:1,0')
inp.setchannels(channels)
inp.setrate(framerate)
inp.setformat(audioformat)
inp.setperiodsize(periodsize)

#Output Device
out = audio.PCM(audio.PCM_PLAYBACK,device='hw:0,0')
out.setchannels(channels)
out.setrate(framerate)
out.setformat(audioformat)
out.setperiodsize(periodsize)


#Reading the Input
allData = bytearray()
count = 0
while True:
    #reading the input into one long bytearray
    l,data = inp.read()
    for b in data:
        allData.append(b)

    #Just an ending condition
    count += 1
    if count == 4000:
        break

    time.sleep(.001)


#splitting the bytearray into period sized chunks
list1 = [allData[i:i+periodsize] for i in range(0, len(allData), periodsize)]

#Writing the output
for arr in list1:
    # I tested writing the arr's to a wave file at this point
    # and the wave file was fine
    out.write(arr)

编辑:也许我应该提一下,我正在使用 python 3

【问题讨论】:

  • 应该没必要开16个频道。如果您设置channel = 1,行为是否会改变?
  • 刚用 1 个 Channel 试了一下,可惜还是一样。也许我应该提一下,我正在使用 python 3(将编辑问题)
  • 您可以使用 aplay/arecord --dump-hw-params 检查支持的设备参数,并尝试使用 aplay 直接从控制台播放波形文件。

标签: python audio pyalsaaudio


【解决方案1】:

考虑至少对链的接收器部分使用plughw(支持重采样/转换的alsa子系统):

#Output Device out = audio.PCM(audio.PCM_PLAYBACK,device='plughw:0,0')

这应该有助于协商采样率和数据格式。

periodsize 最好根据采样率的 1/times 来估计,例如:

periodsize = framerate / 8(8 = 8000 KHz 采样率的倍数)

而 sleeptime 最好估计为玩 periodsize 所需时间的一半:

sleeptime = 1.0 / 16(1.0 - 是一秒,16 = 2* 8000 KHz 采样率的倍数)

【讨论】:

    【解决方案2】:

    我刚刚找到了答案。 audioformat = audio.PCM_FORMAT_FLOAT_LE 这种格式不是我的耳机使用的格式(只是复制并粘贴,不假思索)。 我通过在控制台中运行 speaker-test 了解了我的麦克风格式(以及其他信息)。

    由于我的扬声器格式是 S16_LE,因此代码可以与 audioformat = audio.PCM_FORMAT_S16_LE 一起正常工作

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-05-12
      相关资源
      最近更新 更多