cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
1 [4 }# i8 _' [/ H$ f' i& f
$serv=new swoole_websocket_server("0.0.0.0",9501);
+ Y( `: j0 _& k; X1 g; p
$client=array();
, |) a, w# ?; l+ w; Y3 r7 f- O- S: p
$serv->on("open",function($serv,$req)use($client){
& g/ a+ M- X2 g& w$ C
//echo 'connect'.$req->fd;
X3 C) \3 a& L, A& c
$client[]=$req;
5 Y7 S/ g5 m# H' g _% q+ {# d
//var_dump($client);
. X* h* u# h) y& _& q" B
$serv->push($req->fd,'aa');
3 ?0 L) _+ m* l8 U7 _1 n
});
2 C8 m3 c# G7 Q2 |* F4 r8 p( N" m
h" O+ M6 _6 ]6 Z8 |
$serv->on("message",function($serv,$frame)use ($client){
) r% A! u, s" X8 P" c1 o1 A: J
/*var_dump($frame->data);
/ M7 J3 q3 u* Q: W! {2 _; Y& H8 j, q
foreach($client as $key =>$val){
- {# E, H7 }: p4 X8 g* R# Q+ n
$serv->push($val->fd,'aa');
v' O+ a- Q+ Y. k
}*/
" D6 _4 |1 g' A2 G: l
$client=$serv->connection_list();
! i) ^* M0 B1 l- v/ s
var_dump($client);
/ V2 U) G/ t: a: l" h
foreach($client as $key =>$val){
% o* L9 u# V9 F7 {% q
if($val!=$frame->fd){
( L4 P' }, u/ E& x; C" N
$serv->push($val,$frame->data);
) h0 |4 _% ?+ v7 @8 f
}
, D& O& P( k e" O7 R# B
}
. j) Z2 A( \. h! W
$ h @2 k% k: m6 d
});
5 t) t; q* t0 P, @1 G ]* N
7 e& Y& y; }/ p0 b+ I$ H
$serv->on("close",function($serv,$fd){
4 R& M- D# b9 ~% W4 k0 u
echo 'close';
% j$ P6 B/ k6 r' {$ p. p, a
});
4 L( c& Q0 N7 S; c' q8 ?
1 e5 s) i. V: Q6 U" D) h$ ?: H
$serv->start();
5 p6 r# c5 _! z' ]
, C6 v/ K0 |- A; B1 }1 h* I
复制代码
主播客户端
( A9 M( r* L! \: g5 C. G
<!doctype html>
: {6 x: n: j5 ? O) B4 _0 f% {
<html>
% e/ e3 H3 A) o0 V+ A' q
<head>
. Y, h7 t, W( @7 y% h2 e
<meta charset="utf-8">
) q; a% q; E- H+ ~1 \
) I0 S9 w! H3 a
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
. D8 l9 `* W8 R; ?' ]1 ^6 R
<title>404</title>
) f9 U* m, C P6 \: j* C
<style>
8 J$ B! w% C6 O4 j# ~/ Z
body{
9 z4 K. ]1 ~6 q$ ^1 b% S( y
background-color:#444;
9 l8 t4 E. F7 i9 o
font-size:14px;
1 G! B5 z3 E& X P1 Q: y' r) F \" b
}
' s6 }2 Y* j2 X4 Z, O. ~
h3{
% F# W$ c4 e1 G9 z# t
font-size:60px;
G; |& ~+ U) Z! z; [: p
color:#eee;
" d" w; k" J% N/ q l0 a5 {
text-align:center;
" s' |5 d- H/ _7 z, s& H2 I: F7 X
padding-top:30px;
8 Y7 ]3 Q1 a' w1 T
font-weight:normal;
. f/ r3 q) c7 L. V9 D i8 I
}
2 x* }' N) q z1 w
</style>
/ k" v4 A6 u7 s A, ]
</head>
: P( G# S8 E1 G6 C4 Q
& ~, ^& n% e( a( \* ]1 I) y
<body>
* L: N2 `$ w5 [- ~& w
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
$ Z2 W7 b( V) U
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
9 Y$ p8 B3 Q8 ?, c" {/ l
<canvas width="400" id="canvas2" height="400" ></canvas>
& }/ I4 F; e# P, h1 w
<script>
Y. D7 h9 B, f; C$ ]
var video=document.getElementById('video');
j# P, d3 h# ~; }
var canvas=document.getElementById('canvas');
, |3 H% h' W8 E3 _6 u" l
var canvas2=document.getElementById('canvas2');
& F& A4 t9 Y% x4 o0 u$ r4 H
var context=canvas.getContext('2d');
& d; T; T( l6 `& g2 Y/ k' C0 s
var context2=canvas2.getContext('2d');
3 y: H* A) V9 U3 x/ A: |
function draw(){
0 ?* }2 i$ \; n; v& i
context.drawImage(video,0,0,400,400);
: W" k6 }" i. C/ `
ws.send(canvas.toDataURL('image/jpeg',0.8));
7 [. w& L& N1 h# A, ]# I+ T
setTimeout(draw,800);
6 `8 E, [) s1 s) a8 O
}
. c- f" c f4 c$ L6 U
' }' Q+ ]9 Y D& a9 ~7 @1 J
//客户端跟服务端通讯
& y. ^3 }' }7 s9 T2 {; r8 E
if (window.MozWebSocket)
w C" ^: x: L
{
& \9 G- Y% T" [8 y! n5 h
ws = new MozWebSocket("ws://182.61.42.187:9501");
" T7 X# S8 D B" h( M9 S/ c+ Q: d
} else
. s7 _8 H1 ]1 V' r9 E. _; _
{
2 o& B. K. K1 K0 G1 I% W
ws = new WebSocket("ws://182.61.42.187:9501");
+ o S2 B* w1 |4 ?2 b4 B) D! M& |
}
+ c6 Q9 U9 B; N; X% D
2 t' {+ l1 U5 z$ X: Q1 ^$ m" ?3 G
ws.onopen=function(event){
) o5 ?- J4 J4 V! C
alert('连接成功');
+ n$ b) C: p! D, Z. w
ws.binaryType = 'arraybuffer';
, J+ C; o0 i/ u8 ~( K6 S
draw();
/ f% r \7 Y' R2 P
}
$ Q9 ~/ ?; d+ _! }4 r
ws.onmessage=function(event){
+ O3 P0 Z4 l4 H4 v4 m. g9 h! A
//alert(event.data);
: y% X6 M8 Q! e
//ws.send(event.data+"client");
& G8 s' V2 c& z5 S1 [9 H
qrCodeImg = new Image();
' E! H1 H: u$ q& ]
qrCodeImg.src = event.data;
) Z c/ i7 `7 ~
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
^1 Q) b( U: K+ ?' l; D$ ^
% H; ?( p) V9 u) O7 U2 z; `, v* l7 N
}
, a! @2 p! N) V& ?
ws.onclose=function(event){
8 X" i1 \" Q s/ b) [. B" S6 G7 T/ A
alert('close');
/ T' m; e3 c) R) ~, t5 Y6 \
}
8 }/ H- T& v2 t3 J# K
ws.onerror=function(event){
5 ^+ M& u" n' f H I
alert('error');
- ^$ m0 Q! F2 |) j" c
}
6 U. u% B4 s& {) T l/ m" S8 Y
//video,标签模拟视频
/ {8 p, x! B1 d+ v
: t$ E( V; }5 Y: t% B" P
</script>
6 |: e: G$ g0 {
</body>
$ ?1 A6 N1 K7 Z# T3 i! n
</html>
0 D+ I0 Z& M# X& |
0 p |+ d' U" I z% y( M! r7 r
复制代码
客户端:
, `. j, K6 P" a: Q* @
<html>
* ~: y4 M6 Z7 i. L# b
<head>
F: |! x" x* M
<meta http-equiv="content-type" content="text/html; charset=utf-8">
1 v+ F: Z8 F2 L9 F5 U3 W
<title>客户端直播页面</title>
* j; p( o- h5 _- y+ C1 M
</head>
2 K! E5 w; a$ N( R. R2 e
<body>
( o6 n1 l& k, c5 X. q, j
<img id="receiver" style="width:720px;height:480px">
; e" I5 R+ T) O9 X% A
7 j( o+ f* m$ @$ i1 m
<script type="text/javascript" charset="utf-8">
1 l; m5 p6 U" f$ R$ n
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
y3 S& ]" v2 U9 g' f
var image = document.getElementById('receiver');
+ r0 E% \8 ~8 ?
receiver_socket.onmessage = function(data) {
' `: }$ U3 w$ B1 }3 o3 L, R% b
console.log(data.data);
, A& B: A5 h2 W6 B$ ]+ x
image.src = data.data;
- x1 g& }0 G3 V- g
}
* p& N" c- |$ U
</script>
! K0 I5 s3 ]! e8 T- l( d
</body>
7 o) v! q; g3 t% _
</html>
; l5 E4 M- b/ y! g* J+ X* B8 R
3 E! a h1 C( Y: U5 z% Z' q
复制代码
$ n2 _, N) g5 I: b3 @
" d: j" y) V; t H0 }% L
( T) x2 a& h; [5 a$ v/ C" Z
8 d( h3 E; N1 k- S
' M& [. B2 v1 {7 r( ~" B
: j: n( q1 r, n2 l
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2