39. 实战:基于api接口实现视频解析播放(32接口,窗口化操作,可导出exe,附源码)

news2025/1/12 18:16:18

目录

前言

目的

思路

代码实现

需要导入的模块

1. 导入解析网站列表,实现解析过程

2. 设计UI界面

3. 设置窗口居中和循环执行

4. 注意事项

完整源码

运行效果

总结


前言

本节将类似34. 实战:基于某api实现歌曲检索与下载(附完整源代码),也将基于api实现视频解析播放的功能,并且还实现了用户UI界面,随后大家也可以用py2exe等库导出exe来永久保存可执行文件。

本例具有32个接口供大家解析,一般前面的就能够顺利解析出来了,看大家喜好~


目的

实现输入任意视频链接,在用户UI窗口选择解析接口,点击解析按钮自动跳转到系统默认浏览器进行播放。


思路

1. 导入解析网站列表,实现解析过程

2. 设计UI界面

3. 设置窗口居中和循环执行

4. 注意事项


代码实现

需要导入的模块

from urllib import parse
import tkinter.messagebox as msgbox
import tkinter as tk
import webbrowser
import re

1. 导入解析网站列表,实现解析过程

    """
    函数说明:视频播放
    """

    def video_play(self):
        # 视频解析网站地址
        # port_1 = 'https://jx.618g.com/?url='
        port_1 = 'https://im1907.top/?jx='
        port_2 = 'https://jx.jsonplayer.com/player/?url='
        port_3 = 'https://jx.aidouer.net/?url='
        port_4 = 'https://jx.xmflv.com/?url='
        port_5 = 'https://okjx.cc/?url='
        port_6 = 'https://www.nxflv.com/?url='
        port_7 = 'https://www.yemu.xyz/?url='
        port_8 = 'https://jx.m3u8.tv/jiexi/?url='
        port_9 = 'https://jx.blbo.cc:4433/?url='
        port_10 = 'https://api.qianqi.net/vip/?url='
        port_11 = 'https://jx.nnxv.cn/tv.php?url='
        port_12 = 'https://bd.jx.cn/?url='
        port_13 = 'https://123.1dior.cn/?url='
        port_14 = 'https://www.ckplayer.vip/jiexi/?url='
        port_15 = 'https://www.ckmov.vip/api.php?url='
        port_16 = 'https://jx.playerjy.com/?url='
        port_17 = 'https://ckmov.ccyjjd.com/ckmov/?url='
        port_18 = 'https://www.ckmov.com/?url='
        port_19 = 'https://www.h8jx.com/jiexi.php?url='
        port_20 = 'https://svip.bljiex.cc/?v='
        port_21 = 'https://api.jiexi.la/?url='
        port_22 = 'https://jiexi.janan.net/jiexi/?url='
        port_23 = 'https://www.mtosz.com/erzi.php?url='
        port_24 = 'https://www.administratorw.com/video.php?url='
        port_25 = 'https://www.pangujiexi.cc/jiexi.php?url='
        port_26 = 'https://www.gai4.com/?url='
        port_27 = 'https://go.yh0523.cn/y.cy?url='
        port_28 = 'https://www.1717yun.com/jx/ty.php?url='
        port_29 = 'https://jx.4kdv.com/?url='
        port_30 = 'https://www.8090g.cn/?url='
        port_31 = 'https://jx.dj6u.com/?url='
        port_32 = 'https://jx.000180.top/jx/?url='

        # 正则表达是判定是否为合法链接
        if re.match(r'^https?:/{2}\w.+$', self.url.get()):
            port_num = self.v.get()
            port_url_referer = locals()[f'port_{port_num}']
            # 视频链接获取
            ip = self.url.get()
            # 视频链接加密
            ip = parse.quote_plus(ip)
            # 浏览器打开
            webbrowser.open(port_url_referer + self.url.get())

        else:
            msgbox.showerror(title='错误', message='视频链接地址无效,请重新输入!')

这里用locals函数实现基于变量名称的字符串检索变量对应值的操作,还是值得一学的。如果是全局变量就要使用globals,用法是一样的。 

2. 设计UI界面

就常规设计一下,大同小异的,博主审美能力有限,就做的很粗糙了:

    def __init__(self, width=1280, height=720):
        self.w = width
        self.h = height
        self.title = 'Vector的VIP解析助手'
        self.root = tk.Tk(className=self.title)
        # 定义button控件上的文字
        self.url = tk.StringVar()

        # 定义选择哪个播放源
        self.v = tk.IntVar()

        # 默认为1
        self.v.set(1)

        # Frame空间
        frame_1 = tk.Frame(self.root)
        frame_2 = tk.Frame(self.root)
        frame_3 = tk.Frame(self.root)

        # Menu菜单
        menu = tk.Menu(self.root)
        self.root.config(menu=menu)
        moviemenu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label='友情链接', menu=moviemenu)

        # 各大视频网站
        moviemenu.add_command(label='腾讯视频', command=lambda: webbrowser.open('http://v.qq.com/'))
        moviemenu.add_command(label='搜狐视频', command=lambda: webbrowser.open('http://tv.sohu.com/'))
        moviemenu.add_command(label='芒果TV', command=lambda: webbrowser.open('http://www.mgtv.com/'))
        moviemenu.add_command(label='爱奇艺', command=lambda: webbrowser.open('http://www.iqiyi.com/'))
        moviemenu.add_command(label='PPTV', command=lambda: webbrowser.open('http://www.bilibili.com/'))
        moviemenu.add_command(label='优酷', command=lambda: webbrowser.open('http://www.youku.com/'))
        moviemenu.add_command(label='乐视', command=lambda: webbrowser.open('http://www.le.com/'))
        moviemenu.add_command(label='土豆', command=lambda: webbrowser.open('http://www.tudou.com/'))
        moviemenu.add_command(label='A站', command=lambda: webbrowser.open('http://www.acfun.tv/'))
        moviemenu.add_command(label='B站', command=lambda: webbrowser.open('http://www.bilibili.com/'))

        # 控件内容设置
        group = tk.Label(frame_1, text='请选择一个视频解析方式:', padx=10, pady=10)
        tb1 = tk.Radiobutton(frame_1, text='纯净/B站', variable=self.v, value=1, width=10, height=3)
        tb2 = tk.Radiobutton(frame_1, text='综合/B站', variable=self.v, value=2, width=10, height=3)
        tb3 = tk.Radiobutton(frame_1, text='爱豆', variable=self.v, value=3, width=10, height=3)
        tb4 = tk.Radiobutton(frame_1, text='虾米', variable=self.v, value=4, width=10, height=3)
        tb5 = tk.Radiobutton(frame_1, text='OK解析', variable=self.v, value=5, width=10, height=3)
        tb6 = tk.Radiobutton(frame_1, text='诺讯', variable=self.v, value=6, width=10, height=3)
        tb7 = tk.Radiobutton(frame_1, text='夜幕', variable=self.v, value=7, width=10, height=3)
        tb8 = tk.Radiobutton(frame_1, text='M3U8.TV', variable=self.v, value=8, width=10, height=3)
        tb9 = tk.Radiobutton(frame_1, text='人人迷', variable=self.v, value=9, width=10, height=3)
        tb10 = tk.Radiobutton(frame_1, text='全民', variable=self.v, value=10, width=10, height=3)
        tb11 = tk.Radiobutton(frame_1, text='七哥', variable=self.v, value=11, width=10, height=3)
        tb12 = tk.Radiobutton(frame_1, text='冰豆', variable=self.v, value=12, width=10, height=3)
        tb13 = tk.Radiobutton(frame_1, text='迪奥', variable=self.v, value=13, width=10, height=3)
        tb14 = tk.Radiobutton(frame_1, text='CK', variable=self.v, value=14, width=10, height=3)
        tb15 = tk.Radiobutton(frame_1, text='ckmov', variable=self.v, value=15, width=10, height=3)
        tb16 = tk.Radiobutton(frame_1, text='playerjy/B站', variable=self.v, value=16, width=10, height=3)
        tb17 = tk.Radiobutton(frame_1, text='ccyjjd', variable=self.v, value=17, width=10, height=3)
        tb18 = tk.Radiobutton(frame_1, text='诺诺', variable=self.v, value=18, width=10, height=3)
        tb19 = tk.Radiobutton(frame_1, text='H8', variable=self.v, value=19, width=10, height=3)
        tb20 = tk.Radiobutton(frame_1, text='BL', variable=self.v, value=20, width=10, height=3)
        tb21 = tk.Radiobutton(frame_1, text='解析la', variable=self.v, value=21, width=10, height=3)
        tb22 = tk.Radiobutton(frame_1, text='MUTV', variable=self.v, value=22, width=10, height=3)
        tb23 = tk.Radiobutton(frame_1, text='MAO', variable=self.v, value=23, width=10, height=3)
        tb24 = tk.Radiobutton(frame_1, text='无名', variable=self.v, value=24, width=10, height=3)
        tb25 = tk.Radiobutton(frame_1, text='盘古', variable=self.v, value=25, width=10, height=3)
        tb26 = tk.Radiobutton(frame_1, text='盖世', variable=self.v, value=26, width=10, height=3)
        tb27 = tk.Radiobutton(frame_1, text='0523', variable=self.v, value=27, width=10, height=3)
        tb28 = tk.Radiobutton(frame_1, text='17云', variable=self.v, value=28, width=10, height=3)
        tb29 = tk.Radiobutton(frame_1, text='4K', variable=self.v, value=29, width=10, height=3)
        tb30 = tk.Radiobutton(frame_1, text='8090', variable=self.v, value=30, width=10, height=3)
        tb31 = tk.Radiobutton(frame_1, text='听乐', variable=self.v, value=31, width=10, height=3)
        tb32 = tk.Radiobutton(frame_1, text='180', variable=self.v, value=32, width=10, height=3)
        label1 = tk.Label(frame_2, text="请输入视频链接:")
        entry = tk.Entry(frame_2, textvariable=self.url, highlightcolor='Fuchsia', highlightthickness=1, width=35)
        label2 = tk.Label(frame_2, text=" ")
        play = tk.Button(frame_2, text="播放", font=('楷体', 12), fg='Purple', width=2, height=1, command=self.video_play)
        label3 = tk.Label(frame_2, text=" ")
        label_explain = tk.Label(frame_3, fg='red', font=('楷体', 18), text='\n注意:\nCSDN博主Vec_Kun版权所有\n此工具仅用于交流学习\n请勿用于任何商业用途!')
        label_warning = tk.Label(frame_3, fg='black', font=('楷体', 16), text='\n\n')

        # 控件布局
        frame_1.pack()
        frame_2.pack()
        frame_3.pack()
        group.grid(row=0, column=0)
        tb1.grid(row=0, column=1)
        tb2.grid(row=0, column=2)
        tb3.grid(row=0, column=3)
        tb4.grid(row=0, column=4)
        tb5.grid(row=1, column=1)
        tb6.grid(row=1, column=2)
        tb7.grid(row=1, column=3)
        tb8.grid(row=1, column=4)
        tb9.grid(row=2, column=1)
        tb10.grid(row=2, column=2)
        tb11.grid(row=2, column=3)
        tb12.grid(row=2, column=4)
        tb13.grid(row=3, column=1)
        tb14.grid(row=3, column=2)
        tb15.grid(row=3, column=3)
        tb16.grid(row=3, column=4)
        tb17.grid(row=4, column=1)
        tb18.grid(row=4, column=2)
        tb19.grid(row=4, column=3)
        tb20.grid(row=4, column=4)
        tb21.grid(row=5, column=1)
        tb22.grid(row=5, column=2)
        tb23.grid(row=5, column=3)
        tb24.grid(row=5, column=4)
        tb25.grid(row=6, column=1)
        tb26.grid(row=6, column=2)
        tb27.grid(row=6, column=3)
        tb28.grid(row=6, column=4)
        tb29.grid(row=7, column=1)
        tb30.grid(row=7, column=2)
        tb31.grid(row=7, column=3)
        tb32.grid(row=7, column=4)
        label1.grid(row=0, column=0)
        entry.grid(row=0, column=1)
        label2.grid(row=0, column=2)
        play.grid(row=0, column=3, ipadx=10, ipady=10)
        label3.grid(row=0, column=4)
        label_explain.grid(row=1, column=0)
        label_warning.grid(row=2, column=0)

3. 设置窗口居中和循环执行

    """
    函数说明:tkinter窗口居中
    """

    def center(self):
        ws = self.root.winfo_screenwidth()
        hs = self.root.winfo_screenheight()
        x = int((ws / 2) - (self.w / 2))
        y = int((hs / 2) - (self.h / 2))
        self.root.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))
    """
    函数说明:loop等待用户事件
    """

    def loop(self):
        # 禁止修改窗口大小
        self.root.resizable(False, False)
        # 窗口居中
        self.center()
        self.root.mainloop()

最后在主函数运行就好了

if __name__ == '__main__':
    app = APP()  # 实例化APP对象
    app.loop()  # loop等待用户事件

4. 注意事项

此工具仅用于交流学习,请勿用于任何商业用途!!!

此工具仅用于交流学习,请勿用于任何商业用途!!!

此工具仅用于交流学习,请勿用于任何商业用途!!!


完整源码

# Created at UESTC
# Author: Vector Kun
# Time: 2023/1/30 11:26

# url解析
from urllib import parse
import tkinter.messagebox as msgbox
import tkinter as tk
import webbrowser
import re


class APP:
    def __init__(self, width=1280, height=720):
        self.w = width
        self.h = height
        self.title = 'Vector的VIP解析助手'
        self.root = tk.Tk(className=self.title)
        # 定义button控件上的文字
        self.url = tk.StringVar()

        # 定义选择哪个播放源
        self.v = tk.IntVar()

        # 默认为1
        self.v.set(1)

        # Frame空间
        frame_1 = tk.Frame(self.root)
        frame_2 = tk.Frame(self.root)
        frame_3 = tk.Frame(self.root)

        # Menu菜单
        menu = tk.Menu(self.root)
        self.root.config(menu=menu)
        moviemenu = tk.Menu(menu, tearoff=0)
        menu.add_cascade(label='友情链接', menu=moviemenu)

        # 各大视频网站
        moviemenu.add_command(label='腾讯视频', command=lambda: webbrowser.open('http://v.qq.com/'))
        moviemenu.add_command(label='搜狐视频', command=lambda: webbrowser.open('http://tv.sohu.com/'))
        moviemenu.add_command(label='芒果TV', command=lambda: webbrowser.open('http://www.mgtv.com/'))
        moviemenu.add_command(label='爱奇艺', command=lambda: webbrowser.open('http://www.iqiyi.com/'))
        moviemenu.add_command(label='PPTV', command=lambda: webbrowser.open('http://www.bilibili.com/'))
        moviemenu.add_command(label='优酷', command=lambda: webbrowser.open('http://www.youku.com/'))
        moviemenu.add_command(label='乐视', command=lambda: webbrowser.open('http://www.le.com/'))
        moviemenu.add_command(label='土豆', command=lambda: webbrowser.open('http://www.tudou.com/'))
        moviemenu.add_command(label='A站', command=lambda: webbrowser.open('http://www.acfun.tv/'))
        moviemenu.add_command(label='B站', command=lambda: webbrowser.open('http://www.bilibili.com/'))

        # 控件内容设置
        group = tk.Label(frame_1, text='请选择一个视频解析方式:', padx=10, pady=10)
        tb1 = tk.Radiobutton(frame_1, text='纯净/B站', variable=self.v, value=1, width=10, height=3)
        tb2 = tk.Radiobutton(frame_1, text='综合/B站', variable=self.v, value=2, width=10, height=3)
        tb3 = tk.Radiobutton(frame_1, text='爱豆', variable=self.v, value=3, width=10, height=3)
        tb4 = tk.Radiobutton(frame_1, text='虾米', variable=self.v, value=4, width=10, height=3)
        tb5 = tk.Radiobutton(frame_1, text='OK解析', variable=self.v, value=5, width=10, height=3)
        tb6 = tk.Radiobutton(frame_1, text='诺讯', variable=self.v, value=6, width=10, height=3)
        tb7 = tk.Radiobutton(frame_1, text='夜幕', variable=self.v, value=7, width=10, height=3)
        tb8 = tk.Radiobutton(frame_1, text='M3U8.TV', variable=self.v, value=8, width=10, height=3)
        tb9 = tk.Radiobutton(frame_1, text='人人迷', variable=self.v, value=9, width=10, height=3)
        tb10 = tk.Radiobutton(frame_1, text='全民', variable=self.v, value=10, width=10, height=3)
        tb11 = tk.Radiobutton(frame_1, text='七哥', variable=self.v, value=11, width=10, height=3)
        tb12 = tk.Radiobutton(frame_1, text='冰豆', variable=self.v, value=12, width=10, height=3)
        tb13 = tk.Radiobutton(frame_1, text='迪奥', variable=self.v, value=13, width=10, height=3)
        tb14 = tk.Radiobutton(frame_1, text='CK', variable=self.v, value=14, width=10, height=3)
        tb15 = tk.Radiobutton(frame_1, text='ckmov', variable=self.v, value=15, width=10, height=3)
        tb16 = tk.Radiobutton(frame_1, text='playerjy/B站', variable=self.v, value=16, width=10, height=3)
        tb17 = tk.Radiobutton(frame_1, text='ccyjjd', variable=self.v, value=17, width=10, height=3)
        tb18 = tk.Radiobutton(frame_1, text='诺诺', variable=self.v, value=18, width=10, height=3)
        tb19 = tk.Radiobutton(frame_1, text='H8', variable=self.v, value=19, width=10, height=3)
        tb20 = tk.Radiobutton(frame_1, text='BL', variable=self.v, value=20, width=10, height=3)
        tb21 = tk.Radiobutton(frame_1, text='解析la', variable=self.v, value=21, width=10, height=3)
        tb22 = tk.Radiobutton(frame_1, text='MUTV', variable=self.v, value=22, width=10, height=3)
        tb23 = tk.Radiobutton(frame_1, text='MAO', variable=self.v, value=23, width=10, height=3)
        tb24 = tk.Radiobutton(frame_1, text='无名', variable=self.v, value=24, width=10, height=3)
        tb25 = tk.Radiobutton(frame_1, text='盘古', variable=self.v, value=25, width=10, height=3)
        tb26 = tk.Radiobutton(frame_1, text='盖世', variable=self.v, value=26, width=10, height=3)
        tb27 = tk.Radiobutton(frame_1, text='0523', variable=self.v, value=27, width=10, height=3)
        tb28 = tk.Radiobutton(frame_1, text='17云', variable=self.v, value=28, width=10, height=3)
        tb29 = tk.Radiobutton(frame_1, text='4K', variable=self.v, value=29, width=10, height=3)
        tb30 = tk.Radiobutton(frame_1, text='8090', variable=self.v, value=30, width=10, height=3)
        tb31 = tk.Radiobutton(frame_1, text='听乐', variable=self.v, value=31, width=10, height=3)
        tb32 = tk.Radiobutton(frame_1, text='180', variable=self.v, value=32, width=10, height=3)
        label1 = tk.Label(frame_2, text="请输入视频链接:")
        entry = tk.Entry(frame_2, textvariable=self.url, highlightcolor='Fuchsia', highlightthickness=1, width=35)
        label2 = tk.Label(frame_2, text=" ")
        play = tk.Button(frame_2, text="播放", font=('楷体', 12), fg='Purple', width=2, height=1, command=self.video_play)
        label3 = tk.Label(frame_2, text=" ")
        label_explain = tk.Label(frame_3, fg='red', font=('楷体', 18), text='\n注意:\nCSDN博主Vec_Kun版权所有\n此工具仅用于交流学习\n请勿用于任何商业用途!')
        label_warning = tk.Label(frame_3, fg='black', font=('楷体', 16), text='\n\n')

        # 控件布局
        frame_1.pack()
        frame_2.pack()
        frame_3.pack()
        group.grid(row=0, column=0)
        tb1.grid(row=0, column=1)
        tb2.grid(row=0, column=2)
        tb3.grid(row=0, column=3)
        tb4.grid(row=0, column=4)
        tb5.grid(row=1, column=1)
        tb6.grid(row=1, column=2)
        tb7.grid(row=1, column=3)
        tb8.grid(row=1, column=4)
        tb9.grid(row=2, column=1)
        tb10.grid(row=2, column=2)
        tb11.grid(row=2, column=3)
        tb12.grid(row=2, column=4)
        tb13.grid(row=3, column=1)
        tb14.grid(row=3, column=2)
        tb15.grid(row=3, column=3)
        tb16.grid(row=3, column=4)
        tb17.grid(row=4, column=1)
        tb18.grid(row=4, column=2)
        tb19.grid(row=4, column=3)
        tb20.grid(row=4, column=4)
        tb21.grid(row=5, column=1)
        tb22.grid(row=5, column=2)
        tb23.grid(row=5, column=3)
        tb24.grid(row=5, column=4)
        tb25.grid(row=6, column=1)
        tb26.grid(row=6, column=2)
        tb27.grid(row=6, column=3)
        tb28.grid(row=6, column=4)
        tb29.grid(row=7, column=1)
        tb30.grid(row=7, column=2)
        tb31.grid(row=7, column=3)
        tb32.grid(row=7, column=4)
        label1.grid(row=0, column=0)
        entry.grid(row=0, column=1)
        label2.grid(row=0, column=2)
        play.grid(row=0, column=3, ipadx=10, ipady=10)
        label3.grid(row=0, column=4)
        label_explain.grid(row=1, column=0)
        label_warning.grid(row=2, column=0)

    """
    函数说明:视频播放
    """

    def video_play(self):
        # 视频解析网站地址
        # port_1 = 'https://jx.618g.com/?url='
        port_1 = 'https://im1907.top/?jx='
        port_2 = 'https://jx.jsonplayer.com/player/?url='
        port_3 = 'https://jx.aidouer.net/?url='
        port_4 = 'https://jx.xmflv.com/?url='
        port_5 = 'https://okjx.cc/?url='
        port_6 = 'https://www.nxflv.com/?url='
        port_7 = 'https://www.yemu.xyz/?url='
        port_8 = 'https://jx.m3u8.tv/jiexi/?url='
        port_9 = 'https://jx.blbo.cc:4433/?url='
        port_10 = 'https://api.qianqi.net/vip/?url='
        port_11 = 'https://jx.nnxv.cn/tv.php?url='
        port_12 = 'https://bd.jx.cn/?url='
        port_13 = 'https://123.1dior.cn/?url='
        port_14 = 'https://www.ckplayer.vip/jiexi/?url='
        port_15 = 'https://www.ckmov.vip/api.php?url='
        port_16 = 'https://jx.playerjy.com/?url='
        port_17 = 'https://ckmov.ccyjjd.com/ckmov/?url='
        port_18 = 'https://www.ckmov.com/?url='
        port_19 = 'https://www.h8jx.com/jiexi.php?url='
        port_20 = 'https://svip.bljiex.cc/?v='
        port_21 = 'https://api.jiexi.la/?url='
        port_22 = 'https://jiexi.janan.net/jiexi/?url='
        port_23 = 'https://www.mtosz.com/erzi.php?url='
        port_24 = 'https://www.administratorw.com/video.php?url='
        port_25 = 'https://www.pangujiexi.cc/jiexi.php?url='
        port_26 = 'https://www.gai4.com/?url='
        port_27 = 'https://go.yh0523.cn/y.cy?url='
        port_28 = 'https://www.1717yun.com/jx/ty.php?url='
        port_29 = 'https://jx.4kdv.com/?url='
        port_30 = 'https://www.8090g.cn/?url='
        port_31 = 'https://jx.dj6u.com/?url='
        port_32 = 'https://jx.000180.top/jx/?url='

        # 正则表达是判定是否为合法链接
        if re.match(r'^https?:/{2}\w.+$', self.url.get()):
            port_num = self.v.get()
            port_url_referer = locals()[f'port_{port_num}']
            # 视频链接获取
            ip = self.url.get()
            # 视频链接加密
            ip = parse.quote_plus(ip)
            # 浏览器打开
            webbrowser.open(port_url_referer + self.url.get())

        else:
            msgbox.showerror(title='错误', message='视频链接地址无效,请重新输入!')

    """
    函数说明:tkinter窗口居中
    """

    def center(self):
        ws = self.root.winfo_screenwidth()
        hs = self.root.winfo_screenheight()
        x = int((ws / 2) - (self.w / 2))
        y = int((hs / 2) - (self.h / 2))
        self.root.geometry('{}x{}+{}+{}'.format(self.w, self.h, x, y))

    """
    函数说明:loop等待用户事件
    """

    def loop(self):
        # 禁止修改窗口大小
        self.root.resizable(False, False)
        # 窗口居中
        self.center()
        self.root.mainloop()


if __name__ == '__main__':
    app = APP()  # 实例化APP对象
    app.loop()  # loop等待用户事件

运行效果


总结

本节实现了输入任意视频链接,在用户UI窗口选择解析接口,点击解析按钮自动跳转到系统默认浏览器进行播放的功能,切记不要用于商业活动!本教程仅用于个人学习交流用途!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/388147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud:Nacos的安装(Windows,Linux)

目录 一、认识和安装Nacos 1、下载 2、点击进入Github,进入Releases 3、点击Tags 4、解压(Windows版) 5、端口配置 6、启动 7、访问 二、Linux系统安装Nacos 1、打开虚拟机,使用xshell连接虚拟机,Nacos依赖于…

JVM内置锁synchronized关键字详解

目录 JVM内置锁synchronized关键字详解 设计同步器的意义 如何解决线程并发安全问题? synchronized原理详解 synchronized底层原理 synchronized在jdk1.6前后的变化【重点】 jdk小于1.6时 jdk>1.6时 轻量级锁何时升级为重量级锁??…

【ROS学习笔记10】ROS中配置自定义Cpp头文件和导入自定义Python库

【ROS学习笔记10】ROS中配置自定义Cpp头文件和导入自定义Python库 文章目录【ROS学习笔记10】ROS中配置自定义Cpp头文件和导入自定义Python库一、ROS中的头文件和源文件1.1 自定义头文件调用1.2 自定义源文件调用二、Python模块的导入Reference写在前面,本系列笔记参…

springBoot 启动指定配置文件环境多种方案

springBoot 启动指定配置文件环境理论上是有多种方案的,一般都是结合我们的实际业务选择不同的方案,比如,有pom.xml文件指定、maven命令行指定、配置文件指定、启动jar包时指定等方案,今天我们一一分享一下,以供参考&a…

Java知识复习(十二)Docker

1、容器 一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和…

Redis学习(一):NoSQL概述

为什么要使用Nosql 现在是大数据时代,过大的数据一般的数据库无法进行分析处理了。 单机MySQL的年代 90年代,一个基本的网站访问量一般不会太大,单个数据库完全足够! 那个时候,更多的去使用静态网站,服务器…

TD算法超详细解释,一篇文章看透彻!

【已解决】TD算法超详细解释和实现(Sarsa,n-step Sarsa,Q-learning)一篇文章看透彻! 郑重声明:本系列内容来源 赵世钰(Shiyu Zhao)教授的强化学习数学原理系列,本推文出于非商业目的分享个人学习…

DockerFile创建及案例

DockerFile dockerfile是用来构建docker镜像的文件,命令脚本参数脚本! 构建步骤 编写一个dockerfile文件docker build 构建成为一个对象docker run 运行镜像docker push 发布镜像(DockerHub、阿里云镜像仓库) 去官网Docker-Hub…

51单片机——串口通信,小白讲解,相互学习

通讯的基本概念 51单片机不仅可以实现串口通信,还可以通过IO口模拟实现多种其他通信,比如 SPI,IIC等,学习这些通信前,我们很有必要了解下通信的基本概念。通信的方式可以分为多种,按照数据传输方式可分为串…

MySQL——复合查询+表的内外连接

文章目录复合查询基本查询多表查询自连接子查询1、单行子查询2、多行子查询3、多列子查询4、在from子句中使用子查询😊5、合并查询结果unionunion all表的内连和外连内连接外连接左外连接右外连接复合查询 接下来我们就要进行的是多张表里进行查询操作,…

大数据相关面试题

linux 常见linux高级命令? top、iotopnetstatdf -hjmap -heaptarrpmps -efshell 用过的shell工具? awk Awk 命令详解 - 简书 awk是行处理器: 相比较屏幕处理的优点,在处理庞大文件时不会出现内存溢出或是处理缓慢的问题,通常用来…

MySQL中的Join连接查询

目录JoinJoin的分类笛卡尔积笛卡尔积出现的原因为什么不推荐有笛卡尔积出现那应该怎么做多表连接Join的使用小表驱动大表小表驱动大表是什么小表驱动大表的好处如何区分哪一个是驱动表和被驱动表Join原理及算法NLJ算法BNLJ算法总结:如何写入高性能的连接查询为什么M…

一阶低通滤波介绍及simulink模型

一阶低通滤波 背景介绍 低通滤波是一种过滤方式,规定低频信号能正常通过,而超过设定临界值的高频信号则被阻隔、减弱。低通滤波可以简单的认为:设定一个频率点,当信号频率高于这个频率时不能通过,在数字信号中&#…

对象图实例解析

总目录链接>> AutoSAR入门和实战系列总目录 文章目录更快、更好、更轻松地学习 UML对象图的目的对象图一览类到对象图示例 - 订单系统基本对象图符号和符号类图与对象图对象图 - 通过示例学习对象图示例 I - 公司结构对象图示例 II - POS对象图示例 III - Writer对象结构…

Java中的Comparator 与 Comparable详解

Comparator VS Comparable1. Comparator1.1 对一维数组进行排序1.2 对二维数组进行排序1.3 对对象数组进行排序2. Comparable3. 二者区别1. Comparator 通过源码发现Comparator是一个接口。 根据compare方法中的注释可以发现方法返回三种类型的值,正数、零、负数&a…

4.1 路由器(华硕 官改/梅林 华为 小米 路由) 使用花生壳 实现远程管理

最近添置了一台华硕的八爪鱼GT AC5300,到手后刷了官改,而里面软件中就提供了花生壳程序,想到花生壳为每个用户提供了两条免费映射(带宽为1mbs,流量为1g/月),所以就打算利用来做一个远程访问。具…

开发手册——一、编程规约_7.控制语句

这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】在一个 switch 块内,每个 case 要么通过 break / return 等来终止,要么注释说明程序将继续执行到哪…

CSGO服务器配置全贴纸插件方法教程

CSGO服务器配置全贴纸插件方法教程 关于插件的警告 一定要了解V社对于CSGO社区服务器的规定,全皮肤插件/全手套插件等,在设置了GSLT的情况下,是有可能被封禁GSLT账号的(所以慎用) 配置好服务器之后呢,想安…

uniapp+uView2.0实现自定义动态tabbar

1.需求说明 2.实现原理说明 3.实现过程 3.1集成uView2.0 3.2 自定义tabbar 3.3 vuex定义tabbar共享信息 3.4 tabbar显示个数控制 1.需求说明 要求不同时间显示不同的tabbar.点击不同的tabbar跳转到不同的页面,能随时…

【2021.9.7】记一次exe手动添加shellcode

【2021.9.7】记一次exe手动添加shellcode 文章目录【2021.9.7】记一次exe手动添加shellcode0.大致思路1.获取MessageBox的真实地址VA2.通过OD在代码段添加shellcode3.dump出数据,设置程序OEP4.测试dump出来的exe5.方法总结测试的exe和添加了shellcode的exe:链接&…