cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
2 P j, |2 ]; N) p6 ^
$serv=new swoole_websocket_server("0.0.0.0",9501);
* A) V# ~6 o( _; p' {7 x1 k
$client=array();
3 } E# k$ \; R& t
$serv->on("open",function($serv,$req)use($client){
4 F* ]. K# z5 Y7 a
//echo 'connect'.$req->fd;
" w' W, I a1 J' X( V/ s* y$ n
$client[]=$req;
9 f0 ]+ P2 \; J) l& k m% q2 @
//var_dump($client);
+ I: _6 f2 X. j. d1 o% e" U
$serv->push($req->fd,'aa');
' m' t5 z% T3 c0 R
});
: |" \* `/ _0 k- X" @+ d7 t2 i: G
# T, i7 h2 z) F1 z+ g& p/ [! f
$serv->on("message",function($serv,$frame)use ($client){
4 {2 b! H( t. J7 Q7 h5 X
/*var_dump($frame->data);
1 [& O* h+ U& k3 z, F# f
foreach($client as $key =>$val){
; d( ]; O# _8 f1 F. [
$serv->push($val->fd,'aa');
! U+ E& o! u) T/ \3 ~' C
}*/
/ f1 N- U) y1 z' d! x [; [* ?/ q& J
$client=$serv->connection_list();
5 N3 u# j, y2 h' O
var_dump($client);
1 M0 t( F/ f3 L3 E
foreach($client as $key =>$val){
( Y' g, d' S3 ?, }' p) l$ d H
if($val!=$frame->fd){
" `3 ^0 y5 L0 L0 S; `" J
$serv->push($val,$frame->data);
" d0 T( [/ Q+ P9 E
}
9 U! ?/ y% N( e! e [. ]
}
5 F( g2 ?% {& _8 G! W% w
; r+ Q4 v# B/ f3 Z* E
});
+ s( L& E) a8 p: M5 c
* _$ y, H6 l {' r
$serv->on("close",function($serv,$fd){
M# }7 L' Q- }# W6 l: r
echo 'close';
7 c& J1 j6 E" m$ r
});
' j+ C9 O" f, T$ j
; k, p9 K4 P" T5 B, E( o
$serv->start();
! I+ l' Y% |( t# f0 E
( Q. o4 K9 ]( K- ?) [/ D
复制代码
主播客户端
3 G3 D& C* C& O6 _ z u G8 [
<!doctype html>
) a- c. R( r+ U0 F
<html>
+ ~8 `7 O4 I4 ?5 u7 U) S1 @
<head>
! X2 ~4 O9 V: C) ~& s: f
<meta charset="utf-8">
. f+ s2 y3 a4 d a
% D; y3 a7 R" s( a
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
* P7 [. Z4 C5 |- Y
<title>404</title>
5 X y" {( \3 h+ c) T
<style>
% q% _/ {( i/ A; D1 S
body{
1 w) z0 a, q5 Y5 w, ~$ h7 L3 W
background-color:#444;
8 L1 d0 C3 n7 |/ I1 E M4 ]
font-size:14px;
4 V, w: V# C# ` `8 h; g t0 V
}
: e+ L" T$ V0 g9 z
h3{
; G0 `2 x+ i7 H+ t. F. d& p& M/ E7 L
font-size:60px;
, u I$ B+ B) O8 M* N2 y9 c
color:#eee;
4 l5 m* y* R5 `8 [( L: ] P1 S
text-align:center;
& r/ i5 t& m6 ~
padding-top:30px;
$ h( K9 a8 I' W5 v% G' E
font-weight:normal;
1 S, j/ N5 ]2 D: o5 ]
}
4 C; T# j1 W: Y" P+ S6 L' J
</style>
+ x7 g1 `! H8 E- L; S2 _
</head>
' i5 i6 C0 ]* {2 M) r
1 C4 I V4 ~5 W. p$ [% M# ?7 p( @$ M
<body>
4 n5 w5 K. @3 R" Q, u
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
( V8 K, ~$ A3 A2 F
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
4 a6 C0 P/ J6 l% H! E
<canvas width="400" id="canvas2" height="400" ></canvas>
5 V5 c! o/ @5 Z6 o" Z& f
<script>
6 b3 [+ A" k# {# q$ `
var video=document.getElementById('video');
6 D8 M& c8 t6 J; |
var canvas=document.getElementById('canvas');
: O+ ?4 T4 ?, \8 N' A1 j
var canvas2=document.getElementById('canvas2');
- B7 y/ Q9 ?' ~/ z4 y: ^, z
var context=canvas.getContext('2d');
3 d) g- Z8 H3 i5 u* v! f! N
var context2=canvas2.getContext('2d');
* H w3 C) K o- G0 B- S- a) J
function draw(){
@2 x" U# U- _( W* J3 N
context.drawImage(video,0,0,400,400);
3 H+ V5 k3 T' W g) \
ws.send(canvas.toDataURL('image/jpeg',0.8));
- w L+ }; H$ v% h. X
setTimeout(draw,800);
+ G" R& M2 o' k# W
}
3 L5 t2 J1 X! d
- D3 [6 A h2 r7 d
//客户端跟服务端通讯
) ^: N( s3 @, q5 S9 G4 u
if (window.MozWebSocket)
) d- ^! T* W! }
{
! z2 H( t2 ~6 q( {" j; U" E" j. j
ws = new MozWebSocket("ws://182.61.42.187:9501");
9 e6 R0 @* f) O& e6 c( `
} else
/ a' I' `1 W E& ?5 n( ^
{
( o: x" o$ j) f: S
ws = new WebSocket("ws://182.61.42.187:9501");
. S1 T' X% ^' K2 H7 L
}
O2 \ p7 T1 l* V0 `7 v+ {
% Z" i. G& Z: i. y
ws.onopen=function(event){
3 m: ?+ P" v4 i6 N
alert('连接成功');
! n; M G2 y9 V0 T. _; @0 o
ws.binaryType = 'arraybuffer';
) t' L u# \0 n
draw();
" S) G- ^ X" N T; \# _1 ~, q
}
9 X/ _ ^3 |& q) u6 M
ws.onmessage=function(event){
1 w( N$ j8 I9 K3 a) q( N
//alert(event.data);
! n- @ L2 d8 G% t0 ~& t
//ws.send(event.data+"client");
' Q0 o2 w' O% U) n j4 O; ?7 y
qrCodeImg = new Image();
6 U5 e) Q+ {4 c8 j
qrCodeImg.src = event.data;
, d2 f- T, J1 ?- p0 N
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
' Q4 w; @ j8 R3 \( y5 v3 o
! [# ^% v( l. a* D+ Z# _
}
" N# E/ A& Y% G" ?, ]3 R
ws.onclose=function(event){
' _ v( h5 P1 Y2 c/ d" X6 D
alert('close');
5 J* A9 L# M5 ?2 }+ M* e8 P: ?
}
4 P/ F, v. ?9 A. ]) _# z$ r
ws.onerror=function(event){
4 ]) u! v. |/ W4 _; E3 C0 m. f
alert('error');
9 j4 ^, v8 N2 S, @: K: J
}
' q9 u2 i* Q/ h7 }+ K; P/ H
//video,标签模拟视频
8 E. } w3 {. ?9 S: B' T0 {
6 ?1 b" U( r% R& j3 f
</script>
2 p4 w& ? a5 ^3 p3 ~7 ~
</body>
/ s4 y; O( O u/ z: \( D* y. a
</html>
! n, v& d M' f4 j2 ^* `2 G
2 F) ~3 u7 t* U$ d1 v
复制代码
客户端:
# ]2 r4 J1 z' c- V
<html>
, d8 m3 ?& p3 @7 d6 B/ x% a+ G2 m
<head>
4 w" L$ F* a' A( N
<meta http-equiv="content-type" content="text/html; charset=utf-8">
$ l5 M- T# y/ A, m
<title>客户端直播页面</title>
5 p- U; v! M8 V4 c* }* D
</head>
# n1 B/ [& h1 A. [1 D6 |* \9 H
<body>
' p* h$ Y# ?9 z
<img id="receiver" style="width:720px;height:480px">
7 V8 W5 \" z* a" P
( N, L b5 M- U# j" p+ d
<script type="text/javascript" charset="utf-8">
4 O y) V) c8 B8 f
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
2 _5 T" O% \/ Q/ {' T8 D
var image = document.getElementById('receiver');
" C1 ?9 R4 U5 `9 `& U" ~5 F" K
receiver_socket.onmessage = function(data) {
Y: }( A# Z% L$ _; P
console.log(data.data);
) A/ i( C4 ~. P! L) z; m
image.src = data.data;
2 \' B3 o' ?+ C- @5 Q
}
- v6 D* w1 p A- O
</script>
+ h$ P/ v8 k+ A/ K4 D2 D/ m
</body>
9 n. o/ O; P/ U* Y9 T/ u4 d/ i
</html>
5 w& f! j" ]* X0 j( m
2 K" u% V& W) H8 W) `' g
复制代码
/ I! p6 V5 T0 |5 t
: V% T! I- x* Y9 w
4 Q9 q) o9 t& R' v. t' v
' R+ n. f+ G. n
3 j( L5 |, A# `3 V$ M8 L
. O1 y5 N- H2 q) K; F
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2