pyaudio无阻塞地保存多个.WAV文件

问题描述

更新: 现在,我发现我们可以在回调函数中粘贴一些代码,并导致更多问题:

  1. 何时将调用并停止回调函数?当我们打开和关闭流时?

  2. 回调函数可以返回流数据(代码中的audio_data)。因为我们没有调用该函数,所以我相信pyaudio在内部完成它。如何从回调获取返回流数据?

import pyaudio
import wave
import numpy as np
import npstreams
import time


CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100

audio = pyaudio.PyAudio()

channel_1_frames = []
channel_2_frames = []
fulldata = np.array([])

def callback(in_data,frame_count,time_info,flag):
    global b,a,fulldata #global variables for filter coefficients and array
    
    audio_data = np.fromstring(in_data,dtype=np.int16)
   
    channel_1 = audio_data[0::CHANNELS]
    channel_2 = audio_data[1::CHANNELS]
    data1 = channel_1.tostring()
    data2 = channel_2.tostring()
    channel_1_frames.append(data1)
    channel_2_frames.append(data2)
    wf1 = wave.open('Channel_1.wav','wb')
    wf2 = wave.open('Channel_2.wav','wb')
    wf1.setnchannels(1)
    wf2.setnchannels(1)
    wf1.setsampwidth(audio.get_sample_size(FORMAT))
    wf2.setsampwidth(audio.get_sample_size(FORMAT))
    wf1.setframerate(RATE)
    wf2.setframerate(RATE)
    wf1.writeframes(b''.join(channel_1_frames))
    wf2.writeframes(b''.join(channel_2_frames))
    wf1.close()
    wf2.close()
    
    return (audio_data,pyaudio.paContinue)


stream = audio.open(format=FORMAT,channels=CHANNELS,rate=RATE,input=True,#frames_per_buffer=CHUNK,stream_callback=callback)

stream.start_stream()

while stream.is_active():
    time.sleep(10)
    stream.stop_stream()
stream.close()

audio.terminate()

=========================================== >

我正在尝试将多个频道记录到多个.WAV文件中。 我可以使用stream.read()和numpy数组来做到这一点,将其分成不同的数组,然后保存到.WAV文件中

stream = audio.open(format=FORMAT,frames_per_buffer=CHUNK)

print("* recording")

channel_1_frames = []
channel_2_frames = []

for i in range(0,int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    # convert string to numpy array
    data_array = np.frombuffer(data,dtype='int16')
    # select channel
    channel_1 = data_array[0::CHANNELS]
    channel_2 = data_array[1::CHANNELS]
    # convert numpy array to string 
    data1 = channel_1.tostring()
    data2 = channel_2.tostring()
    channel_1_frames.append(data1)
    channel_2_frames.append(data2)
stream.stop_stream()
stream.close()
audio.terminate()

但是,在模块文档https://people.csail.mit.edu/hubert/pyaudio/docs/#class-stream中,它说stream.read()和stream.write()不应用于非阻塞。

我从Github找到了一个很好的非阻塞pyaudio示例:https://gist.github.com/sloria/5693955 哪个没有使用stream.read()。

我不确定是否可以在没有stream.read()的情况下读取和转换Steam numpy数组 那么仍然可以将流导出到不同的.WAV吗?并使其不受阻碍?

谢谢

解决方法

随着我对编码的了解越来越多,我找到了答案。

A1:回调函数在流中运行和停止。

######open stream with out starting automatically
audio = pyaudio.PyAudio()
stream = audio.open(format=format,channels=2,rate=44100,input=True,frames_per_buffer=44100,stream_callback=self.get_callback(),start=False)

######start,stop stream
stream.start_stream()
stream.close()
audio.terminate()

A2:要实时捕获数据,我们可以使用队列

self.recorded_frames = queue.Queue()
    def get_callback(self):
        def callback(in_data,frame_count,time_info,status):
            self.recorded_frames.put(np.frombuffer(in_data,dtype=np.int16))
            return in_data,pyaudio.paContinue
        return callback

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...