python - 按下按钮时的PyAudio记录

标签 python python-3.x raspberry-pi raspberry-pi3 pyaudio

我对python或pyaudio的经验不是很丰富,我正试图用USB麦克风录制声音,只要按下与GPIO相连的按钮即可。我找到了可能的解决方案here,但是发布的代码对我不起作用,它无法识别释放的按钮:

#!/usr/bin/python
import RPi.GPIO as GPIO

import pyaudio
import wave
import time

FORMAT = pyaudio.paInt16
CHANNELS = 1
RATE = 44100
CHUNK = 512
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "rec41000.wav"

p = pyaudio.PyAudio()

#audio_info = p.get_device_info_by_index(0)
#print (audio_info)

#GPIO pin setup for button
ledPin = 18
buttonPin = 23

#set up GPIO using BCM numbering
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)

#enable LED and button (button with pull-up)
GPIO.setup(ledPin, GPIO.OUT)
GPIO.setup(buttonPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)

#set LED to OFF
GPIO.output(ledPin, GPIO.LOW)

while(True):

    print "waiting for button event"

    #wait for button to be pressed
    time.sleep(0.2)
    GPIO.wait_for_edge(buttonPin, GPIO.FALLING)

    while True:
        try:
                    frames = []
                    stream = p.open(format = FORMAT,
                                            channels = CHANNELS, 
                                            rate = RATE, 
                                            input = True,
                                            frames_per_buffer = CHUNK)

                    print "* recording"
                    #turn on LED ring when recording starts
                    GPIO.output(ledPin, GPIO.HIGH)

                    #record as long as button held down
                    while GPIO.input(buttonPin) == 0:
                        data = stream.read(CHUNK)
                        frames.append(data)

                        break

                except IOError:
                        printer.println(textWrapped('- Aufnahmefehler. Starte neu, Moment bitte. -', 32))

    # button released
    print "* done"
    GPIO.output(ledPin, GPIO.LOW)

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

    #make wave file from recorded data stream
    wf = wave.open(WAVE_OUTPUT_FILENAME, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(b''.join(frames))
    wf.close()   


我该怎么办?我使用的是this教程的代码,录音测试工作正常。

最佳答案

不清楚这是否是在粘贴到堆栈溢出时引起的格式化错误,但是break语句不合适吗?

在我看来,应该将其用于打破外部循环,否则您将无法退出外部循环。

对于您的用例,实际上看起来您根本不需要该外部循环。

关于python - 按下按钮时的PyAudio记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57301318/

相关文章:

python - 将多个值存储到 mysql 数据库中的单个字段中以保留 Django 中的顺序

python-3.x - 使用 Python 进行网页抓取,需要登录才能查看输出

Python Selenium,帮助我定位网站中的元素

python - Raspberry Pi B+ GPIO 输入值在未连接的情况下发生变化

python - 从 numpy 数组中随机选择

python - mypy 通用子类导致不兼容的类型

python - Docker 容器无法连接到本地主机上运行的服务器

python-3.x - 在python中使用来自IP的rtsp流和opencv相机时的帧失真

python - 我的 Raspbian 无法通过 Python 应用程序重新启动

c++ - 使用 Raspberry Pi Camera 和 Open Cv 显示视频时出错