You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyAudio模拟红外遥控器按键的故障排查

嘿,我来帮你拆解下这个问题——你遇到的核心矛盾其实是红外信号和普通音频信号的本质差异,咱们一步步捋清楚哪里出了问题,以及该怎么调整:

核心问题:红外信号≠普通音频

红外遥控器的按键信号是调制在38kHz左右高频载波上的脉冲信号,你听到的“哔声”只是这个载波的低频谐波分量,而普通音频播放链路(包括电脑声卡)会自动过滤高频信号、做增益优化,导致HDMI分配器的红外接收头根本识别不到真正需要的载波信号。再加上你录制环节的参数没匹配红外信号的特性,自然播放后没反应。

具体调整方案

1. 先修正录制环节的参数

你当前的44.1kHz采样率不符合奈奎斯特采样定理——要完整捕获38kHz的载波,采样率至少得是它的2倍(76kHz以上),否则录制时就已经丢失了关键的高频信息。另外,红外信号是单极性脉冲,用无符号8位格式会比双极性的16位更匹配:

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paUInt8  # 换成无符号8位,匹配红外单极性信号特性
CHANNELS = 1
RATE = 96000  # 提升到96kHz,完全覆盖38kHz载波的采样需求
RECORD_SECONDS = 4
WAVE_OUTPUT_FILENAME = "ir_key_1.wav"
RAW_OUTPUT_FILENAME = "ir_key_1.raw"

p = pyaudio.PyAudio()

# 打开录制流
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("Recording IR signal...")
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)
print("Recording done.")

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

# 保存WAV(方便用波形软件查看)
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()

# 保存RAW格式(播放时用这个更可靠,跳过WAV的头信息处理)
with open(RAW_OUTPUT_FILENAME, 'wb') as f:
    f.write(b''.join(frames))

2. 用原始格式直接播放,跳过音频优化

普通音频播放器会自动做低通滤波、增益调整,把38kHz的载波过滤掉。你需要用PyAudio直接以录制时的参数输出原始数据:

import pyaudio

CHUNK = 1024
FORMAT = pyaudio.paUInt8  # 和录制时完全一致
CHANNELS = 1
RATE = 96000  # 和录制时完全一致
RAW_INPUT_FILENAME = "ir_key_1.raw"

p = pyaudio.PyAudio()

# 打开播放流,注意是output=True
stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                output=True,
                frames_per_buffer=CHUNK)

print("Playing IR signal...")
with open(RAW_INPUT_FILENAME, 'rb') as f:
    data = f.read(CHUNK)
    while data:
        stream.write(data)
        data = f.read(CHUNK)
print("Playback finished.")

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

3. 验证与排查补充

  • 用波形软件确认信号:把录制的WAV文件导入Audacity,放大后应该能看到密集的38kHz载波波形,上面叠加了脉冲调制的信号。如果看不到,说明采样率还是不够,或者红外转3.5mm的接收器输出有问题。
  • 检查USB转3.5mm适配器:廉价适配器会过滤20kHz以上的信号,直接把载波砍掉了,换一个支持高采样率的USB声卡试试。
  • 电平匹配问题:有些HDMI分配器的红外接收3.5mm接口需要特定电平,而音频输出的电平可能不匹配,必要时可以加一个简单的电阻分压电路调整。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:02:52