cncml手绘网
标题:
swoole视频直播(记录用 未测试)
[打印本页]
作者:
admin
时间:
2020-3-29 18:53
标题:
swoole视频直播(记录用 未测试)
服务器代码
4 ]# B* N I0 {
$serv=new swoole_websocket_server("0.0.0.0",9501);
$ L8 n0 {( l* X; l( p4 V/ s, D9 S/ l
$client=array();
, f( a' v V$ e7 V$ A
$serv->on("open",function($serv,$req)use($client){
7 c# ?4 k1 R4 S
//echo 'connect'.$req->fd;
9 C* h+ \; \# ~$ R8 ~- x& K
$client[]=$req;
) A# K1 n; n# b, W0 s
//var_dump($client);
% j3 p/ ?" A* S& D" a/ Z! t' J" x9 `
$serv->push($req->fd,'aa');
1 P+ s4 y+ m. A' w3 Y1 i& o
});
" I; U% _1 J$ G2 _: k9 H
4 @% e J+ p$ M# k: W
$serv->on("message",function($serv,$frame)use ($client){
, O2 w k& D5 W0 w& I( v, k. V
/*var_dump($frame->data);
3 o% w/ X' T* d; U& W1 V
foreach($client as $key =>$val){
! h8 k6 ^5 o# W. ], B
$serv->push($val->fd,'aa');
/ L* Q/ q4 o0 `" r% T
}*/
2 `0 N B" @7 a
$client=$serv->connection_list();
5 F1 r F( p; u3 u$ d( s+ M
var_dump($client);
' i6 z% L7 S8 {' c1 X
foreach($client as $key =>$val){
- J- r C5 V! U2 Z) }3 l* L5 l
if($val!=$frame->fd){
4 d7 q2 [0 D) u+ L$ X8 {
$serv->push($val,$frame->data);
3 k$ M6 }5 w- a8 g( p+ [
}
9 N' |' x7 e0 k/ G+ G
}
' V/ ~5 r7 T2 o( a1 {/ V
8 R. `: a; ?. g
});
2 n B: ^# d- d3 v9 _; |+ i
) K" ^4 c1 k" W/ p
$serv->on("close",function($serv,$fd){
/ D0 g6 i4 o+ o- Y: e4 V
echo 'close';
$ _6 n$ V2 _! @& K. d5 E0 s4 k
});
, \! h% W3 z; b$ @6 r6 j
6 I% U3 C7 ~6 X M3 I/ y8 W% V" j6 T
$serv->start();
* j( w/ X; j* @" }5 a# T; I1 Q
" F% _* _# l' e6 w
复制代码
主播客户端
, W, @; M$ }' k7 p$ H- n, i
<!doctype html>
: X& G& I; W6 s+ A% p$ J6 i
<html>
! |1 E; ^ t0 U \3 T7 d
<head>
2 s |% l, v$ J5 u1 N
<meta charset="utf-8">
- H2 r" [& }9 x3 o% y/ s M
! W4 r5 ~7 X5 `* N+ L
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
! p. f) f0 a& A. N* X, D4 S9 ^! \, I
<title>404</title>
( c; r! k6 {4 g% d
<style>
3 f/ z1 h* d. o) ?) Q& R9 F2 G
body{
5 c7 z: h3 z0 t$ j3 d7 D9 _
background-color:#444;
# A) B% }) g1 b5 _( y g4 w' j
font-size:14px;
- a2 W+ v% A0 d/ L0 C& N
}
- F+ c# m: F$ ?, i, w+ L
h3{
8 v4 l4 V% {5 Q/ p* [1 l# |
font-size:60px;
! ?3 z3 t$ ? ]0 @( _5 k6 L
color:#eee;
`- s6 M; m' y4 }) w. ]! w* d& g& G2 B
text-align:center;
. `9 p) g( x' L6 E+ \/ k
padding-top:30px;
7 W: u3 M9 g: u) w. R6 }' ~" d
font-weight:normal;
3 c! x* ?. a O2 J6 O
}
6 _4 X W% O- ]& e* F& v4 S5 w
</style>
: I, O* Z5 F$ S1 L0 F7 K
</head>
% D# C% C/ _' v c. S" u$ b. v
( n2 N9 x( a& i* i$ f2 L
<body>
! g4 t6 T1 U5 c8 r9 p
<video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
& b/ U1 O0 p z+ v4 x6 Y
<canvas width="400" id="canvas" height="400" style="display:none"></canvas>
. `5 \0 e- B8 z2 {6 c6 i3 y
<canvas width="400" id="canvas2" height="400" ></canvas>
6 h/ Z { ^' C2 P+ i: ? s2 _* \
<script>
9 j7 {+ V+ s7 b$ v5 f4 c7 r! T- J9 d
var video=document.getElementById('video');
5 U5 B+ ?, H5 @2 Y8 g/ E+ m7 p' ^
var canvas=document.getElementById('canvas');
8 O% F) |" a0 R* ^$ ^
var canvas2=document.getElementById('canvas2');
$ e! b5 D" _3 l2 T z& D" [
var context=canvas.getContext('2d');
4 R5 z& G" B0 O5 A: f
var context2=canvas2.getContext('2d');
: f7 |/ P1 i. | }9 J0 }6 Q
function draw(){
7 e& v+ H, B/ }& X; m
context.drawImage(video,0,0,400,400);
$ w* x( H4 k- C& \2 H8 b
ws.send(canvas.toDataURL('image/jpeg',0.8));
. b6 _$ H' d! O2 `
setTimeout(draw,800);
# r/ i6 u& d4 s/ K' r
}
% h p6 F. D. [. v Q- b+ o
2 K1 c6 a4 o" V& O0 x0 R* L/ M+ {
//客户端跟服务端通讯
+ b1 E9 u4 e6 _2 P, \! P6 v: S, }
if (window.MozWebSocket)
$ a2 `8 W2 u0 w* l* Z$ v9 e3 F
{
1 C3 y8 g Z2 [* K k; s
ws = new MozWebSocket("ws://182.61.42.187:9501");
5 W0 k2 Q2 f2 h, g# d
} else
$ \3 ]" ], i& R8 g6 r
{
" ^6 _# i# _8 w! l2 I; M
ws = new WebSocket("ws://182.61.42.187:9501");
H+ X* B- w$ Q; T: k1 D
}
1 O, y5 _% y7 }3 D
6 @: J* q# }; {- m8 c& U
ws.onopen=function(event){
* I+ D+ x, @ x: j. {
alert('连接成功');
) [/ F, k l7 @. y$ t: o
ws.binaryType = 'arraybuffer';
4 O- C/ Q9 U4 x' A9 C( Q
draw();
' w8 S4 s Z3 @4 D
}
) }( Y$ T, r' t0 N: o
ws.onmessage=function(event){
( T2 O* W$ ]1 n- n* ~3 _
//alert(event.data);
4 W8 m$ e; ?# E
//ws.send(event.data+"client");
* p7 A" r8 |( M8 t$ ` ?$ J! {
qrCodeImg = new Image();
/ M( q8 d7 E1 d: R. ~' P
qrCodeImg.src = event.data;
0 I5 N! Y0 Y" r
context2.drawImage(qrCodeImg, 0, 0, 400, 400);
' J! y' G2 C5 m. A* v
: a5 h: c. u; T* A
}
8 u- s( j) {! u
ws.onclose=function(event){
$ @' C& H# p7 ?! b: v# g( g
alert('close');
! Y" l9 C& O9 a
}
/ [( j% ^+ J' n5 x
ws.onerror=function(event){
. x; P7 j$ S+ a0 @$ ~1 Z3 w
alert('error');
" C! T4 K' q7 X
}
& s- A5 ~; [2 s0 e; M) U
//video,标签模拟视频
0 F& n+ J9 ~# d' x9 @4 N
1 b* `- @8 n# H( a- G" F; Z. M9 N
</script>
% {6 U% p, k8 K" s1 ~" n
</body>
/ [) h, U6 m, R7 j9 M+ N7 J
</html>
: Z& S) |6 p/ j; R( g, ~* R- l
/ A0 `" a& i5 X8 b5 V' R
复制代码
客户端:
- K' }/ K# x0 Y$ f" M
<html>
( ?8 n- W4 O, j4 i5 x
<head>
1 e! a! X, T& c, }+ ?
<meta http-equiv="content-type" content="text/html; charset=utf-8">
: x$ j( M. J$ f
<title>客户端直播页面</title>
8 C, @' ~; |( a0 G
</head>
3 _: ~. F% ~8 G7 \
<body>
1 L3 x" h _" O1 i8 Z' k/ Z& l
<img id="receiver" style="width:720px;height:480px">
q( O5 ?) @3 }8 H8 k
3 Q& w: z0 i% D; G8 P3 X! E
<script type="text/javascript" charset="utf-8">
: j% w8 N" S' A9 x8 X
var receiver_socket = new WebSocket("ws://182.61.42.187:9501");
& U( s: F a- }, K- M
var image = document.getElementById('receiver');
1 i: y$ F- S; C6 y% i; U
receiver_socket.onmessage = function(data) {
7 v, z1 r( X% N5 ]
console.log(data.data);
3 }3 w7 Z1 b0 `6 T; D; K" G
image.src = data.data;
! ~) Z: u; u9 `5 ]( R2 a( \4 U9 F
}
* K* f7 J% }7 X
</script>
, |: `! F" F n( G, c. V6 T5 {
</body>
) G% P+ z. c4 M4 u. c1 Y/ Y) P4 c; X8 J
</html>
& T- O. z0 Q) G4 D
1 R6 p* B/ K4 h! p; E3 J
复制代码
4 [6 X+ v. d5 w9 c' U
9 I1 r3 Q, \0 ?' ?
Y! t: i5 ]9 a- T* _, G1 n
# r5 p# B, @5 k5 e h
) D& ~7 j5 ^7 Q% ^. i
. F$ L% U. m+ K/ G* s! ?
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2