由于要在web进行rtsp流的直播,在网上找到vlc插件可以实现(目前只有IE支持activex,所以只能用IE浏览器,我用的是IE11,操作系统为英文版win7,64位)。果断下载安装,查找vlc的开发资料。程序写好后发现时延很严重,项目要求时延小于300毫秒,通过修改network-caching参数时延可以接受,是否真的小于300毫秒未测试。在开发过程中还遇到了会自动开新窗口显示视频的问题(排查后发现是因为没有vlc句柄,视频找不到显示的地方,所以自己弹窗显示),通过优化代码得到解决。现将代码粘贴如下:
<html>
<head>
<META http-equiv="Content-Language" content="zh-cn">
<META http-equiv="Content-Type" content="text/html; charset=utf-8">
<META http-equiv="Pragma" content="no-cache">
<META content="MSHTML 6.00.2800.1106" name="GENERATOR">
<link href="/assets/css/bootstrap.css" rel="stylesheet">
<link href="/assets/css/theme.css" rel="stylesheet">
<link href="/assets/css/font-awesome.min.css" rel="stylesheet">
<script language="javascript" type="text/javascript" src="/js/base64.min.js" ></script>
<script language="javascript" type="text/javascript" src="/js/Common.js" ></script>
<script language="javascript" type="text/javascript" src="/js/PublicModule.js" ></script>
<script type="text/javascript" charset="UTF-8">
function init()
{
if(!initStatus())
return;
var vlc=document.getElementById("vlc");
var options = [":network-caching=300"];
var rtspSource = "rtsp://"+window.location.hostname+"/main";
var itemId = vlc.playlist.add(rtspSource,"",options);
if( itemId != -1 )
{
// play MRL
vlc.playlist.playItem(itemId);
}
else
{
alert("cannot play at the moment !");
}
}
function initStatus()
{
if (!isWindowsPlatform())
return true;
var obj;
var state=false;
// 判断VLC控件
try {
obj = new ActiveXObject("VideoLAN.VlCPlugin.2");
//var xx = typeof(obj);
if (typeof(obj) != 'undefined')
state = true;
delete obj;
obj = null;
}
catch (e) {obj = null;}
// end 判断VLC控件
if(!state)
{
document.getElementById("statusctl").style.display = "block";
document.getElementById("player").style.display = "none";
}
return state;
}
function unload(){
obj = document.getElementById("vlc");
if(obj != null){
obj.playlist.stop();
obj.playlist.clear();
delete obj;
obj = null;
}
}
</script>
</head>
<body onUnload="unload();" style="padding:1px;">
<div id="player" style="display:block;">
<object type='application/x-vlc-plugin' id='vlc'classid='clsid:9BE31822-FDAD-461B-AD51-BE1D1C159921' codebase="/pub/videolan/vlc/latest/win32/axvlc.cab" width="1280" height="800">
<param name='mrl' value='' />
<param name='volume' value='50' />
<param name='autoplay' value='true' />
<param name='loop' value='false' />
<param name='fullscreen' value='false' />
<param name="ShowDisplay" value="True" />
<param name="toolbar" value="true"/>
</object>
</div>
<br><br>
<div id="statusctl" style="text-align:center;display:none;">
<a href='/download/vlc-2.2.4-win32.exe'>下载插件</a>
</div>
<!--
<input type="button" value="停止" οnclick="stop();" id="control_button">
-->
<script type="text/javascript" src="/assets/js/jquery.min.js"></script>
<script>
$(document).ready(function(){
init();
})
</script>
</body>
</html>
下面说下自测过程中遇到的问题:
1、播放10多分钟后vlc和IE会长时间没反应,只能关闭进程结束。
解决方法:当时使用的是vlc3.0.8版本,换成3.0.10问题依然;改成低版本后解决,实测2.2.1和2.2.4都可以,其它版本未测试。
2、在我自己的电脑上程序运行正常,在别人的电脑上安装vlc后发现控件出不来。
详细情况:安装vlc后IE显示已加载并启用了控件(IE对运行activex的相关设置网上有很多,我就不赘述),但程序判断后显示控件未安装。
解决方法:英文版的64位win7应该安装64位的vlc;中文版的64位win7应该安装32位的vlc。
附:vlc各版本下载链接.tw/vlc/vlc/