在基于vuecli3 与electron的框架内部,实现rtmp流的播放,为什么要写这篇文章,因为的确实现起来踩了很多坑,并没有像web那样导入videoJS 就能完成的,闲话不说,上代码 :

第一个坑 :
需要用到的库
vue-video-player
videojs-flash
注意:上面这个两个库 一定要用npm安装。我试过,其他方式安装完成之后会这个错误:the flash tech is undefined ,如果你遇到这个错误,一定先npm uninstall vue-video-player ,再重新安装一次即可。

第二个坑
播放rtmp需要flash的支持,Electron的实现需要代码加载flash的dll文件来获得支持,Electron的app类中有个getPath 方法,执行以下代码能获取本机的flash文件路径 :
app.getPath(‘pepperFlashSystemPlugin’)
我的跑起来获取的地址是:C:WINDOWSsystem32MacromedFlashpepflashplayer64_32_0_0_414.dll
所以让electron支持flash代码 :

app.commandLine.appendSwitch('ppapi-flash-path', app.getPath('pepperFlashSystemPlugin'));

当然最好的方案是能够把dll文件直接打包到项目里面跟着项目一起走,通过在vue.config.js中添加以下代码实现

 pluginOptions: {electronBuilder: {builderOptions: {...win: {target: 'nsis',icon: './public/app.ico',extraResources: [{"from": "resources/","to": "./",}]}}}}

把dll文件copy到resources文件夹下(根目录与vue.config.js同级)然后修改文件加载路径:

let plugins = ‘’
if( process.arch == ‘x64’ ){
plugins =process.env.WEBPACK_DEV_SERVER_URL? path.join(__dirname,../resources/pepflashplayer64_32_0_0_238.dll) :path.join(__dirname,../pepflashplayer64_32_0_0_238.dll)
}else{
plugins =process.env.WEBPACK_DEV_SERVER_URL? path.join(__dirname,../resources/pepflashplayer32_29_0_0_238.dll) :path.join(__dirname,../pepflashplayer32_29_0_0_238.dll)
}
app.commandLine.appendSwitch(‘ppapi-flash-path’, plugins)
第三个坑
以上的东西搞完基本可以实现播放了,但是打包之后发现不可以,看现象 像是加载不出flash,解决方案就是在启动 Electron 主进程的时候,启动一个本地 express 服务器,配置一下静态文件地址,然后渲染进程通过这个服务器拿到页面,在然后就可以启动 flash 了。
上代码:

'use strict'import { app, BrowserWindow,ipcMain } from 'electron'import { createProtocol } from 'vue-cli-plugin-electron-builder/lib'
// import installExtension, { VUEJS_DEVTOOLS } from 'electron-devtools-installer'
const isDevelopment = process.env.NODE_ENV !== 'production'
// Keep a global reference of the window object, if you don't, the window will
// be closed automatically when the JavaScript object is garbage collected.
let winimport express from 'express'const net = require('net');function portInUse(port){return new Promise((resolve, reject)=>{let server = net.createServer().listen(port);server.on('listening',function(){server.close();resolve(port);});server.on('error',function(err){if(err.code == 'EADDRINUSE'){port++;reject(err);}});        });
}const tryUsePort = function(port,_portAvailableCallback){portInUse(port).then((port)=>{_portAvailableCallback(port);}).catch((err)=>{port++;tryUsePort(port,_portAvailableCallback);})
}tryUsePort(9080,function(port){console.log(port+" ====端口:"+port+"可用====\n");//解决flash本地file不安全问题if (process.env.NODE_ENV === "production") {let server = express();server.use(express.static(__dirname));server.listen(port);}const winURL =`http://localhost:${port}/index.html`console.log(winURL)const path = require('path')let plugins = ''if( process.arch == 'x64' ){plugins =process.env.WEBPACK_DEV_SERVER_URL? path.join(__dirname,`../resources/pepflashplayer64_32_0_0_238.dll`) :path.join(__dirname,`../pepflashplayer64_32_0_0_238.dll`)}else{// plugins =process.env.WEBPACK_DEV_SERVER_URL? path.join(__dirname,`../resources/pepflashplayer32_29_0_0_238.dll`) :path.join(__dirname,`../pepflashplayer32_29_0_0_238.dll`)plugins =app.getPath('pepperFlashSystemPlugin') }app.commandLine.appendSwitch('ppapi-flash-path', plugins)function createWindow() {// Create the browser window.win = new BrowserWindow({width: 1000,height: 580,webPreferences: {nodeIntegration: true,plugins: true,webSecurity: false //取消跨域},autoHideMenuBar:true,maximizable: false,resizable: false,frame: false,})if (process.env.WEBPACK_DEV_SERVER_URL) {win.loadURL(process.env.WEBPACK_DEV_SERVER_URL)
win.webContents.openDevTools()} else {createProtocol('app')win.loadURL(winURL)}win.webContents.openDevTools({ mode: 'detach' })win.on('closed', () => {win = null})}// Quit when all windows are closed.app.on('window-all-closed', () => {// On macOS it is common for applications and their menu bar// to stay active until the user quits explicitly with Cmd + Qif (process.platform !== 'darwin') {app.quit()}})app.on('activate', () => {// On macOS it's common to re-create a window in the app when the// dock icon is clicked and there are no other windows open.if (win === null) {createWindow()}})// This method will be called when Electron has finished// initialization and is ready to create browser windows.// Some APIs can only be used after this event occurs.app.on('ready', async () => {// if (isDevelopment && !process.env.IS_TEST) {//   // Install Vue Devtools//   try {//     await installExtension(VUEJS_DEVTOOLS)//   } catch (e) {//     console.error('Vue Devtools failed to install:', e.toString())//   }// }createWindow()})

以上就是部分代码能看清楚处理逻辑,

第四个坑
port占用,通过net对象 写一个递归加一点判断 获取当前可用端口,代码如上

第五个坑
到现在你觉得完事大吉了,但是只能开心一会会,在某些情况下还是会出现flash加载崩溃问题,这个时候你就要核对下你的flash 版本问题,我试过 30以上都不行29可以,推荐这个版本:pepflashplayer64_29_0_0_140.dll
pepflashplayer32_29_0_0_140.dll

备注:我的上述代码只是兼容了64位的电脑,如果需要兼容32位电脑自行加点判断即可
这里分享一下pepflashplayer64_29_0_0_140.dll下载链接
链接:https://pan.baidu.com/s/115mvGdpkxGro0yxp5eOhuw
提取码:1234

Electron播放 RTMP流 实现相关推荐

  1. 直播视频流 html,html 播放rtmp流视频

    最近项目上需要将视频在web上能够预览. 起初用到了VLC插件.但是该插件有个弊端让人很蛋疼.因为谷歌37版以后及其火狐等主流浏览器很多不支持.除此之外即使支持,也要另外下载一个vlc客户端安装好了. ...

  2. videojs集成--播放rtmp流

    要是播不了的话,可以看下这篇文章.http://blog.csdn.net/cmqwan/article/details/76059703 之前说到已经把流推送过来了,这时候就可以使用videojs来 ...

  3. PC端播放RTMP流(手机端无法播放)

    这是之前从网上搜到的资料保存下来,已经忘记是哪位大神的了 望见谅! 当前手机端不支持RTMP和RTSP 需要自己做播放器才可以进行支持 有效的RTMP直播源:(亲测可用!) rtmp://live.h ...

  4. 使用video.js播放rtmp流时报错FLASH: NetStream.Play.Failed

    1.选用X5版本video.js,因为X6及以上版本不支持rtmp的播放 2.指定video-js.swf文件路径 videojs.options.flash.swf = "lib/vide ...

  5. 直播视频流+html,前端页面播放 rtmp 流与 flv 格式视频文件

    技术 :angular/cli , html5 , typescript , scss ,es 6 ... 项目类型:直播视频与视频回放 使用到 插件 : videojs + ckplayer 遇到的 ...

  6. 如何在IE浏览器播放RTSP或RTMP流

    好多开发者一直苦恼于如何在IE浏览器环境下,构建低延迟的RTSP或RTMP播放,对于RTSP流来说,好多公司通常的做法是把RTSP转RTMP,然后分发到RTMP服务器,然后服务器转http-flv出来 ...

  7. h5 rtmp推荐控件_H5播放Rtmp之videojs播放

    一.简介 我们看到了HLS播放视频实时性非常差,好的在6-7s,差点的就要10-12s了,也就是人走了,估计视频上还能看到,这对观感效果造成了很大的影响!但是好处就是它是基于http协议文件下载的,所 ...

  8. Android 直播RTMP流

    原文链接 : How To Stream RTMP live in Android 原文作者 : Mohit Gupt 译文出自 : 开发技术前线 www.devtf.cn 译者 : ayyb1988 ...

  9. Vue项目中播放直播流

    直播流播放协议 视频直播服务支出输出RTMP.FLV.HLS三种协议 阿里云视频直播 RTMP(Real Time Message Protocol:实时消息传输协议)延时低(1s~3s),TCP长连 ...

  10. windows下live555+rtsp+ffmpeg媒体源,nginx+rtmp转发服务器,vlc播放rtmp媒体流

    1.下载live555+ffmpeg视频文件作为媒体源 将视频文件me-like-yuh.ts和ffmpeg推流脚本ffmpeg-rtsp2rtmp.bat放在mediaserver目录下 ffmpe ...

最新文章

  1. 【OpenCV学习】XML的读写
  2. struts2入门(搭建环境、配置、示例)
  3. Servlet的初始化参数
  4. webalizer日志分析软件的安装
  5. Redis进阶-Redis的惰性删除
  6. [ ArcGIS for Server 10.1 系列 ] - 分布式部署GIS Servers
  7. java工程mvn引用jar_maven 项目加载本地JAR
  8. 开发者如何区分 5G 和 LTE 技术?
  9. 洛谷P1962 斐波那契数列
  10. python解决单调栈问题
  11. 打印机的共享设置方法
  12. UVA11428 Cubes【数学+二分】
  13. 什么是C/S框架、什么是B/S框架
  14. 企业真实面试题总结(二)
  15. KMS激活工具原地址
  16. 使用IDEA创建Android项目
  17. maxdos网刻教程(傻瓜型)
  18. 改进初学者的PID-测量的比例编码
  19. 网络上行 下行速度测试软件,测试网络流畅度和上下行的方法
  20. Python numpy.column_stack函数方法的使用

热门文章

  1. 技术分享| 小程序实现音视频通话
  2. 关于3阶Volterra滤波器一些理解
  3. 给你一个全自动的屏幕适配方案(基于SW方案)!—— 解放你和UI的双手
  4. java大转盘抽奖概率算法_幸运大转盘抽奖 抽奖算法 程序实现逻辑
  5. 计算机网络——IPv4地址概述
  6. Spring关于AOP配置举例(注解方式)
  7. 电驴 链接不到服务器
  8. CNN与LeNet的应用-数字手写体识别
  9. 命令行压缩工具7z.exe使用详解
  10. Y7000p的自带锁屏壁纸位置