您的位置:首页 > Web前端 > HTML5

html5手机视频直播

2017-11-05 17:08 2086 查看
关键字:手机视频直播、视频直播、html5视频直播

本来想用WebRTC做视频直播,在用之前想了解下用比较原始的方式做出来是什么效果,所以就有了下面的程序。

实现原理:一个视频采集页面,一个视频播放页面,一个node.js服务端程序。视频采集页面采集视频数据通过WebSocket发送到服务端,服务端转发到视频播放页面。

视频采集页面在手机上需要Firefox浏览器才能支持,电脑上支持的浏览器比较多;视频播放页面在手机和电脑上浏览器都能用。

1、启动node.js服务端程序,node.js的安装网上比较多,此处不再阐述。



server.js代码:

var WebSocketServer = require('ws').Server;
//监听端口8888,客户端连接这个端口
var wss = new WebSocketServer({ port: 8888, verifyClient: socketVerify });

//连接验证,可以写验证语句
function socketVerify(info) {

console.log(info.req.url);
return true;
}

wss.on('connection', function (ws) {
//输出连接客户端信息
console.log("connection");
console.log(ws._ultron.ee._idleStart);

ws.on('message', function (data, flags) {
wss.clients.forEach(function each(client) {

client.send(data); //读取到的数据发送给所有客户端
//console.log(data);
});
});
ws.on('close', function (e) {
console.log('colse');
});
});


2、通过浏览器请求视频采集页面,手机请求需要Firefox浏览器。采集页面的实现方式是通过video标签采集和播放视频,将视频图像绘制到canvas标签上,再通过WebSocket将canvas数据发送到服务端;本示例可通过改变canvas大小以改变发送数据的大小,发送数据较大对网络和服务端的处理能力要求较高。如果哪位同学有好的数据压缩和解析方案请给予指导,谢谢!



视频采集页面代码:

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>视频采集</title>
<script type="text/javascript">
var ws;
var wid = 50;
document.addEventListener('DOMContentLoaded', function () {
WSConnect();
var video = document.querySelector('video');
var canvas = document.querySelector('canvas');
var context = canvas.getContext('2d');
var iFilter = 0;
var filters = [
'grayscale',
'sepia',
'blur',
'brightness',
'contrast',
'hue-rotate',
'hue-rotate2',
'hue-rotate3',
'saturate',
'invert',
'none'
];

navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
navigator.mozGetUserMedia || navigator.msGetUserMedia;
window.URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
if (navigator.getUserMedia) {

navigator.getUserMedia({ video: true, audio: false }, onSuccessCallback, onErrorCallback);
function onSuccessCallback(stream) {

video.src = window.URL.createObjectURL(stream) || stream;
video.play();
}

function onErrorCallback(e) {
var expl = 'An error occurred: [Reason: ' + e.code + ']';
console.error(expl);
alert(expl);
return;
}
} else {
document.querySelector('.container').style.visibility = 'hidden';
document.querySelector('.warning').style.visibility = 'visible';
return;
}

function getBlob(buffer, format) {
try {
return new Blob(buffer, { type: format });
} catch (e) {
var bb = new (window.BlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder);
buffer.forEach(function (buf) {
bb.append(buf);
});
return bb.getBlob(format);
}
}

function get_uuid() {
var uuid = '';
for (var i = 0; i < 32; i++) {
uuid += Math.floor(Math.random() * 16).toString(16);
}
return uuid;
}
var uuid = get_uuid();
function drawVideoAtCanvas(obj, context) {
window.setInterval(function () {
context.drawImage(obj, 0, 0, wid, wid);

var base64 = document.getElementById("icanvas").toDataURL('image/png', 1);

document.getElementById("slenth").value = base64.length;
var binary = atob(base64.split(',')[1]);
var len = binary.length;
var buf = new Uint8Array(len)

for (var i = 0; i < len; i++)
{
buf[i] = binary.charCodeAt(i);
}

var blob = getBlob([buf], 'image/png');
ws.send(blob);

}, 100);
}

video.addEventListener('play', function () {
drawVideoAtCanvas(this, context);

}, false);

}, false);

function WSConnect() {

ws = new WebSocket(document.getElementById('serverInput').value);

ws.onopen = function (evt) {

};

ws.onclose = function (evt) {

};

ws.onmessage = function (evt) {

};

ws.onerror = function (evt) {

alert('Error: ' + evt.data);
};
}

function SetSize(value) {
wid = value;
document.getElementById("icanvas").width = wid;
document.getElementById("icanvas").height = wid;
document.getElementById("ssize").value = wid;
}
</script>
</head>
<body>
<div id="input">
<!--此处设置视频转发服务地址-->
<input id="serverInput" type="text" value="ws://localhost:8888">
<input type="range" name="points" min="20" max="200" value="50" onchange="SetSize(this.value)" />
<label>发送大小:</label><input id="ssize" type="text" value="50">
<label>base64长度:</label><input id="slenth" type="text" value="50">

</div>
<div>
<div>
<video webkit-playsinline="true" x-webkit-airplay="true" playsinline="true" x5-video-player-type="h5" x5-video-player-fullscreen="true" width="100%" height="100%" preload="auto"></video>
</div>
<div>
<canvas id="icanvas" width="50" height="50"></canvas>
</div>
</div>
</body>

</html>


3、通过浏览器请求视频播放页面,手机和电脑上都可以通过大部分浏览器进行播放。实现原理是通过WebSocket连接视频转发地址,将接收到的数据显示到img标签上。



视频播放页面代码:

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>视频播放</title>
<script type="text/javascript">
var ws;

document.addEventListener('DOMContentLoaded', function () {
WSConnect();

}, false);
var icount = 0;
function WSConnect() {

ws = new WebSocket(document.getElementById('serverInput').value);

ws.onopen = function (evt) {

};

ws.onclose = function (evt) {

};

ws.onmessage = function (evt) {

document.getElementById("img1").src = window.URL.createObjectURL(evt.data);

};

ws.onerror = function (evt) {

alert('Error: ' + evt.data);
};
}

function SetSize(value)
{
document.getElementById("ssize").value = value;
var childs = document.getElementById("container").childNodes;
for (var i = childs.length - 1; i >= 0; i--) {
if(childs[i].tagName == 'IMG')
{
childs[i].width = value;
childs[i].height = value;
}
}
}

function ArrayBufferToBase64(buffer) {
var binary = '';
var bytes = new Uint8Array(buffer);
var len = bytes.byteLength;
for (var i = 0; i < len; i++) {
binary += String.fromCharCode(bytes[i]);
}
return window.btoa(binary);
}

</script>
</head>
<body>

<div id="input">
<!--此处设置视频转发服务地址-->
<input id="serverInput" type="text" value="ws://localhost:8888">
<input type="range" name="points" min="20" max="500" value="50" onchange="SetSize(this.value)" />
<label>图像大小:</label><input id="ssize" type="text" value="50">
</div>

<div id="container">
<img id="img1" />
</div>
</body>

</html>


示例源码下载地址:http://download.csdn.net/download/welliu/10104878

提供了多客户端的支持页面和服务端程序:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息