cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
! I8 S7 K# w& |( n
$serv=new swoole_websocket_server("0.0.0.0",9501);
$ s2 e% k$ B/ t3 j8 M) V6 }
$client=array();
7 i% g- t1 O, I* X0 J) ]
$serv->on("open",function($serv,$req)use($client){
' m- Q# I* U% m, J u
//echo 'connect'.$req->fd;
: E: D4 P% u% j/ t$ }, H, m
$client[]=$req;
+ w$ s' N% `8 i
//var_dump($client);
- R( w4 {5 s$ g! k$ K
$serv->push($req->fd,'aa');
/ i! Y, }% s- m3 Q4 H) x
});
X7 z f2 s' t a
8 P d5 G( U- P0 b. R/ B. x. M; B! S
$serv->on("message",function($serv,$frame)use ($client){
+ x4 A, m- ?0 J/ c- _7 v* f8 T0 ^
/*var_dump($frame->data);
: Q/ n6 d) f7 X2 C* M% p4 }
foreach($client as $key =>$val){
0 g3 G/ ~* A$ _% Q! G# J
$serv->push($val->fd,'aa');
3 t0 x/ p8 ]9 _" o j0 c
}*/
' h9 U. r: [8 ]0 V/ F
$client=$serv->connection_list();
0 ?0 i o- @& K$ r# I" r5 E- h8 `0 k
var_dump($client);
" v ^6 K! Y5 Z$ g! @& j
foreach($client as $key =>$val){
, f' ^7 R) W2 H& r% t8 }' O& {
if($val!=$frame->fd){
& P4 s' t+ e3 Q3 U$ e, \6 }! s
$serv->push($val,$frame->data);
7 g5 `% K+ r- y$ K, K
}
$ W4 N% l5 Y" K! v
}
( W# {' V& F' @2 w" J4 _4 y9 W
6 ~) w0 b! d! e6 O
});
" ?( ~8 F2 {4 k0 L+ d) F/ v
1 Z8 Y9 ~( r# j2 K
$serv->on("close",function($serv,$fd){
; t$ C4 Z% p. x7 L7 H% N
echo 'close';
; m0 g* l; F: `/ G; u# B5 X" ^3 ~
});
: }9 a& R2 D1 w2 P
4 Q3 e& C8 q4 B/ j# E
$serv->start();
' u1 w3 q, a% n. a
8 H- S: p# C! K$ v
复制代码
主播客户端
( O. i% g5 m, g N
<!doctype html>
* |$ T3 D" h4 q* o( r
<html>
$ [7 F( j9 k7 p0 Z
<head>
2 k0 u0 C4 d5 R! o
<meta charset="utf-8">
$ ~3 }! C: `" G0 T9 J( W k
- ^4 a# c1 B4 \$ i; b! j' v
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
# J9 S( ]9 V: b1 P' a0 |
<title>404</title>
( s3 k; v9 Z1 R
<style>
; w+ j6 z4 w) o) U
body{
0 f Q; x7 N% H
background-color:#444;
8 _; [4 y" J2 i- y
font-size:14px;
t2 P) O' p/ m) g5 }
}
+ h0 C; S& _3 a2 d: y5 s+ P
h3{
8 ^2 ^( { `( N ]# h4 U
font-size:60px;
4 ]1 K0 e4 T9 y- t& X; p' Z
color:#eee;
: N5 v( z4 v7 ?7 x3 t z1 O
text-align:center;
/ z1 t9 ]! Y# E7 G( ]8 B
padding-top:30px;
2 o1 U. V5 b' j4 q
font-weight:normal;
$ c1 @ N! o# m% H' V6 V) n
}
) O0 T" t: y, M7 }* M0 A
</style>
" z. X: J- c0 T! Y, n: d0 ^, @
</head>
! c. k3 ?2 O2 \1 B7 G" c# N
( K8 J4 g6 n6 r
<body>
+ L0 q5 a) {( b9 M1 M
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
6 I$ B( j% x9 |' u& y5 z% J
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
# w; Y' p0 N& W2 D
<canvas width="400" id="canvas2" height="400" ></canvas>
' }# X: i* O) Z6 \6 r6 ]; l% S4 G
<script>
/ g2 b- @: S* e% q c. P4 k
var video=document.getElementById('video');
& b; d- x! w$ r! z
var canvas=document.getElementById('canvas');
/ e2 L, R5 f0 |: K+ O
var canvas2=document.getElementById('canvas2');
* }/ \; U4 I$ `
var context=canvas.getContext('2d');
/ r( G8 E ?: Y1 k
var context2=canvas2.getContext('2d');
! I" [6 z' a; ]! \3 D6 E
function draw(){
# s0 |4 \8 E+ o" L" \; d
context.drawImage(video,0,0,400,400);
- G& L3 [8 D2 n" q1 M# E
ws.send(canvas.toDataURL('image/jpeg',0.8));
5 m% c+ V4 V3 d- I2 ]! N# m! R
setTimeout(draw,800);
( z, g: F A! {% T; l
}
* U+ |6 O R) n0 [) V7 w+ Q
! E; Y6 G. t+ m
//客户端跟服务端通讯
( L( y( F9 l2 j% |! t# [9 `0 i8 E! Z. U
if (window.MozWebSocket)
; B* }0 O, V" t* \" f
{
$ X- |6 J/ T8 s% A
ws = new MozWebSocket("ws://182.61.42.187:9501");
( ^0 f9 ?! S5 u* u; f9 S
} else
9 h, c' C# e% @9 z* u
{
* l: V( L8 h, d! c8 }) Q0 q. V. q$ I, ~
ws = new WebSocket("ws://182.61.42.187:9501");
5 k6 d& T: w6 I5 M$ h' a: K( \
}
8 q/ K5 G h5 Q2 H- r" \
$ B* \; L8 d8 x, B1 f5 L! `2 z
ws.onopen=function(event){
/ o1 X1 s5 w; B' \- a; z! Z3 u
alert('连接成功');
" U1 [. h2 [/ \$ y, ?# [
ws.binaryType = 'arraybuffer';
. T- p2 M( a7 v6 H2 D
draw();
$ w$ q* J' W; C9 t/ Y
}
3 a" l. E" W* Y6 i' m
ws.onmessage=function(event){
+ c8 Y+ }' g% f# M# }& j
//alert(event.data);
. I( n( u9 Z2 o
//ws.send(event.data+"client");
& U: `' \2 n' S/ u4 i2 i2 i1 X
qrCodeImg = new Image();
; S: D# ?9 }0 G9 |/ `
qrCodeImg.src = event.data;
8 N; ?) i6 U/ T* U- s y# X
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
0 C1 o" e+ m# _: G
9 g0 W, b: k$ Q. g; M5 Q
}
1 y* W" p1 D! q1 X0 G
ws.onclose=function(event){
' U6 l* F9 x& k: h) U. `9 R; ?5 h
alert('close');
5 L; Y/ y* |" ?! G% Y; P6 m
}
: g8 y) y$ ~/ C' d' p
ws.onerror=function(event){
( c- \! ]8 C1 ?( Q
alert('error');
$ f# e3 y8 ?+ A1 M
}
2 X6 m; @" T; ]; J; | `6 g
//video,标签模拟视频
# H+ |4 v5 Q" a4 H! W: i& u# b
, Z3 s8 m8 J! }& h: v
</script>
% y! D9 |- b" }2 |2 H3 K
</body>
7 e9 ^# Z4 K" C# E
</html>
5 s' N/ ^0 v- W. i6 Y
5 T* o8 i9 W) R8 X8 W2 M7 F
复制代码
客户端:
; e5 b: e! v& v
<html>
0 v% f$ f( y4 k
<head>
* D E, h3 y4 t5 ?8 c. H/ h4 @
<meta http-equiv="content-type" content="text/html; charset=utf-8">
" H' I3 t7 l% |/ z j7 k; H
<title>客户端直播页面</title>
0 L, u3 Y6 H T1 U. w: V5 [
</head>
" ?5 [( i* w+ |/ A% n
<body>
, j- V9 _7 S1 ~$ h; Y
<img id="receiver" style="width:720px;height:480px">
) |. O: H' @- p; m( j& Q
, o( P" z! n& }
<script type="text/javascript" charset="utf-8">
0 `/ L- _$ l. Q* W
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
* U. A4 H* S! u
var image = document.getElementById('receiver');
' Q4 z @" L9 g! x: ~
receiver_socket.onmessage = function(data) {
$ x+ j3 I2 s# _4 I5 J4 N
console.log(data.data);
: j) l3 p6 w& \3 q ?% q
image.src = data.data;
- M( N/ i+ \& i- n2 u" }
}
. r" x- h, ?- t- t, Z$ s
</script>
6 I; _4 p; Y- z
</body>
$ @1 p3 n9 \) q5 ^! x
</html>
. {' W8 N+ @, H: t
7 U' D8 [/ p* Q
复制代码
8 k8 ]6 m$ i) ^- z4 ~
# l$ w3 _( \2 b* B# w( V) W. y
3 ]: g3 E9 [7 a" e1 d$ Y" n
# ?% c+ C7 K/ s$ Q" r4 Y8 M
3 W7 m0 g7 D" e, B: U
9 j2 R- B4 Q& a8 b
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2