如何将NumPy数组流式传输到流中?

时间:2016-01-24 15:24:15

标签: python numpy pyaudio

我正在尝试做一个实时的播放器/录音机。我刚刚开始并处理赢得PyAudio。

目前,我可以创建一个流并将其存储到一个numpy数组中,但我无法在需要时将其发送回pyaudio流。

我想使用数组,因为我更喜欢将所有内容存储在内存中,直到我想将其保存为波形文件。

请注意,我尝试使用Matth的python-sounddevice播放它,但我也无法播放它。我无法找到实现这一目标的方法。

这是我目前的代码:

import sys
import pyaudio
import numpy as np
import sounddevice as sd

p = pyaudio.PyAudio()
datos_numpy=np.array([])
CHUNK=64
CHANNELS=2
FORMAT=pyaudio.paFloat32
RATE=44100

is_recording=False
is_playing=False

def callback(in_data, frame_count, time_info, status):
    global datos_numpy, is_playing, is_recording
    if is_recording==True:
        if in_data:
            print 'recording'
            temp_data=np.fromstring(in_data, dtype=np.float32)
            datos_numpy = np.append(datos_numpy,temp_data)
        else:
            print('no input')

        return in_data, pyaudio.paContinue

    elif is_playing==True:
            print 'playing'
            #out_data= ???? HERE IS MY PROBLEM
            #return out_data, pyaudio.paContinue   
    else:
        return in_data, pyaudio.paContinue


stream = p.open(format=pyaudio.paFloat32,
                channels=CHANNELS,
                rate=RATE,
                output=True,
                input=True,
                input_device_index=6,
                output_device_index=14,
                frames_per_buffer=CHUNK,
                stream_callback=callback)

def record():
    global is_playing, is_recording
    is_recording=True
    is_playing=False


def play():
    global is_playing, is_recording, datos_numpy
    is_recording=False
    is_playing=True
    sd.play(datos_numpy, 44100)

1 个答案:

答案 0 :(得分:0)

由于您通过fromstring方法获取numpy数组,因此您可以通过numpy.tostring()方法返回字符串缓冲区。

或者,您可以简单地将字符串缓冲区pickle到硬盘,而不是将其转换为numpy数组。然后你不必担心如何恢复工作缓冲区。