为什么PyAudio只播放我音频的一半?

时间:2015-12-11 11:29:14

标签: python numpy audio pyaudio

我正在尝试使用PyAudio(通过&#34安装; sudo apt-get install python-pyaudio")多次播放录制的样本。

我试过了:

num_repeats = 6
out.write(numpy.hstack(numpy.tile(d, num_repeats)))

但这只播放音频样本3次。据我所知,它总是播放我提供的数据的一半。 (例如,如果我只是使用out.write(d)我只听到一半记录的样本)

有一个明显的工作(num_repeats * = 2),但我想理解为什么这是必要的!

重现问题的完整代码

import pyaudio
import numpy

p = pyaudio.PyAudio()
FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 80000
stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, frames_per_buffer=CHUNK)
frame = stream.read(CHUNK)
stream.stop_stream()
stream.close()
d = numpy.fromstring(frame, 'int16')

out = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, output=True)
num_repeats = 6
out.write(numpy.hstack(numpy.tile(d, num_repeats)))
out.close()

p.terminate()

无论我使用2个通道还是1个,它的行为都相同(即只有3次重复)。

2 个答案:

答案 0 :(得分:0)

将numpy数组转换为二进制文件,然后再移交给它。您可以使用.tobinary()或.tostring()

如果您已经匹配了数据类型,则应该可以。

答案 1 :(得分:0)

对于我来说,我解决了同一个问题,即在关闭流之前添加了暂停。不确定行为是否正常,但写入流后,嵌入式设备上的音频以异步方式播放。因此,我不得不等待关闭流。我完成的设置是这样的:

DataTable dt = Employee.GetActiveEmployeesSummary();
while (lstEmployees.Items.Count > 0) 
{
    lstEmployees.SelectedIndex = 0;
    if (dgvLogRecords.Rows.Count == 0) 
    {
        dt.Rows.RemoveAt(lstEmployees.SelectedIndex);
        lstEmployees.DataSource = dt;
        lstEmployees.SelectedIndex = 0;
        continue;
    }

    foreach (DataGridViewRow row in dgvLogRecords.Rows)

    dt.Rows.RemoveAt(lstEmployees.SelectedIndex);
    lstEmployees.DataSource = dt;
    lstEmployees.SelectedIndex = 0;
}