cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
2 n. s o4 H( i+ K5 _
$serv=new swoole_websocket_server("0.0.0.0",9501);
% Y; i; V. G+ i- p/ D
$client=array();
2 o/ ]' ]3 M" ^& C
$serv->on("open",function($serv,$req)use($client){
2 c5 M2 z, V. ^8 J
//echo 'connect'.$req->fd;
! w( F6 y' k9 t
$client[]=$req;
, ^2 X# ^: e' a6 v6 Q& {
//var_dump($client);
A1 P0 X. t6 |- M/ L7 U% k
$serv->push($req->fd,'aa');
+ G7 v2 V7 Y3 I+ b( }9 [
});
; D3 P# L% T, K, _5 p2 g9 q
$ c, r' q$ m8 X- y
$serv->on("message",function($serv,$frame)use ($client){
/ z9 {8 l( T$ E7 c! E5 @1 e/ {7 }
/*var_dump($frame->data);
2 r! W) J5 r! V1 _3 W* t& P
foreach($client as $key =>$val){
o8 G# B. R0 n' x9 c
$serv->push($val->fd,'aa');
3 Q1 R, @ Q2 j$ O' n% [! i
}*/
) X% B8 G2 F3 r {7 `1 W
$client=$serv->connection_list();
, h F6 q! s$ K
var_dump($client);
* R" o! [0 a8 h" W
foreach($client as $key =>$val){
- n- A( f; H4 r7 c! b9 Q$ G: d
if($val!=$frame->fd){
2 x V% Q. z1 y t5 D: I
$serv->push($val,$frame->data);
# [ o$ Z: A) Y6 W4 `
}
( t: N, v; p$ J% ]0 C; [7 {" Z
}
2 s# e9 c/ P% q! ]0 k* O- S
4 r9 C! C( x+ W+ q: n
});
- r2 e' H* R# L" |1 I' y& i
`. @$ I+ Y1 E
$serv->on("close",function($serv,$fd){
8 T4 \0 n2 l# |: u) }
echo 'close';
" b& p0 n% N$ Q/ g% o/ ]0 R# p
});
8 Y1 w# `( X2 ?5 C
9 ]; Y4 J$ m7 V: {+ W3 N
$serv->start();
% D. ]9 C$ K0 l# ], O/ _% S
( w, i+ j6 H1 X% T) K7 }
复制代码
主播客户端
3 y( w3 G" X, r* r' e
<!doctype html>
/ G# u2 [ w% i2 ?
<html>
6 z- b+ }4 a7 O1 |4 v
<head>
" e J& W7 T. t1 f3 o4 G! u- U7 H
<meta charset="utf-8">
& P" O. d+ B. a2 w9 y% f7 T4 z
& T7 o+ R0 M" w
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
/ p2 n" ]( D! G8 r
<title>404</title>
$ f; s) O# K! w
<style>
6 s! ?8 J) q% h! C! x& v
body{
' O' A4 I, O. R
background-color:#444;
3 {& Y% ~7 g; h A* F8 e, _
font-size:14px;
! a" p/ l" j7 A: Q3 o
}
$ x# p2 t9 l: I9 J5 l
h3{
( I% ?+ M1 o, I
font-size:60px;
. Z. I6 U4 m! D0 A8 o3 g9 A
color:#eee;
: W" w3 Y, u( r0 _# A
text-align:center;
& M7 u, k1 E, D; Y; z; {
padding-top:30px;
& W% l' Q& ?0 E1 j. H. h: L( U
font-weight:normal;
}! U/ L% }! V" L, k& |
}
- H3 `8 ~* |/ O* J) \- z
</style>
~. B+ R6 `2 i) J$ d* P. k2 O5 F
</head>
& D! r# g3 B$ Y6 |
& I p0 ^( X% q' f+ v
<body>
/ V* o! H! y/ H3 D
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
) X+ W L! \: h5 g1 J8 X, E1 S7 n
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
( V1 \1 _5 l/ `; _/ K) Q
<canvas width="400" id="canvas2" height="400" ></canvas>
8 s; b; x! e- Y/ E& C2 o! q
<script>
2 R4 W2 m/ K7 J$ A) X% `- h
var video=document.getElementById('video');
' _& k, G0 d: |) K( R2 L; z
var canvas=document.getElementById('canvas');
( _1 u9 C) d+ _1 i6 I; J/ `- y
var canvas2=document.getElementById('canvas2');
6 ]$ [8 c/ i4 |' ?
var context=canvas.getContext('2d');
i6 h, K+ D2 Q) r7 P# p0 q
var context2=canvas2.getContext('2d');
7 }7 b2 f+ R, N2 C
function draw(){
" l2 p8 H, `% j
context.drawImage(video,0,0,400,400);
( {3 A& B( y# `" e, g W
ws.send(canvas.toDataURL('image/jpeg',0.8));
( x$ w" U/ c* U
setTimeout(draw,800);
' z0 {( @3 t' R/ S4 q2 u: b
}
* K" ^2 K2 v- q( ]5 R
. ~: F' N' V6 @7 f* D4 `# z( ?- b
//客户端跟服务端通讯
" K3 A o/ T3 G2 ]: y
if (window.MozWebSocket)
! b5 w/ E) y t3 C8 m6 Y, ?( \6 k V
{
a! N! X, ~% X8 W
ws = new MozWebSocket("ws://182.61.42.187:9501");
/ v, F$ r0 D6 P/ `$ P$ c
} else
) Q+ y& K4 n0 ]' X' M7 p
{
: X; n6 i; r" A0 s$ U" ~: ^
ws = new WebSocket("ws://182.61.42.187:9501");
7 ]( h9 c7 F0 [7 ?
}
: x; Z& Z4 T9 I" G4 D. h1 U
$ ^7 L& x2 t- E: V6 [6 t
ws.onopen=function(event){
& X# X/ e' }7 u# D' F
alert('连接成功');
8 _$ F2 @: _% m; D" \
ws.binaryType = 'arraybuffer';
: `/ b, C4 [- o. z0 c
draw();
- w: D0 `5 {$ R, B" N
}
6 f( _8 @& J: K Z3 m
ws.onmessage=function(event){
( B: u- c `* j2 N. n8 g1 z: I
//alert(event.data);
2 \) u9 B, s: v' ^2 Z" {
//ws.send(event.data+"client");
* h8 E8 O. M; z
qrCodeImg = new Image();
* V: K; ]/ f5 J4 m' O5 R1 I' O
qrCodeImg.src = event.data;
, O- C. \1 v! ~. m5 Z9 W( m
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
0 a' h/ X' I% C/ r8 }/ J( K: U5 w, F
0 [9 W) `# {6 O1 f. G& C$ f: k
}
2 k2 Q* m2 \& I& ~/ I8 g
ws.onclose=function(event){
! P2 D' `# v. p1 E2 G
alert('close');
) g% e5 s1 r5 L% T
}
+ O6 t" T1 d- f( X w6 [
ws.onerror=function(event){
9 n# O& W v5 ~, g/ C# h4 d
alert('error');
$ \$ ~; b, \2 W: S& n
}
& \* }1 I* p: D! k
//video,标签模拟视频
3 J, }6 P% i5 |8 r4 r
6 d3 c1 k, S1 E3 v. R
</script>
0 ^5 A) v( [+ w# w2 J5 [5 N( E! N
</body>
6 f# b5 a7 Q) v
</html>
, Z& t' q% g# w+ B% x
`$ w0 P& f4 O0 P5 Z9 n, v( [$ K
复制代码
客户端:
# O; u* k* S. C, d/ w
<html>
1 T8 M5 W+ ?9 x8 R [
<head>
# z' {4 N$ U4 Y# M) I; k
<meta http-equiv="content-type" content="text/html; charset=utf-8">
3 `/ r: \; `' D' |- g1 V# b( ?4 L+ U
<title>客户端直播页面</title>
9 P$ P h+ S( R) x5 e
</head>
: ?8 ?) n1 O5 X2 d
<body>
4 m" S* X( r' q" ?1 ]/ ~
<img id="receiver" style="width:720px;height:480px">
2 [9 w: Z4 ?9 i' n
2 k/ T2 |0 T9 L; c# T3 A
<script type="text/javascript" charset="utf-8">
2 s' O3 r% l! x/ m+ Z/ H! ~
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
8 [( w2 ]) p, l/ }5 v
var image = document.getElementById('receiver');
4 ^$ D' n) k) ?
receiver_socket.onmessage = function(data) {
- j; Y/ k9 y. J% N
console.log(data.data);
2 B2 O. N/ g7 C' X
image.src = data.data;
$ |8 s3 j- a4 {. N* B- V
}
/ \( z- v- f) O+ c5 j H& E
</script>
3 c5 U, w3 Z6 a" x4 d' D/ k
</body>
$ V/ W$ ~6 H9 F, l2 D" |) X
</html>
8 K- ^+ R v# O, T
0 _9 C" L' }# r! `
复制代码
% v2 J' r9 l$ G
& ~; o; I a$ \7 [4 p# f
5 g; l) J# i- n$ |, t$ ^2 T- b
F6 w5 K8 y- l3 R. J
* A3 U6 Q" ^" {' ~# E' ?0 @
4 d" ^. O) b" s9 j
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2