通过链接调起软件

上期文章讲了如何自行推送视频流,支持快进和断点续传。这期是视频流使用扩展出来一个需求。浏览器中的视频播放器支持的视频类型不多,虽然可以使用 ffmpeg 来转化,但是转化就代表了细节丢失,所以想调起本地的视频播放器来播放视频流。接下来以封装一个 Windows 下的视频播放调起协议示例来介绍自定义协议。

Windows 环境

Windows 下需要通过修改注册表来定义自定义协议。

  1. 编写自定义协议相关的注册表

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Windows 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://)
  2. 协议调用中转

    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
    51
    import 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客服、加入群聊、打开百度云盘、分享链接打开购买商品等功能。

参考链接