Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyAudio正在将所有数据处理到一个通道中_Python_Pyaudio_Recording_Channels_Soundcard - Fatal编程技术网

Python PyAudio正在将所有数据处理到一个通道中

Python PyAudio正在将所有数据处理到一个通道中,python,pyaudio,recording,channels,soundcard,Python,Pyaudio,Recording,Channels,Soundcard,我正在使用pyaudio来记录使用此功能的双通道声卡中的数据 def record(self): ''' Record Function reads from stream with configured soundcard and stores items in an array uses callback function as can be told to stop recording during stream. After ending

我正在使用pyaudio来记录使用此功能的双通道声卡中的数据

 def record(self):
        '''
        Record Function reads from stream with configured soundcard and stores items in an array
        uses callback function as can be told to stop recording during stream. After ending writes contents 
        to wav file
        '''
        wf = wave.open('audiooutput.wav', 'wb')
        wf.setnchannels(2)
        wf.setsampwidth(pyaudio.get_sample_size(pyaudio.paInt16))
        wf.setframerate(44100)
        p = pyaudio.PyAudio()
        frames = []
        # sub function checks the queue for a message to stop recording
        def check_for_recordstop():
            try:
                message = self.my_queue.get(timeout = 0.1)
            except:
                return 
            if message == None:
                pass
            elif message.payload == "Stop":
                self.confirm_message_recieved(message)
                stream.stop_stream()
        #subfunction callback         
        def callback(in_data, frame_count, time_info, status):
            if stream.is_active():
                frames.append(in_data)
                return (in_data, pyaudio.paContinue)
            else:
                frames.append(in_data)
                return (in_data, pyaudio.paComplete)

        stream = p.open(format=pyaudio.get_sample_size(pyaudio.paInt16),
                        channels= 2,
                        rate=44100,
                        input=True,
                        frames_per_buffer=1024,
                        input_device_index=1,
                        stream_callback = callback)

        self.logger.info("Recording")
        stream.start_stream() # callback is run on a new thread when start_stream() is triggered

        while stream.is_active(): #Loop to keep thread alive while callback is running

            time.sleep(0.1)
            check_for_recordstop()
        print("done")    

        stream.close()
        wf.writeframes(b''.join(frames))
        wf.close()
        p.terminate()
然而,当在audacity中查看此数据时,我不会以2通道流结束,它看起来是这样的

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

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                input_device_index=1,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open("pyaudoutput.wav", 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
但是当使用这样的函数时

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

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                input_device_index=1,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open("pyaudoutput.wav", 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
音频数据按预期显示,请参见此处

我似乎无法从第二个函数得到第一个函数来产生所需的结果!
我需要在我的用例中使用pyaudio的回调功能,但无法将两个通道分开。任何建议都很好

我是使用样本大小而不是样本宽度打开流的

format=pyaudio.get_sample_size(pyaudio.paInt16),
应该是

format=pyaudio.get_format_from_width(wf.getsampwidth()),
使用我写的文件中的样本宽度解决了这个问题