九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
利用websoket+video+canvas實(shí)現(xiàn)簡(jiǎn)易的web視頻功能
今天就同事提出關(guān)于網(wǎng)頁(yè)視頻功能的實(shí)現(xiàn)問題,到家以后苦思冥想后決定根據(jù)自己的思路試驗(yàn)一下,果然簡(jiǎn)陋的視頻功能就出爐了,如下代碼如有勘誤、寫錯(cuò)的地方請(qǐng)指正,臨時(shí)工代碼也請(qǐng)各位看客見諒。
例子有很多不足,我是將image的base64l整個(gè)送到node然后派發(fā)給各個(gè)客戶端,數(shù)據(jù)量有點(diǎn)大,希望這方面有人能指點(diǎn)我一下謝謝。
準(zhǔn)備知識(shí)(注url不是官方的,是我寫例子是看的)
1、w3c媒體相關(guān)api知識(shí)(https://developer.mozilla.org/zh-CN/docs/WebRTC/navigator.getUserMedia)
2、 canvas
3、安裝nodejs及ws模塊
4、了解基本的websocket的機(jī)制以及相關(guān)api(http://ued.sina.com.cn/?p=900)
大概思路:
1、根據(jù)瀏覽器相關(guān)的api獲取媒體流,getUserMedia在各個(gè)瀏覽器api名字不一樣,還有那些版本支持可以找相關(guān)文檔
代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
html代碼:<video id="video"></video><br>   <br>    js代碼:;(function($) {
$.video =  function(s) {
var s = $.extend({
video: true,
audio: true,
goStream: goStream,
noStream: noStream,
callBack: null,
videoId: 'video'
}, s),
video = $('#' + s.videoId),
canvas = $('#' + s.canvasId),
getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
if(!getUserMedia) {
alert('不支持');
return false;
}
function noStream(err) {
if(err.PERMISSION_DENIED) {
alert('用戶拒絕了瀏覽器請(qǐng)求媒體的權(quán)限');
} else if(err.NOT_SUPPORTED_ERROR) {
alert('constraint中指定的媒體類型不被支持');
} else if(err.MANDATORY_UNSATISFIED_ERROR) {
alert('指定的媒體類型未接收到媒體流');
}
console.log(err);
}
function goStream(stream) {
video[0].src = URL.createObjectURL(stream);
if(typeof s.callBack == 'function') {
s.callBack(video[0]);
}
stream.oninactive = noStream;
}
getUserMedia.call(navigator, {video: s.video, audio: s.audio}, s.goStream, s.noStream);
}
})(jQuery);<br>     $(function() {      <br>        $.video({callBack: function(video){<br>          video.play();<br>        });<br>      });
經(jīng)過上一步驟基本上網(wǎng)頁(yè)上已經(jīng)呈現(xiàn)出來您視頻頭所捕獲的圖像了
2、 讓canvas繪制視頻頭捕捉的圖像
1
2
3
4
5
6
7
8
9
10
11
12
13
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
$.video({callBack: function(video) {
video.addEventListener('play', function(){
var $this = this;
setInterval(function() {
ctx.drawImage(video, 0, 0);
var image = canvas.toDataURL("image/png");<br>              //繪制到頁(yè)面去代碼略
}, 500);
},false);
video.play();<br>         }});
經(jīng)過上一步驟網(wǎng)頁(yè)就會(huì)看到一個(gè)視頻頭步驟的頭像,一個(gè)canvas動(dòng)態(tài)繪制的圖像
3、既然本地已經(jīng)沒有問題下,那么就讓其他人跟我一起視頻吧
在我最開始的時(shí)候我想著架php服務(wù)器,輪訓(xùn)的方式請(qǐng)求去推和拉下來一針一針的圖片,但是每次請(qǐng)求和服務(wù)器要處理下來開銷很大,所以替代的當(dāng)然是現(xiàn)在比較流行的websocket
當(dāng)然由于本人沒了解過websocket所以也不能說websocket對(duì)于這個(gè)例子有什么優(yōu)勢(shì)。我只是聽同事說這個(gè)比用笨重的服務(wù)器處理好,我就本著看看了解一下的態(tài)度,寫了下面幾行生硬的代碼。
記得你要有node,如果你不會(huì)node一定要看(http://www.nodebeginner.org/index-zh-cn.html
服務(wù)器端代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var http = require('http');
var app = http.createServer(function(req, res) {
}).listen(8888);
var WebSocketServer =require('ws').Server;
var wss = new WebSocketServer( { server : app });
wss.on('connection', function(ws) {
var clients = wss.clients, len = clients.length, i =0;
for(; i< len; i++) {
clients[i].send(JSON.stringify({'type':'system', 'msg': 'connection'}));
}
ws.on('message', function(data, flags) {
var clients = wss.clients, len = clients.length, i =0;
console.log(data);
for(; i< len; i++) {
clients[i].send(data);
}
});
ws.on('close', function(e) {
if(e == 10001) {
console.log('現(xiàn)有終端連接數(shù):' + wss.clients.length);
}
console.log('colse');
})
});
客戶端代碼:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
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() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
var a = webSocketFuc();
$.video({callBack: function(video) {
video.addEventListener('play', function(){
var $this = this;
setInterval(function() {
ctx.drawImage(video, 0, 0);
var image = canvas.toDataURL("image/png");
a.send(JSON.stringify({type: 'image', uuid: uuid, msg: image, }));
}, 500);
},false);
video.play();
}});
$(document).on('click','#send', function() {
var msg = $('#test').val();
a.send(JSON.stringify({'type': 'chat', msg: msg}));
})
})
function webSocketFuc() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
var wsServer = '
wss = new WebSocket(wsServer);
wss.binaryType = "arraybuffer";
wss.onopen = function() {
console.log('open');
}
wss.onclose = function() {
console.log('close');
}
/* 可以傳送json和字符串還有二進(jìn)制數(shù)據(jù) */
wss.onmessage = function(ev) {
//video.src = URL.createObjectURL(data);
var json_arr = JSON.parse(ev.data);
if(json_arr.type == 'image' ) {
if(json_arr.uuid != uuid) {
var image = new Image();
image.src = json_arr.msg;
image.onload = function() {
ctx.drawImage(image, 100, 83);
}
}
} else {
console.log(json_arr.msg);
}
}
wss.onerror = function(err) {
console.log(err);
}
return wss;
}
基本上告一段落。
下面是全部代碼:這里有一些我還沒做完和一些其他想法,微困就咱不整理了,我就粘出來污染一下大家的眼睛吧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
<!DOCTYPE html>
<head>
<title>視頻測(cè)試</title>
<meta charset="utf-8">
<script src="js/jquery.min.js"></script>
</head>
<body>
<div>該例子 在支持html的video標(biāo)簽的前提下,還要支持Navigator.getUserMedia(標(biāo)準(zhǔn),各個(gè)瀏覽器接口不同)前提下</div>
<a href="
<a href="
<br/>
<video id="video"></video>
<canvas  id="canvas" width="500px" height="500px"></canvas>
<input id="test"/>
<button id="send">發(fā)送</button>
<script>
var title = 'memoryza';
;(function($) {
$.video =  function(s) {
var s = $.extend({
video: true,
audio: true,
goStream: goStream,
noStream: noStream,
callBack: null,
videoId: 'video'
}, s),
video = $('#' + s.videoId),
canvas = $('#' + s.canvasId),
getUserMedia = (navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia);
if(!getUserMedia) {
alert('不支持');
return false;
}
function noStream(err) {
if(err.PERMISSION_DENIED) {
alert('用戶拒絕了瀏覽器請(qǐng)求媒體的權(quán)限');
} else if(err.NOT_SUPPORTED_ERROR) {
alert('constraint中指定的媒體類型不被支持');
} else if(err.MANDATORY_UNSATISFIED_ERROR) {
alert('指定的媒體類型未接收到媒體流');
}
console.log(err);
}
function goStream(stream) {
video[0].src = URL.createObjectURL(stream);
if(typeof s.callBack == 'function') {
s.callBack(video[0]);
}
stream.oninactive = noStream;
}
getUserMedia.call(navigator, {video: s.video, audio: s.audio}, s.goStream, s.noStream);
}
})(jQuery);
</script>
<script>
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() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
var a = webSocketFuc();
$.video({callBack: function(video) {
video.addEventListener('play', function(){
var $this = this;
setInterval(function() {
ctx.drawImage(video, 0, 0);
var image = canvas.toDataURL("image/png");
a.send(JSON.stringify({type: 'image', uuid: uuid, msg: image, }));
}, 500);
},false);
video.play();
}});
$(document).on('click','#send', function() {
var msg = $('#test').val();
a.send(JSON.stringify({'type': 'chat', msg: msg}));
})
})
</script>
<script>
function webSocketFuc() {
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext("2d");
var wsServer = '
wss = new WebSocket(wsServer);
wss.binaryType = "arraybuffer";
wss.onopen = function() {
console.log('open');
}
wss.onclose = function() {
console.log('close');
}
/* 可以傳送json和字符串還有二進(jìn)制數(shù)據(jù) */
wss.onmessage = function(ev) {
//video.src = URL.createObjectURL(data);
var json_arr = JSON.parse(ev.data);
if(json_arr.type == 'image' ) {
if(json_arr.uuid != uuid) {
var image = new Image();
image.src = json_arr.msg;
image.onload = function() {
ctx.drawImage(image, 100, 83);
}
}
} else {
console.log(json_arr.msg);
}
}
wss.onerror = function(err) {
console.log(err);
}
return wss;
}
</script>
</body>
</html>
再改,文件傳輸協(xié)議、數(shù)據(jù)校驗(yàn)、二進(jìn)制處理
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
微信開發(fā)系列之四 - 將SAP C4C的數(shù)據(jù)更改通知發(fā)送到微信公眾號(hào)上
WebSocket 學(xué)習(xí)(三)
用HTML5進(jìn)行人臉識(shí)別
Capturing Audio & Video in HTML5
使用HTML5拍照
微信小程序藍(lán)牙API使用詳解,完整版
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服