You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python的PyAudio库实现audio jack持续流式传输直至手动停止?

嘿,我来帮你搞定这个PyAudio持续流式传输音频的问题!咱们一步步来拆解解决方案:

实现PyAudio持续音频流式传输直至手动停止

一、修改5秒录制代码为持续流式传输

原来的代码是基于录制时长(5秒)来停止的,要改成手动停止,核心就是把固定次数的循环换成无限循环,再加上捕获键盘中断(Ctrl+C)的逻辑来优雅退出。

原5秒录制代码(示例)

import pyaudio
import time

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,
                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()

修改后的持续流式传输代码

import pyaudio
import signal
import sys

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

# 定义中断处理函数,确保退出时正确释放资源
def stop_recording(sig, frame):
    print("\n* 正在停止录制...")
    stream.stop_stream()
    stream.close()
    p.terminate()
    sys.exit(0)

# 注册Ctrl+C的信号监听
signal.signal(signal.SIGINT, stop_recording)

p = pyaudio.PyAudio()

# 打开音频输入流
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* 开始录制啦,按Ctrl+C就能停止")

try:
    # 无限循环持续读取音频数据
    while True:
        audio_data = stream.read(CHUNK)
        # 这里可以加你自己的处理逻辑:比如保存到列表、实时分析、输出等
        # 举个例子:frames.append(audio_data)
except KeyboardInterrupt:
    # 捕获Ctrl+C,触发停止逻辑
    stop_recording(signal.SIGINT, None)

核心修改点

  • 删掉了RECORD_SECONDS和固定次数的for循环,换成while True无限循环
  • 新增了信号处理函数,保证按下Ctrl+C时能正确关闭流和PyAudio实例,不会占用音频设备
  • 把音频数据的读取放在无限循环里,持续捕获音频直到手动中断

二、用回调模式实现更高效的持续流式传输

如果你要做实时音频处理,PyAudio的回调模式会更合适——它会在后台自动持续获取音频数据,不用你在主循环里手动调用read()

回调模式示例代码

import pyaudio
import time

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

# 回调函数:每次有新的音频数据就会触发这个函数
def audio_callback(in_data, frame_count, time_info, status):
    # 在这里处理接收到的音频数据in_data
    # 比如:实时分析音频特征、写入文件、转发到其他服务等
    print(f"处理了 {len(in_data)} 字节的音频数据")
    # 返回paContinue表示继续保持回调,返回paComplete就会停止
    return (in_data, pyaudio.paContinue)

p = pyaudio.PyAudio()

# 打开带回调的音频流
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK,
                stream_callback=audio_callback)

# 启动流
stream.start_stream()

print("* 回调模式录制中,按Ctrl+C停止")

try:
    # 主线程保持活跃,等待中断信号
    while stream.is_active():
        time.sleep(0.1)
except KeyboardInterrupt:
    print("\n* 正在停止录制...")
    stream.stop_stream()
    stream.close()
    p.terminate()

回调模式的好处

  • 后台自动处理音频流,主循环只需要保持程序运行就行
  • 延迟更低,适合实时处理场景
  • 逻辑更清晰:音频数据的处理都集中在回调函数里

几个关键注意事项

  • 不管用哪种方式,一定要记得关闭流和终止PyAudio实例,不然音频设备可能会被占用,下次运行程序会报错
  • 如果需要保存录制的音频,可以在循环或回调里把audio_data添加到列表,最后用wave库写入WAV文件
  • CHUNK大小要选合适:太小会导致频繁读取/回调,占用CPU;太大则会增加音频延迟,根据你的需求调整就行

内容的提问来源于stack exchange,提问作者Laveena

火山引擎 最新活动