源码:PaperStrike/HeadsetControlsPC
自己是一名新晋大学生,自从有了电脑,电脑开着 B 站手机刷音讯就成为了自己闲时的挚爱。为了不影响舍友 / 家人的学习生存,受制于本人的经济能力,自己始终戴着有线耳机,并在躺着看电影时发现了这样一个 恐怖 的事件:
没有一家笔记本反对 3.5mm 有线耳机线控!
好吧可能还是有的,反正在自己的搜寻中并没有找到。仅仅搜到有几个型号的台式机,反对两头的那个暂停 / 持续键。这有什么用? 不能调音量,不能调下一曲,而且,又不是我的台式机!???? 于是求助于在搜寻关键词中增加万能的程序员专用字眼:github
,发现了这篇文章:
Hacking in Android headset button support for Windows | Christian Barth Roligheten
Perfect,同志们!里边具体介绍了帅哥 Christian Barth Roligheten 为本人的 PC 增加 暂停 / 持续 按键反对的过程,联合了具体的 Python 源码并提供了仓库链接(roligheten/AndroidMediaControlsWindows)。自己在 Roligheten 钻研声道图的根底上进一步剖析,在行将放弃心愿之际,偶尔中找到了分辨三个不同按键的办法。
原理
3.5mm TRRS 接口的有线耳机的麦克风与按钮并联,按钮按下时麦克风被短接,安卓设施通过检测电压差能够晓得按下的按钮。
图中各按钮常见的对应性能如下:
按键 | 介绍 |
---|---|
A | 暂停 / 持续 |
B | 减少音量 |
C | 缩小音量 |
D | Pixel 上唤起语音助手 |
少数 PC 设施无奈获知电压差,但短接对麦克风两个声道产生的影响(尽管不晓得为什么,但)有法则可循。这里自己从 sounddevice 的例子库中抉择并轻修了一个 plot_input.py
,用于实时输入麦克风 声道一 的波形(橙线 Channel 1
)和 两声道差值(蓝线 diff
,Channel 2
– Channel 1
)的波形,演示。
横轴示意工夫,单位为毫秒(ms),纵轴示意声音的变动。
数据在不同设施上可能有所不同,另外,演示中排除了轻按的状况。
无声音时,两条波均出现为一条直线。而极其 噪声 环境下,Channel 1
触动激烈,diff
保持稳定:
短按 按钮时,处于 宁静环境 (0-1000ms)和处于 噪声环境(1300-4000ms)的两条波出现的变动中,有法则的至多有:
diff
在按下霎时增长至 0.06(±0.05) 并继续 40(±30)ms,在松开霎时降落。Channel 1
在按下霎时,降落并放弃在 -0.6 以下 100(±30)ms,经 30(±20)ms 增长至 0.45 以上并放弃 230(±60)ms,经 30(±20)ms 降落至 -0.40(±5) 以下。
- 在另外的试验中留神到,按钮放弃按下时,两条波简直不受环境声音影响(,应该是短接的起因)。
短按 (0-800ms)和 长按(850-2400ms)时,两条波在上述法则根底上又呈现出了不同变动:
diff
在长按过程中在 -0.17-0.17 范畴内随机稳定,在长按松开霎时再次拉升,后降落,具体见图,不再赘述。Channel 1
在长按过程中放弃在 -0.30(±5) 以上,在长按松开霎时再次拉升,后降落至 -0.40(±5) 以下,具体见图。
放大到纵轴 0.1 范畴内,察看 diff
的变动。留神到不同按钮的按下霎时 diff
呈的稳定幅度有所不同:
- 按钮 A 按下霎时(700-900ms)
diff
稳定峰值在 0.075 以上,按钮 B(1700-1900ms)为 0.025-0.075,按钮 C(3000-3200ms)为 0.016-0.025。
有趣味的同志能够本人下载编辑 plot_input.py
,试验。
目前,我的项目应用 1 && 2
条件判断按下,5
条件判断松开,6
条件判断不同按钮。
判断条件曾经被自己换了好几次 以扩充适应的设施范畴,但因为 只有一台 笔记本和一条耳机随我调用,不兼容我也没多少方法。你违心当我的工具人吗?
装置,有趣味吗?
以下两种形式都须要联网,会主动装置依赖包 keyboard
,numpy
和 sounddevice
。
PyPI
通过 PyPI 装置:
pip install trrsheadset
Clone
或者,从 这里 下载在 GitHub 仓库中的压缩包,解压到一个记得住地位的中央。
这种装置形式目前有一个 bug(PIP doesn’t read setup.cfg in UTF-8, which causes UnicodeDecodeError · Issue #8931 · pypa/pip),装置前须要依据你应用的命令行环境设置环境变量
PYTHONUTF8=1
:
- PowerShell:
$env:PYTHONUTF8=1
- Shell:
export PYTHONUTF8=1
- CMD:
set PYTHONUTF8=1
定位到解压文件夹中运行:
pip install .
而后,就能够把解压文件夹删掉。
应用
插入耳机后,在命令行中应用 Python 启动 trrsheadset
即可:
python -m trrsheadset [参数]
- 敞开能够应用两种形式,一种是间接敞开命令行,一种是按下
ctrl+break
快捷键强制退出。- 选用
pythonw
启动可在命令行敞开后放弃运行,可在工作管理器中找到Python 3.x (Windowed)
敞开。
重插耳机须要重新启动。
可选参数
-l
or --log
将运行日志保留至文件
--use-hotkey
开启键盘快捷键,见后文介绍
-h
or --help
输入此列表后退出
按键
耳机按键映射 & 键盘快捷键响应。基于 Python 库 keyboard。
耳机
按键 | 短按 | 长按 | 双击 |
---|---|---|---|
A | 持续 / 暂停 | 持续 / 暂停 | 静音 / 勾销静音 |
B | 音量 + | 下一首 | / |
C | 音量 - | 上一首 | / |
D | / | / | / |
双击操作处于晚期开发阶段
键盘
需在启动时应用 --use-hotkey
参数。
根底快捷键 ctrl+shift+h
,在根底快捷键触发后 1s 内按下以下按键能够触发相应操作:
p
暂停或持续
e
退出
!局部设施在开启上述快捷键后,检测不到右 shift、右 ctrl 的开释动作,此时能够按击键盘右边对应按键复原。
因而,此性能在默认状况下敞开。
留神哦
- 不要按得太快,招架不住。
- 有问题欢送评论,也能够在 GitHub 提 issue 或进入讨论区(Discussions)交换。
- 如果放久后按钮分别老错,可能是太久不放音乐了电压不高(?存疑,探讨欢送)
- 感激 roligheten/AndroidMediaControlsWindows ????
抓取日志
增加参数 -l
或 --log
启动可将运行时日志保留到 运行时文件夹 的 debug.log.1
和 debug.log
日志文件中。日志文件对定位 BUG 十分有帮忙。
python run.py -l
我的项目许可
GPL-3.0 License