-
Notifications
You must be signed in to change notification settings - Fork 1
/
SITCON_2022_R0_無線耳機,不只是耳機,還是簡報遙控器_H1NyeQKpcUY.srt
657 lines (492 loc) · 11.7 KB
/
SITCON_2022_R0_無線耳機,不只是耳機,還是簡報遙控器_H1NyeQKpcUY.srt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
1
00:00:00,000 --> 00:00:10,000
請不吝點贊訂閱轉發打賞支持明鏡與點點欄目
2
00:00:30,000 --> 00:00:37,000
打賞支持明鏡與點點欄目
3
00:01:00,000 --> 00:01:03,000
字幕由 Amara.org 社区提供
4
00:01:30,000 --> 00:01:33,000
字幕由 Amara.org 社区提供
5
00:02:00,000 --> 00:02:05,000
感谢观看
6
00:02:30,000 --> 00:02:32,000
欢迎订阅我的频道
7
00:03:00,000 --> 00:03:24,000
我们就想说它可能是一个 Keyboard 的式
8
00:03:24,000 --> 00:03:26,000
那我们就来测试一下
9
00:03:26,000 --> 00:03:29,000
那我们就透过 Python 这个 Keyboard Module 来简单测试
10
00:03:29,000 --> 00:03:31,000
那我们做了这个实验之后
11
00:03:31,000 --> 00:03:33,000
我们就发现当我操作耳机的时候
12
00:03:33,000 --> 00:03:35,000
我就会得到这些讯号
13
00:03:35,000 --> 00:03:37,000
好
14
00:03:37,000 --> 00:03:39,000
那所以我们的第一个解决方法就是
15
00:03:39,000 --> 00:03:41,000
那我们就直接来抓 Keyboard
16
00:03:41,000 --> 00:03:45,000
那我们要得到这些 Keyboard 的事件的话
17
00:03:45,000 --> 00:03:46,000
那非常简单
18
00:03:46,000 --> 00:03:49,000
我们只要透过 Keyboard Module 底下这个 Unpress Key
19
00:03:49,000 --> 00:03:53,000
那传入你要抓的 Keycode 跟你的 Callback 就好了
20
00:03:53,000 --> 00:03:55,000
好
21
00:03:55,000 --> 00:03:57,000
那这边我们透过刚才的实验我们也发现说
22
00:03:57,000 --> 00:03:59,000
当你按下了下一首
23
00:03:59,000 --> 00:04:01,000
或者是按下了上一首的动作的时候
24
00:04:01,000 --> 00:04:05,000
它后面会紧接着一个播放的讯号
25
00:04:05,000 --> 00:04:07,000
所以这个时候就再加上一个 Lock
26
00:04:07,000 --> 00:04:09,000
在我们呼叫 Next Page 的时候
27
00:04:09,000 --> 00:04:11,000
也就是我们按两下
28
00:04:11,000 --> 00:04:13,000
那我们就要将它的 Lock 设为 True
29
00:04:13,000 --> 00:04:16,000
那它后面它的 Play Pause 的这个讯号
30
00:04:16,000 --> 00:04:18,000
触发 Next Page 的时候
31
00:04:18,000 --> 00:04:19,000
它就不会重复的去触发
32
00:04:19,000 --> 00:04:21,000
而不会变成说我切了上一页
33
00:04:21,000 --> 00:04:22,000
我马上切回来
34
00:04:22,000 --> 00:04:24,000
那记得呼叫完 Next Page 之后
35
00:04:24,000 --> 00:04:26,000
我们要再把这个 Lock 设成 Force
36
00:04:26,000 --> 00:04:31,000
这样才不会影响到我们后面的触发
37
00:04:31,000 --> 00:04:32,000
好那问题来了
38
00:04:32,000 --> 00:04:34,000
那当你以为我这样写好之后
39
00:04:34,000 --> 00:04:36,000
我就可以直接在各个 OS 上用的时候呢
40
00:04:36,000 --> 00:04:38,000
那这个时候你就会发现
41
00:04:38,000 --> 00:04:40,000
那其实它在 Windows 上跟在 Linux 上面
42
00:04:40,000 --> 00:04:42,000
它的 Key Code 其实会不太一样
43
00:04:42,000 --> 00:04:44,000
那这边的 Linux Key Code
44
00:04:44,000 --> 00:04:47,000
是我在我自己的 Oculus 跟我的 Ubuntu 上面去测的
45
00:04:47,000 --> 00:04:48,000
那很幸运它是一样的
46
00:04:48,000 --> 00:04:50,000
但有可能它在不同的 Link 上面
47
00:04:50,000 --> 00:04:54,000
又会有不同的 Key Code 出来
48
00:04:54,000 --> 00:04:55,000
好那问题又来了
49
00:04:55,000 --> 00:04:58,000
那当你在报简报的时候可能也在听着 YT
50
00:04:58,000 --> 00:04:59,000
那怎么办呢
51
00:04:59,000 --> 00:05:00,000
这个时候你会发现
52
00:05:00,000 --> 00:05:03,000
你的控制器只能控制那个音乐
53
00:05:03,000 --> 00:05:05,000
而没有办法控制你的简报
54
00:05:05,000 --> 00:05:08,000
那你去查看你的浏览器的设定的时候
55
00:05:08,000 --> 00:05:12,000
你会发现一个叫做 Media Foundation Playback 的东西
56
00:05:12,000 --> 00:05:13,000
那我们得到这个关键字之后
57
00:05:13,000 --> 00:05:17,000
我们就再更深入的去研究它
58
00:05:17,000 --> 00:05:20,000
那这个时候我们可以来看到 Windows 里面的 Audio Stack
59
00:05:20,000 --> 00:05:21,000
我们会发现说
60
00:05:21,000 --> 00:05:23,000
当你的控制讯号进来的时候
61
00:05:23,000 --> 00:05:25,000
会先经过 Media Foundation
62
00:05:25,000 --> 00:05:28,000
那所以如果你的媒体控制
63
00:05:28,000 --> 00:05:31,000
是先透过 Media Foundation 来控制的话
64
00:05:31,000 --> 00:05:33,000
那么这个讯号就会被它抢走
65
00:05:33,000 --> 00:05:36,000
而我们的 Python Script 就吃不到这些讯号
66
00:05:36,000 --> 00:05:37,000
那很简单
67
00:05:37,000 --> 00:05:40,000
打不过我们就加入它
68
00:05:40,000 --> 00:05:42,000
所以我们的第二个方式
69
00:05:42,000 --> 00:05:45,000
我们就是假装我们自己是一个播放器
70
00:05:45,000 --> 00:05:47,000
那这边我们使用的这个 API
71
00:05:47,000 --> 00:05:49,000
叫做 System Media Transport Controls
72
00:05:49,000 --> 00:05:50,000
或是我们叫它 SMTC
73
00:05:50,000 --> 00:05:52,000
那就是你在调整音量的时候
74
00:05:52,000 --> 00:05:54,000
旁边会出现的这个框框
75
00:05:54,000 --> 00:05:55,000
那这边会显示一些
76
00:05:55,000 --> 00:05:56,000
比如说你现在在播放的曲目
77
00:05:56,000 --> 00:05:59,000
但是我们拿它来做我们的控制器
78
00:05:59,000 --> 00:06:01,000
那这个 API 是 Windows Runtime API 的一个东西
79
00:06:01,000 --> 00:06:06,000
然后在 Windows 10 以上的版本才会有
80
00:06:06,000 --> 00:06:09,000
好那你要在 Python 里面操作这个 API 的话
81
00:06:09,000 --> 00:06:11,000
你就要透过一个叫做 WinRT 的套件来处理
82
00:06:11,000 --> 00:06:14,000
那这个套件是由微软官方所提供的
83
00:06:14,000 --> 00:06:19,000
那它只支援 Python 3.7 3.8 跟 3.9
84
00:06:19,000 --> 00:06:21,000
那这个 API 我们先来看说
85
00:06:21,000 --> 00:06:23,000
好那我们要怎么拿到一个 SMTC 呢
86
00:06:23,000 --> 00:06:27,000
那一开始看到有个叫做 Get For Current View
87
00:06:27,000 --> 00:06:29,000
但因为我们是一个从 Company Line 呼叫的
88
00:06:29,000 --> 00:06:30,000
一个 Python 脚本
89
00:06:30,000 --> 00:06:32,000
那么我们根本就没有视窗
90
00:06:32,000 --> 00:06:35,000
那所以我们就会得到一个错误
91
00:06:35,000 --> 00:06:37,000
那这个时候再仔细地去查看一下
92
00:06:37,000 --> 00:06:38,000
我们的 API 文件的话
93
00:06:38,000 --> 00:06:39,000
我们会发现
94
00:06:39,000 --> 00:06:41,000
那其实我们可以从 Media Player 里面
95
00:06:41,000 --> 00:06:44,000
去拿到这样的 SMTC
96
00:06:44,000 --> 00:06:45,000
那我们就来测试一下说
97
00:06:45,000 --> 00:06:47,000
那我们可不可以在 Python 中使用它
98
00:06:47,000 --> 00:06:48,000
那很幸运的是可以
99
00:06:48,000 --> 00:06:51,000
我们可以放一个空的 Media Player
100
00:06:51,000 --> 00:06:53,000
然后我们再从它里面拿到 SMTC
101
00:06:53,000 --> 00:06:54,000
那这边我们要记得
102
00:06:54,000 --> 00:06:58,000
将它的 Command Manager disable 掉
103
00:06:58,000 --> 00:07:01,000
好那另外我们要让它持续有控制权
104
00:07:01,000 --> 00:07:02,000
因此我们要在这边
105
00:07:02,000 --> 00:07:04,000
将它的 Playback Status 设成 Playing
106
00:07:04,000 --> 00:07:06,000
另外我们还要将这些
107
00:07:06,000 --> 00:07:08,000
比如说像 Play Pause Next Previous
108
00:07:08,000 --> 00:07:10,000
等等的这些 Media Button 的
109
00:07:10,000 --> 00:07:12,000
设成 Enable 这样子
110
00:07:12,000 --> 00:07:14,000
好那接下来还有一个东西
111
00:07:14,000 --> 00:07:15,000
叫做 Display Updater
112
00:07:15,000 --> 00:07:16,000
那我们可以透过这边
113
00:07:16,000 --> 00:07:19,000
更改里面显示的资讯
114
00:07:19,000 --> 00:07:21,000
那透过 Display Updater
115
00:07:21,000 --> 00:07:22,000
我就可以像它原本
116
00:07:22,000 --> 00:07:23,000
它只写了一个 Python.exe
117
00:07:23,000 --> 00:07:25,000
那这边我就可以让它显示说
118
00:07:25,000 --> 00:07:29,000
那我现在是一个 Slice Controller 这样子
119
00:07:29,000 --> 00:07:32,000
好那我们要如何来处理这些讯号呢
120
00:07:32,000 --> 00:07:35,000
那我们只要透过 Add Button Pressed
121
00:07:35,000 --> 00:07:36,000
然后传入我们的 Callback
122
00:07:36,000 --> 00:07:37,000
那我们就可以来处理
123
00:07:37,000 --> 00:07:39,000
比如说像按下了 Play
124
00:07:39,000 --> 00:07:44,000
或是按下了 Next Track 等等
125
00:07:45,000 --> 00:07:46,000
好那太好了
126
00:07:46,000 --> 00:07:50,000
那就发现这个功能是确实可以实作的
127
00:07:50,000 --> 00:07:52,000
好那其他是一些我在
128
00:07:52,000 --> 00:07:53,000
研究这个东西的过程中
129
00:07:53,000 --> 00:07:56,000
发现的一些事情
130
00:07:56,000 --> 00:07:58,000
那其实你再往更深的地方去看的话
131
00:07:58,000 --> 00:07:59,000
你可以发现
132
00:07:59,000 --> 00:08:01,000
它其实底下是用蓝牙 API 在呼叫的
133
00:08:01,000 --> 00:08:03,000
那你可以透过 Wireshark
134
00:08:03,000 --> 00:08:06,000
里面的那个 USB 这个 Interface 来抓
135
00:08:06,000 --> 00:08:07,000
那你可以发现它底下
136
00:08:07,000 --> 00:08:10,000
实际上使用的 protocol 是 AVRCP
137
00:08:10,000 --> 00:08:12,000
那你这边也会发现说
138
00:08:12,000 --> 00:08:14,000
当你是
139
00:08:14,000 --> 00:08:15,000
耳机实际上
140
00:08:15,000 --> 00:08:17,000
它是传送的 Forward 跟 Play 一起来的
141
00:08:17,000 --> 00:08:18,000
而不是是 Windows 自己加上去的
142
00:08:18,000 --> 00:08:22,000
是耳机本来就有传送来的
143
00:08:22,000 --> 00:08:24,000
好那这个应该是没有什么时间讲
144
00:08:24,000 --> 00:08:25,000
那不过简单来说就是
145
00:08:25,000 --> 00:08:27,000
目前我们只支援 Windows 跟 Linux
146
00:08:27,000 --> 00:08:28,000
那希望后面
147
00:08:28,000 --> 00:08:30,000
还可以再加上 macOS 的支援
148
00:08:30,000 --> 00:08:32,000
因为我们用 macOS 不能测
149
00:08:32,000 --> 00:08:34,000
那这边是 Repo 的网址
150
00:08:34,000 --> 00:08:36,000
那如果大家有自己型号的耳机
151
00:08:36,000 --> 00:08:38,000
或者是其他 OS 想要测试的话
152
00:08:38,000 --> 00:08:39,000
或者是想要实作的话
153
00:08:39,000 --> 00:08:43,000
那都欢迎丢 PR 过来给我
154
00:08:43,000 --> 00:08:44,000
那这边是 Q&A 时间
155
00:08:44,000 --> 00:08:45,000
不过我看起来只剩 10 秒
156
00:08:45,000 --> 00:08:50,000
应该是没有什么时间了
157
00:08:50,000 --> 00:08:51,000
好那谢谢大家
158
00:08:51,000 --> 00:08:52,000
那那个等一下如果有问题的话
159
00:08:52,000 --> 00:08:54,000
我会再上贡比去跟大家回答
160
00:08:54,000 --> 00:08:59,000
好谢谢
161
00:08:59,000 --> 00:09:01,000
谢谢石头所带来的精彩议程
162
00:09:01,000 --> 00:09:03,000
下一场议程为
163
00:09:03,000 --> 00:09:04,000
教练我想打 code
164
00:09:04,000 --> 00:09:06,000
为什么要学设计组和 OS