使用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
相关产品推荐
相关产品推荐

