cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
. q9 Z: q' Z. r9 T5 s# V7 \
$serv=new swoole_websocket_server("0.0.0.0",9501);
$ {4 c/ R# T# e7 a: X
$client=array();
" g. Z* |5 g7 R3 P' Y
$serv->on("open",function($serv,$req)use($client){
0 @# b4 j; y V- [
//echo 'connect'.$req->fd;
) |- |! k0 r- r
$client[]=$req;
' r6 n, l7 u" e4 O0 }- c
//var_dump($client);
$ ]$ t& m, ?+ \! d9 g2 f& \
$serv->push($req->fd,'aa');
4 X% P7 N4 i- s1 M9 M) Z! ]
});
0 E! S. {+ O: N) X1 E+ _2 |2 C3 F
5 Q N; P' |4 y2 w+ e
$serv->on("message",function($serv,$frame)use ($client){
* o: _" X6 P1 _+ d) P$ a
/*var_dump($frame->data);
* K: D1 Q/ o& n$ R
foreach($client as $key =>$val){
8 X" `- ^' x2 ]0 v7 a& }: Y9 k: ^) V
$serv->push($val->fd,'aa');
. }* I5 Z* @8 u5 o8 N( a
}*/
0 i* C" N6 G* L; U; p+ h
$client=$serv->connection_list();
% I1 H. s6 g! g% Z( x. ?
var_dump($client);
* |4 Z! a4 l& q7 z4 A& Z9 H
foreach($client as $key =>$val){
" x$ Y6 {3 G( W9 Q- l* K9 g
if($val!=$frame->fd){
" f/ R' Y; ?- b/ M8 I/ d
$serv->push($val,$frame->data);
7 U. ]: E4 _3 a! ?
}
4 N* U. X0 i$ ]6 }6 o
}
Q; k$ @# N, N" t0 i+ m5 N$ e
' e' F0 b3 M/ l+ f$ n' `4 K" w0 q' U
});
- p: j* S" Y0 e# b+ q3 D& B; C
/ e2 f9 U: ]% b( e
$serv->on("close",function($serv,$fd){
& F l* Y$ o- l" x3 |0 T) D1 W5 |
echo 'close';
6 Q0 S- C8 s/ `/ c
});
8 `% v- G9 C" J, D4 k
4 d! O# N2 _5 w3 j2 U; }' T
$serv->start();
8 V2 }! p, M0 ], f+ n8 c& @& ^
/ U5 Q# L% L- i x+ _$ m/ B
复制代码
主播客户端
' e) Y( d. k5 _. s
<!doctype html>
3 b6 Z! U9 l+ q2 c/ a1 o
<html>
5 Q0 R- O2 }7 K
<head>
# D& ] ~' B9 b7 m7 F
<meta charset="utf-8">
) {' S9 J# t" D
; e: J9 P. R: g2 n9 u: G: b
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
" H& @5 Q) b p2 q' c0 G" |
<title>404</title>
# I- l2 G3 M; S- F
<style>
8 v% A' a, j* X9 e8 G6 U
body{
* e1 V. B) E8 W
background-color:#444;
2 `3 q$ p: Q v
font-size:14px;
( B+ n( P* R6 t0 P1 V& w/ V2 @
}
- V; k; N6 i+ B! y4 B+ V' h
h3{
9 q* c/ y' R2 y0 ]. \& J$ z; [, p4 w
font-size:60px;
- J g. I+ H! l0 n2 P7 L0 I K5 a
color:#eee;
1 o: Q$ w7 z- ]& d Z
text-align:center;
# G9 j$ F7 ?$ w, j% ~
padding-top:30px;
$ n7 r0 x0 H) S0 I: e3 N5 r
font-weight:normal;
( s' W& T/ ~) T! L( v
}
. H% X! p0 ^, L1 U, y7 C
</style>
& V: Z7 k- R2 O9 o
</head>
" [7 x \5 ~# c9 z. l
7 _3 C4 P: J7 F" p8 x, f7 C3 X
<body>
4 d: {6 E) J4 a- Z9 C& m( X* j
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
5 K- v4 @6 R, z ~5 x9 w
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
' [$ o3 h1 e! J a, t, W
<canvas width="400" id="canvas2" height="400" ></canvas>
, Z: n( Y. h; b2 m+ U
<script>
/ f) N2 `& ]" u4 }5 f
var video=document.getElementById('video');
0 w3 d* }; j6 Z4 T. F+ P
var canvas=document.getElementById('canvas');
/ x5 ?+ @" R, S o" v4 Q) z
var canvas2=document.getElementById('canvas2');
- R6 v" S/ A! l5 R: \% k# k0 l
var context=canvas.getContext('2d');
' Y; |( M0 J$ U" [) [9 o, f9 p1 [$ w
var context2=canvas2.getContext('2d');
4 [ h. C* m& H( @) k V. L" w
function draw(){
6 W1 v4 Q6 f- m' V& H( A8 e. f- {
context.drawImage(video,0,0,400,400);
& o5 j% F* y# R. N: x2 W
ws.send(canvas.toDataURL('image/jpeg',0.8));
3 s4 }. [- V/ r+ m+ n$ f5 D- M8 X
setTimeout(draw,800);
# O. M9 I! q1 M
}
% Q5 t9 K% i! p) J% [
+ _! a f6 T+ N
//客户端跟服务端通讯
8 @3 C1 `! X; r1 E% W
if (window.MozWebSocket)
" e- E% E/ x6 u9 b b
{
, F! P+ C n7 Y- i
ws = new MozWebSocket("ws://182.61.42.187:9501");
. E. U" z$ F; m' T ^- Q" e4 b: J
} else
7 Z+ }+ k8 e2 L& T& z- M1 S
{
/ Q" R' ?! t2 Q& w
ws = new WebSocket("ws://182.61.42.187:9501");
5 e* j0 U+ l; K- E$ E# U
}
# e* K* t8 k9 w9 r9 o3 _7 U
7 w* N4 R. V1 n0 J
ws.onopen=function(event){
, W! ]9 D: z, X4 m- m6 a" @* e
alert('连接成功');
4 @: [3 M0 o9 b, O( k/ C }0 [
ws.binaryType = 'arraybuffer';
9 H$ h' X# l5 g4 v2 w; C
draw();
. `* L4 D1 G0 b3 k- u
}
% F# B: |0 A( |3 P# _$ r c/ P
ws.onmessage=function(event){
+ ^6 E/ R0 X) B
//alert(event.data);
3 q$ g) \/ S" E) l k) D
//ws.send(event.data+"client");
+ m) J' t0 z6 r1 V
qrCodeImg = new Image();
2 p! w. }2 \0 @7 |
qrCodeImg.src = event.data;
8 O' G) [' D: O" m( U$ w" K
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
8 f* f* F& \; e0 X/ L! o
$ U# Z$ ^* y) B- g D$ ?
}
$ Q+ N# v% B. _0 [2 M4 B& U$ ]
ws.onclose=function(event){
$ m% C9 P" y2 L
alert('close');
4 A, w' |3 e: R% N Z
}
/ k' ^5 M9 r) [
ws.onerror=function(event){
% Y2 p' Q" q+ U: _, E
alert('error');
" v" W& A4 L2 f q
}
) l9 m, B* L7 _
//video,标签模拟视频
* S# U* A% b% l( E- e
^. ?4 d: M6 m$ S
</script>
3 U: {9 }* V6 ^1 C+ X c9 n ?
</body>
9 X9 M8 T3 Y- u
</html>
1 F1 Z3 e! m! p4 Q
9 ~1 d- d9 J; y- m( K/ W0 s) y# j
复制代码
客户端:
7 t1 @" U+ Q" I
<html>
6 T- t& G+ ]+ D0 \% D& Q! [4 t. _: b
<head>
+ E; Y+ Q [% g3 U9 J9 q
<meta http-equiv="content-type" content="text/html; charset=utf-8">
4 e% r) ^5 I" l" d1 S
<title>客户端直播页面</title>
/ g2 I8 m$ L3 ^% c
</head>
; R+ f1 U5 x' p0 Q
<body>
# D" [, g4 a+ L! p& w' d7 } ]" o
<img id="receiver" style="width:720px;height:480px">
' c$ q3 _" G/ c: P! `
4 |* b+ y$ h; w# g( a/ A0 b* p
<script type="text/javascript" charset="utf-8">
+ U" ]# o$ @3 s' F
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
! D# s* a" |3 h5 `
var image = document.getElementById('receiver');
1 C* ^- D3 [4 x+ s8 U/ c
receiver_socket.onmessage = function(data) {
; Z \% P- v) Z/ S1 L, G$ g' y) \
console.log(data.data);
" t' a* B$ s4 `# z/ {- Y
image.src = data.data;
/ W, J/ H* b7 @/ _1 S `5 x
}
) l/ m" T0 x( A. A# _2 u5 n( V$ l
</script>
# E4 e3 K0 o6 |$ e. J
</body>
+ I0 P. b& E+ T
</html>
! ]( H) b+ X3 M& H; G, t$ k
* Z. u3 ^$ v3 G9 L! M% p6 V
复制代码
^5 p1 b, [- }! |
" P( J1 U7 x G6 Q, p! K
% w0 K; U& F8 z# j! T" n
9 M' G X2 d z4 M9 U# T3 Z
: N, l# r* W3 o$ n8 h
# {% L- A# X4 G0 ]' v* b. e* ^% `
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2