Windows下用Python录制蓝牙/USB耳机的耳返与麦克风音频
蓝牙连接下录制耳机麦克风+耳返音频的解决方案
1. 先定位蓝牙设备对应的音频回路设备
你的现有代码只适配了有线的Stereomix,蓝牙设备的混音设备名称通常不同。先运行这段代码列出所有音频设备,找到蓝牙相关的录制设备:
import pyaudio p = pyaudio.PyAudio() for i in range(p.get_device_count()): dev = p.get_device_info_by_index(i) print(f"设备索引: {i}, 名称: {dev['name']}, 支持输入: {dev['maxInputChannels'] > 0}") p.terminate()
重点找名称含「蓝牙」「Bluetooth」「混音」「Loopback」「Listen」的输入设备,记下它的索引。
2. 启用蓝牙设备的混音功能(Windows系统)
如果没找到对应设备,先开启系统隐藏的录制设备:
- 右键任务栏音量图标 → 声音设置 → 高级声音选项 → 更多声音设置
- 切换到「录制」选项卡,右键空白区域 → 勾选「显示禁用的设备」「显示已断开的设备」
- 找到蓝牙设备对应的「立体声混音」或「Bluetooth Audio Renderer」类录制设备,右键启用
3. 修改代码适配蓝牙混音设备
把找到的蓝牙设备索引替换到代码中,或修改自动匹配逻辑:
import pyaudio import wave CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 RECORD_SECONDS = 5 OUTPUT_FILENAME = "bluetooth_output.wav" p = pyaudio.PyAudio() dev_index = None # 自动匹配蓝牙相关录制设备 for i in range(p.get_device_count()): dev = p.get_device_info_by_index(i) if (('Bluetooth' in dev['name'] or '蓝牙' in dev['name']) and dev['maxInputChannels'] > 0): dev_index = dev['index'] print(f"找到蓝牙录制设备: 索引{dev_index}, 名称{dev['name']}") break # 自动匹配失败时,手动指定索引(替换成你找到的数字) if not dev_index: dev_index = 3 stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=dev_index, frames_per_buffer=CHUNK) print("录制中...") frames = [] for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)): data = stream.read(CHUNK) frames.append(data) print("录制结束") stream.stop_stream() stream.close() p.terminate() wf = wave.open(OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
4. 备选方案:分别捕获麦克风与耳返再混合
如果蓝牙设备无混音选项,可以分开捕获麦克风输入和系统播放音频,再混合两个流:
import pyaudio import wave import numpy as np CHUNK = 1024 FORMAT = pyaudio.paInt16 CHANNELS = 2 RATE = 44100 RECORD_SECONDS = 5 OUTPUT_FILENAME = "mixed_output.wav" p = pyaudio.PyAudio() # 定位蓝牙麦克风 mic_index = None for i in range(p.get_device_count()): dev = p.get_device_info_by_index(i) if ('Bluetooth' in dev['name'] and dev['maxInputChannels'] > 0): mic_index = dev['index'] print(f"蓝牙麦克风索引: {mic_index}") break # 定位耳返录制设备(立体声混音/loopback) loopback_index = None for i in range(p.get_device_count()): dev = p.get_device_info_by_index(i) if ('Loopback' in dev['name'] or '立体声混音' in dev['name']) and dev['maxInputChannels'] > 0: loopback_index = dev['index'] print(f"耳返设备索引: {loopback_index}") break # 打开两个音频流 mic_stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=mic_index, frames_per_buffer=CHUNK) loopback_stream = p.open(format=FORMAT, channels=CHANNELS, rate=RATE, input=True, input_device_index=loopback_index, frames_per_buffer=CHUNK) print("录制中...") frames = [] for _ in range(0, int(RATE / CHUNK * RECORD_SECONDS)): mic_data = mic_stream.read(CHUNK) loopback_data = loopback_stream.read(CHUNK) # 转数组混合(可调整音量比例,0.5为各占一半) mic_np = np.frombuffer(mic_data, dtype=np.int16) loopback_np = np.frombuffer(loopback_data, dtype=np.int16) mixed_np = (mic_np * 0.5 + loopback_np * 0.5).astype(np.int16) frames.append(mixed_np.tobytes()) print("录制结束") mic_stream.stop_stream() mic_stream.close() loopback_stream.stop_stream() loopback_stream.close() p.terminate() wf = wave.open(OUTPUT_FILENAME, 'wb') wf.setnchannels(CHANNELS) wf.setsampwidth(p.get_sample_size(FORMAT)) wf.setframerate(RATE) wf.writeframes(b''.join(frames)) wf.close()
内容的提问来源于stack exchange,提问作者TomaateTip
相关产品推荐
相关产品推荐

