最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 客户端RTSP视频播放实现方案

    正文概述 掘金(pilipala)   2020-12-29   1289

    vue打包成桌面应用实现rtsp流视频播放的方式过程

    1.安装相关依赖

    • 打包桌面程序的依赖

    npm install electron electron-packager --save-dev

    • mpv.js插件, 基于react框架下开发的源码,开发环境需要安装react依赖
    npm install mpv.js --save
    npm install react react-dom --save-dev
    

    由于mpv.js对应用程序构建会出错不采用安装依赖去使用, 只能运行在开发环境

    2.编写打包程序代码

    • 运行的index.js文件, 其中mpv.js源码可以摘出来
    const electron = require('electron')
    const path = require('path')
    const app = electron.app
    
    /** mpv.js源码开始 */
    const PLUGIN_MIME_TYPE = "application/x-mpvjs";
    
    function containsNonASCII(str) {
        for (let i = 0; i < str.length; i++) {
          if (str.charCodeAt(i) > 255) {
            return true;
          }
        }
        return false;
    }
    
    function getPluginEntry(pluginDir, pluginName = "mpvjs.node") {
        const fullPluginPath = path.join(pluginDir, pluginName);
        let pluginPath = path.relative(process.cwd(), fullPluginPath);
        if (path.dirname(pluginPath) === ".") {
          if (process.platform === "linux") {
            pluginPath = `.${path.sep}${pluginPath}`;
          }
        } else {
          if (process.platform === "win32") {
            pluginPath = fullPluginPath;
          }
        }
        if (containsNonASCII(pluginPath)) {
          if (containsNonASCII(fullPluginPath)) {
            throw new Error("Non-ASCII plugin path is not supported");
          } else {
            pluginPath = fullPluginPath;
          }
        }
        return `${pluginPath};${PLUGIN_MIME_TYPE}`;
    }
    /** mpv.js源码结束 */
    
    const pluginDir = path.join(__dirname, "Release");
    if (process.platform !== "linux") {process.chdir(pluginDir);}
    app.commandLine.appendSwitch("no-sandbox");
    app.commandLine.appendSwitch("ignore-gpu-blacklist");
    app.commandLine.appendSwitch("register-pepper-plugins", getPluginEntry(pluginDir));
    
    
    const BrowserWindow = electron.BrowserWindow
    const globalShortcut = electron.globalShortcut //快捷键
    let mainWindow
    const Menu = electron.Menu
    
    function createWindow () {
        Menu.setApplicationMenu(null)
    
        mainWindow = new BrowserWindow({
            width: 1280,
            height: 720,
            webPreferences: {
                plugins: true,
                preload: path.join(__dirname, 'preload.js')
            }
        })
    
        mainWindow.loadFile('./example/index.html')
    
        mainWindow.on('closed', function () {
            mainWindow = null
        })
    
        globalShortcut.register('CommandOrControl+Shift+L', () => {
            let focusWin = BrowserWindow.getFocusedWindow()
            focusWin && focusWin.toggleDevTools()
        })
    }
    
    app.on('ready', createWindow)
    
    app.on('window-all-closed', function () {
        if (process.platform !== 'darwin') app.quit()
    })
    
    app.on('activate', function () {
        if (mainWindow === null) createWindow()
    })
    
    • preload.js文件
    window.addEventListener('DOMContentLoaded', () => {
        const replaceText = (selector, text) => {
          const element = document.getElementById(selector)
          if (element) element.innerText = text
        }
    
        for (const type of ['chrome', 'node', 'electron']) {
          replaceText(`${type}-version`, process.versions[type])
        }
    })
    

    3.页面代码

    • js调用方式
    var video1 = "demo1.mp4";
    var video2 = "demo2.mp4";
    
    var embed = document.createElement("embed");
    embed.setAttribute("style", "");
    embed.style.width = "100%";
    embed.style.height = "100%";
    embed.style.position = "absolute";
    embed.style.top = 0;
    embed.style.left = 0;
    document.body.append(embed);
    
    var mpv = new MPV(
        embed,
        {
            hwdec: true,
            src: "",
            loop: false, // if set 'true'. !!! no events <pause,ended>.
            volume: 100, // 0 ~ 100
            autoplay: true,
        },
        function (e) {
            if (e.name == "ready") {
                console.info("mpv ready.");
                // ...
                mpv.loadfile(video1, true);
            } else if (e.name == "play") {
                console.info("play.");
            } else if (e.name == "duration") {
                console.info("duration is ", e.value);
            } else if (e.name == "progress") {
                // console.info("progress >>> ", e.value);
            } else if (e.name == "pause") {
                console.info("pause.");
            } else if (e.name == "ended") {
                console.info("ended.");
                mpv.loadfile(video2, true);
            }
        }
    );
    

    空壳客户端集成mpv功能

    • demo地址:https://github.com/hongqiang12/rtsp-electron-shell

    参考文献

    • mpv.js地址:https://github.com/Kagami/mpv.js

    起源地下载网 » 客户端RTSP视频播放实现方案

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    请问这个arm架构的如何弄
    回复(0)

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元