最近做一个前端的项目,项目需要引用VLC浏览器插件,javascript在IE、Firefox等浏览器上都没有问题,唯独在Chrome(谷歌)浏览器中插件不能被会支持。
不断更换Chrome版本后发现了问题。只有41版本以前才支持VLC插件。后来查阅资料发现,这是NPAPI和PPAPI的问题。
简单的说,NPAPI(Netscape Plugin API)插件接口最早是专为Netscape浏览器开发的,后来成为其它浏览器共同支持的插件标准、像平时看到的什么阿里旺旺、百度云下载的那种悬浮窗也是根据NPAPI开发的。相对于NPAPI,PPAPI就是Chrome要支持的新的标准。
为什么要换API?他们是这么说的:(NPAPI)存在性能、挂起、复杂性和安全等方面的问题,另外不支持移动设备也是淘汰它的主要原因。
另一个坏消息:
Mozilla已经计划从今年12月起就停止对NPAPI插件的支持。Mozilla产品管理总监Chad Weiner说,一个强大而开放的Web应该不需要任何特殊用途的插件就能在任何地方运行。那就意味着在2015年12月之后,火狐等浏览器也不能支持NPAPI插件了。当然目前还有什么加入白名单之类的办法可以勉强使用。
下面说一下,chrome浏览器支持VLC的过程(其他NPAPI插件类似):
一、查看浏览器版本
浏览器“帮助和简介”->“关于”中查看。
二、根据不同版本按下面步骤操作
41以前版本的Chrome:
直接在地址栏chrome://plugins/找到相应的插件,勾上“总是允许”重启浏览器即可。
42-45版本的Chrome:
地址栏输入:chrome://flags/,如下图,点击“启用”NPAPI插件。
然后在地址栏输入:chrome://plugins/找到相应的插件,勾上“总是允许”重启浏览器即可。
当然重启之后他任然会弹出一个幸灾乐祸的温馨提示:“此插件很快就不支持了”。但并不影响使用。
46-以后版本的Chrome:
换浏览器版本吧,在2015年9月之后,他们只支持PPAPI。
首先卸载Chrome,打开控制面板->卸载,
然后选中“同时删除您的浏览数据”(低版本的Chrome不能读取高版本的数据格式,所以一定要选中),点击 卸载,再安装低版本的Chrome即可。
三、当然也还有一个临时的办法,如果不卸载46版本,可以下载Chrome的绿色版。
下载地址:http://www.portablesoft.org/google-chrome-legacy-versions/,到文件夹后直接点击可执行文件。重复上述配置即可。
参考网址:
http://www.linuxidc.com/Linux/2015-04/116342.htm
http://www.cnbeta.com/articles/253889.htm
http://bbs.kafan.cn/thread-1631975-1-1.html
个人亲测经验
1本人使用的VLC版本 3.0.3-win64 详情可参考
2本人使用的chrome版本4.4地址 链接:https://pan.baidu.com/s/1XOoRBFrZl_Kfe_98RW2ayQ 密码:ql7i
转载地址:
3 chrome各版本下载地址https://www.chromedownloads.net/chrome64win/
设置阻止chrome自动更新https://jingyan.baidu.com/article/76a7e409f2137afc3b6e15be.html
如何将UDP转TCP
转载地址:
web 端播放rtsp 流,一般都是采用vlc插件,默认是用 UDP 协议播放,这就会存在丢包的可能性,导致界面会变花,要想不花,需要使用更可靠的TCP协议。关于这两种协议的区别,大家可以自行查资料。
Web VLC 文档设置
官方文档上面告诉我们设置的方式 ,大家可以查看文档 ,代码如下:
var options = new Array(":aspect-ratio=4:3", "--rtsp-tcp");
var id = vlc.playlist.add("rtsp://servername/item/to/play", "fancy name", options);
vlc.playlist.playItem(id);
但是我按文档的方式设置了,通过抓包的方式查看还是 UPD 协议,这是就有点崩溃了,一顿通过 Google 找解决方法,可是都没有用。
探索结果
最终的解决方法其实很简单 ,把参数 --rtsp-tcp
设置成 rtsp-tcp
var options = new Array("rtsp-tcp")
var id = vlc.playlist.add("rtsp://servername/item/to/play", "fancy name", options);
vlc.playlist.playItem(id);