通过链接调起软件
上期文章讲了如何自行推送视频流,支持快进和断点续传。这期是视频流使用扩展出来一个需求。浏览器中的视频播放器支持的视频类型不多,虽然可以使用 ffmpeg 来转化,但是转化就代表了细节丢失,所以想调起本地的视频播放器来播放视频流。接下来以封装一个 Windows 下的视频播放调起协议示例来介绍自定义协议。
Windows 环境
Windows 下需要通过修改注册表来定义自定义协议。
编写自定义协议相关的注册表
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19Windows Registry Editor Version 5.00
[HKEY_CLASSES_ROOT\media]
@="Open Video File"
"URL Protocol"=""
[HKEY_CLASSES_ROOT\media\DefaultIcon]
@="\"D:\\URLSchemes\\media.bat\",0"
[HKEY_CLASSES_ROOT\media\shell]
@="Open"
[HKEY_CLASSES_ROOT\media\shell\Open]
@="播放"
"MultiSelectModel"="Player"
[HKEY_CLASSES_ROOT\media\shell\Open\command]
@="\"D:\\URLSchemes\\media.bat\" \"%1\""Note:
- win + R 打开运行,输入 regedit 确定就会打开注册表
- media 是协议名,只要不冲突即可自行替换
HKEY_CLASSES_ROOT\media\shell\Open\command
里调起方法,%1
是协议后面的参数,media://file:///D://upload.mp4
协议参数就是他本身(不会自动去除 media://)
协议调用中转
Windows 请求传参会带有自定义协议需要对参数进行截取。这个处理是由我们自己写的逻辑调起,就可以规划更多的请求参数来作不同的处理。
windows 自带bat脚本调起
1
2
3
4
5
6
7
8@echo off
set schemes=%1
set url=%schemes:media://=%
start /d "%ProgramFiles(x86)%\Windows Media Player" wmplayer.exe %url%python 脚本调起(需要调整注册表参数为:
@="python \"D:\\URLSchemes\\media.py\" \"%1\""
)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
51import os
import sys
from urllib.parse import parse_qs
import subprocess
class UrlProtocol:
protocol = ''
action = ''
params = []
def __init__(self, args):
if len(args) != 1:
return 1
protocol, fullPath = args[0].split(":", 1)
path, fullArgs = fullPath.split("?", 1)
action = path.strip("/")
args = fullArgs.split("&")
self.protocol = protocol.lower()
self.action = action.lower()
self.params = parse_qs(fullArgs)
def main(self):
cmd = []
if self.protocol == 'vlc':
os.chdir('D:/Program Files (x86)/VideoLAN/VLC')
try:
url = self.params.get('url')[0]
if self.action == 'open':
cmd = ['vlc.exe', '--started-from-file', url]
elif self.action == 'addtoplaylistvlc':
# 添加到 VLC media player 播放列表
cmd = ['vlc.exe', '--started-from-file', '--playlist-enqueue', url]
elif self.action == 'playwithvlc':
# 使用 VLC media player 播放
cmd = ['vlc.exe', '--started-from-file', '--no-playlist-enqueue', url]
except Exception as e:
cmd = ['vlc.exe']
if cmd:
subprocess.Popen(cmd)
if __name__ == '__main__':
controller = UrlProtocol(sys.argv[1:])
sys.exit(controller.main())
业务使用场景思考
这是个十分实用的功能,调整软件进行相关业务,常见的功能:联系我们关联的qq客服、加入群聊、打开百度云盘、分享链接打开购买商品等功能。