cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
4 A- L. i! ~# |: h/ O- T) |
$serv=new swoole_websocket_server("0.0.0.0",9501);
3 ?: ^( z* q) a T
$client=array();
( \" G3 m: U" u) {, ^/ R
$serv->on("open",function($serv,$req)use($client){
/ Z* w$ L/ ~& P! }+ \9 f- `
//echo 'connect'.$req->fd;
" B* [) i- V' V* R: n
$client[]=$req;
! S9 f1 B5 y; R
//var_dump($client);
, n* s. h) Z0 Q: e( W; x
$serv->push($req->fd,'aa');
9 w8 h* h2 I/ b. z6 y' B9 j
});
' |! [+ g' M0 t) v6 N
2 r- [5 k! J" v2 W; y
$serv->on("message",function($serv,$frame)use ($client){
1 [" ~8 A, d7 A# {
/*var_dump($frame->data);
6 o N# X! B( u! h8 r& B# U2 T
foreach($client as $key =>$val){
' i2 H+ W; Q4 u2 R0 h; n" ~3 a
$serv->push($val->fd,'aa');
- L; |8 k/ ?8 m# K, t
}*/
2 O" \1 Q+ k- ^: o5 @/ l& l
$client=$serv->connection_list();
6 d9 V" F& U3 _9 J; s9 D, a
var_dump($client);
1 M0 G; A/ C" e% |
foreach($client as $key =>$val){
# c2 a/ g5 i; K" H. k4 B7 j
if($val!=$frame->fd){
8 r* ^* o2 h. t) w
$serv->push($val,$frame->data);
- m8 D' O% O# ^( X Y0 X- U- Y
}
) @. W$ O& b+ Y8 m' x' j
}
: E z% C8 z: d: @
+ `( L1 S& h+ _* y# v2 X8 s4 H7 T
});
7 d" }. _7 i0 r# B+ p
! t( Z" T2 D! E9 I% n- Y r9 O
$serv->on("close",function($serv,$fd){
: t; f9 V2 H% }% ]0 }
echo 'close';
# o" w) x: \8 b9 e# B6 Q% A
});
! H' S6 p U, x, v
; E, U1 w) t' q+ L" F, w Z
$serv->start();
9 G' p& i, |, N1 \. O
& x+ A: c+ C6 P6 Z7 s
复制代码
主播客户端
' `+ N. z) Q; N/ ?, Z
<!doctype html>
; ~" V/ {9 X4 R5 p3 r6 _
<html>
! o# [; _! I4 N4 |
<head>
8 w& q9 \% A& u1 p
<meta charset="utf-8">
3 O+ k, w) t7 A1 B9 X7 v
! `0 ?$ G! {) ?3 B2 c
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
4 ?/ g+ g' a# v, F8 T! p7 D
<title>404</title>
3 z5 _2 q0 ~: `( i
<style>
" _% |5 g+ s1 d
body{
" o4 j: R& o- T+ T8 H
background-color:#444;
& u( f, X9 ?: R) i, ?
font-size:14px;
1 h& `( z9 V1 G. G9 q& D& C
}
# R( J9 P) L. k
h3{
# ?) Z s) c7 \! T1 s( |, V. {
font-size:60px;
5 m- i0 h3 R0 w5 |5 m4 }
color:#eee;
' |$ k$ x. M. t+ s
text-align:center;
6 [4 k" U( i& B! v' k# v
padding-top:30px;
; l1 @. G& B/ ?1 N) D2 } M
font-weight:normal;
5 ]9 K. i0 Y7 G1 n; F
}
6 n* ^4 f2 `% ]% L: k/ }( R
</style>
% G/ O6 Z/ z% s/ D: F& v. s
</head>
" x) Y5 g3 S2 J8 c' l) g
; p' L: N# U Y
<body>
' b; r0 p, P A# G$ H e* t+ m3 m: p9 N
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
% \* { E( y0 u( C O
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
4 ` D9 ^0 k2 e' G! W6 p
<canvas width="400" id="canvas2" height="400" ></canvas>
, `* M; y6 J7 e9 ~/ ]' d
<script>
1 m: s9 x( x1 |# o' g( n
var video=document.getElementById('video');
" u$ n& V B4 @( s t& U3 F1 Z% K
var canvas=document.getElementById('canvas');
w) I1 Y2 q% J: o+ f9 d) g `
var canvas2=document.getElementById('canvas2');
$ s* p$ _0 E E- P% H* V2 N; r
var context=canvas.getContext('2d');
, i: N/ _6 w0 M+ C8 P2 [1 J9 [
var context2=canvas2.getContext('2d');
! A9 d& \& A" O: Z
function draw(){
& F" b' O" o1 j) L/ H$ B) O0 C* `
context.drawImage(video,0,0,400,400);
( C9 X1 B, H) k5 I4 A" |
ws.send(canvas.toDataURL('image/jpeg',0.8));
# P4 R; T" B# ?0 S0 j* n
setTimeout(draw,800);
! E4 H1 g' O+ Y
}
8 w1 a/ I6 h1 y# o2 H$ A3 p
. a. N& d0 I1 Z. J( g
//客户端跟服务端通讯
. L5 j" _( c+ @# H
if (window.MozWebSocket)
9 k' C" v& D; G3 z! B8 y ?6 B
{
$ p! e7 u& K1 j5 k( P
ws = new MozWebSocket("ws://182.61.42.187:9501");
" H4 }, K7 G3 D& _: D n8 m. M6 U
} else
& H# l6 D( \+ T. s h- I, P
{
5 z5 z' D+ O. W$ {' k' l
ws = new WebSocket("ws://182.61.42.187:9501");
# J# h$ X3 p( c
}
; r% A) I# D; u! w0 n
& Q1 c7 f2 Z6 T7 T: e% Z
ws.onopen=function(event){
) l' t! R* V& o/ L
alert('连接成功');
& o2 R# E$ M' ?2 e9 Y7 C8 a7 g
ws.binaryType = 'arraybuffer';
8 V2 S7 ?! e% ~% }* v
draw();
+ L0 _: r4 {: K' N1 d% w; v
}
* \( Z. G. J" B. F6 W, y( E/ x
ws.onmessage=function(event){
) p6 I8 c3 ?) \ \
//alert(event.data);
6 R1 u% o& y, r8 D' v5 {
//ws.send(event.data+"client");
" u6 q' g) ~0 |/ T5 I6 E
qrCodeImg = new Image();
& O* Z) W& ~, l1 h
qrCodeImg.src = event.data;
. [+ f; n. ?4 L
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
5 u6 y0 p: b& d X( R
. m( w" n2 e( @! C9 A
}
$ H4 K$ U8 L& ^0 k5 }
ws.onclose=function(event){
5 \, _/ P8 ?" C" y0 e
alert('close');
5 `" z ~" H4 B' L' E5 R
}
% H" x. g$ T+ D
ws.onerror=function(event){
/ {* A9 E Y6 Z E! O
alert('error');
, L& U& N' X/ m3 ~
}
( q: f. w& m" r6 ]6 `4 S
//video,标签模拟视频
3 T. ?9 g* }# ^' x" k [6 Y
: V+ b+ g9 z+ b% ^, {$ [! Z
</script>
6 h; B7 h/ N1 \& s. ~ ^. _6 J
</body>
7 L6 z+ _5 U+ b7 a, _. n
</html>
$ ^+ m3 c, E; ^: _: y+ K; ~
7 j0 q5 z/ E5 \* X/ ^* e
复制代码
客户端:
& T, z5 Y/ Z. g3 L4 [6 _
<html>
- j* A. A( ^* A/ V M6 V
<head>
& \) F4 s3 I( @1 f0 p) B
<meta http-equiv="content-type" content="text/html; charset=utf-8">
( j9 v, T. v8 t6 U1 z+ A+ N) H! g
<title>客户端直播页面</title>
. i. L- p \- ~! T& z
</head>
9 x y: l6 n1 x
<body>
( U7 n( O* C* @+ o7 D i$ ]
<img id="receiver" style="width:720px;height:480px">
# P' o7 c& Q( h
" d- L' j1 [1 v$ M& @* y( m; H: h
<script type="text/javascript" charset="utf-8">
: [, V6 ^4 [: M7 c3 m( K% v9 P
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
7 T, _" H% P" M4 a. c
var image = document.getElementById('receiver');
0 v2 a- v. {$ T7 B; R. R/ N7 j t
receiver_socket.onmessage = function(data) {
) _2 N8 g* E$ F
console.log(data.data);
- g- {" q7 c; z# x
image.src = data.data;
1 K: A% n' G5 V
}
: K! Z5 b, o' t) ~" Q4 T
</script>
1 Y" a2 o5 s6 z: K6 G) @! S- U+ D
</body>
+ |9 j' x+ d) d6 b/ C2 S
</html>
8 X/ v8 g- X4 T! A8 G
4 u' w: C0 L4 d! B( Y- V% h
复制代码
$ `$ Z! X( ]6 M9 v0 ~
m b# r5 m1 i' i
; Y/ R6 Q( X/ r5 Q
$ F& E1 m h- z: |
3 t. {$ a* {& x. I
0 e9 V3 B$ W3 X
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2