cncml手绘网
标题: PHP大道至简之Swoole伪直播功能 [打印本页]
作者: admin 时间: 2020-3-31 19:50
标题: PHP大道至简之Swoole伪直播功能
伪直播功能Websocket服务器
) o. \) } F2 t- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下
- error_reporting(-1); 5 y. t* `- d9 h: P: u+ B$ q
- //创建socket服务! A" H; [7 T1 w) \& |7 V1 Z" E# d
- $ws = new swoole_websocket_server("0.0.0.0", 9502);) b9 x9 B* C% C. W) a2 _& k
- //监听WebSocket连接打开事件4 D* \5 v* }' {0 L- x5 Z
- $ws->on('open', function ($ws, $request) {+ o8 u& n& P* ?2 h7 |0 i
- var_dump($request->fd, $request->get, $request->server);
0 x6 {5 K7 q3 ~6 n+ w1 b. T - $ws->push($request->fd, "hello, welcome\n");" N. J- J5 M( ^' _
- });
( v6 L& q5 i) N7 U( T5 m - 6 |7 }, ] R2 S5 _9 ^' l1 q
- //监听WebSocket消息事件8 ~% u7 k. w: h+ i! X
- $ws->on('message', function ($ws, $frame) {
* E6 `- C/ f" t5 R; s( @6 B - //推送消息给所有用户
5 b0 k* }( G* b1 j$ G& Y# B - foreach($ws->connections as $fd){
# c# e" P/ n2 P - $ws->push($fd, $frame->data);' ^! c6 Z7 F) w# q1 F$ \- _+ k2 f
- }
5 ]5 c, K8 R) i I% _+ ~! \* P, N - });
, x& |) I* E* r' R - ; z6 ^- C7 c" G% e2 }- T
- //监听WebSocket连接关闭事件! p" p- [5 v: X! i
- $ws->on('close', function ($ws, $fd) {
U+ L) n$ J" y5 Z2 _ - echo "client-{$fd} is closed\n";
8 t4 |% t J0 r Y0 z' x - });! V- {; P. q- O. ~7 {
- //启动服务
4 o0 `3 j5 Z: }3 o# V - $ws->start();6 Q% L2 _# \0 I& Y0 n
4 R: O+ b0 Y1 J
复制代码 3 g2 G3 X9 J4 ^. a5 y+ B1 {0 }
Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端0 {: ]# d& q: ]/ V2 |/ X `( r! X6 `
代码如下
- //连接服务器. d# X, ^& v7 \. Y0 q/ m
- const socket = new WebSocket('ws://lm.com:9502');
7 w3 {# A- p, E" W - //Connection opened. u7 Z: v5 a7 S& e
- socket.addEventListener('open', function (event) {& }! V9 n& E& M. v8 C. U" O6 d
- //发送消息给服务器
4 {# g, A1 ?3 V - socket.send('Hello Server! im websockt');& T2 p! X/ W% _+ w3 G
- }); e; ]$ N+ k( O1 Q
- // Listen for messages
6 e2 X3 Q6 U% P( h - socket.addEventListener('message', function (event) {* J" B l1 }5 S7 s! D" }) B
- //接收服务器返回信息0 c: [9 B$ o& @# \. k' l( @
- console.log('Message from server ', event.data);
' ^& x# K# t' K, x6 V; B - });
+ `" Q8 t: g1 w# [" {# G- ] @. S- s - , X* Q% K+ y9 q6 _! |9 p2 H. I
复制代码 伪直播主播页面
Y/ T: d% \; v0 A) c# d- uhtml
- <body>
. E7 K. u! Y) | - <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
6 `; c5 p/ g r$ ?; ^ x4 y - <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
! D, J3 f5 W0 q( n - 画布
. B/ q# o: h9 b4 G, l r( n - </canvas>
' r8 E& v% t( r3 O - <img src="" id="videoImage" width="350" height="700">
+ l* ~8 W9 Q! I2 Z - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>' ]' G! l. {1 P
- <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>! i, `: J" |0 I2 w2 E# f: u/ n
- </body>+ m4 `5 }: t% S& o$ R
复制代码javascript
- var v = document.getElementById("myVideo");, o4 |% k3 `# c9 z" Q
- var c = document.getElementById("myCanvas");; U% D/ E& X o$ K' w' H3 e
- // var c = document.createElement("canvas");
: I5 @3 K5 f/ D! `0 z - var img = document.getElementById("videoImage");1 D0 f, k5 p7 z/ [6 I0 }
- ctx = c.getContext('2d');
: R# ?6 H7 ?3 l' ?& R' D8 Z9 t - var dataUrl;
W( X0 }: e! Y - const socket = new WebSocket('ws://xxxx.com:9502');
+ ]0 n" u, Y6 I! O2 }- t - //Connection opened; e6 ]$ Y' K! J. l8 n( v1 ~
- socket.addEventListener('open', function (event) {
% R* c; D ~3 k6 l& G, M - // socket.send('Hello Server! im websockt');
- c5 B2 b6 a T( {* w3 L - });
1 B2 ~- r5 e& B% t8 {# g - // Listen for messages; P7 K H: O S& O
- socket.addEventListener('message', function (event) {
2 l, [. m+ [4 [/ V" z( { ]( D+ E - console.log('Message from server ', event.data);3 U: `9 i/ }0 I$ A, V0 L
- img.src = event.data;
! }! c3 Q+ W3 b3 k- K4 @/ @0 i - });
k" t5 k+ a4 [1 Z
9 q% k4 }& e0 _4 t- function playVideo() { D& I' o* {" y1 s9 I
- ctx.drawImage(v, 0, 0, 350, 700);6 m" ]7 F/ G# P$ Q# j; D! r
- dataUrl = c.toDataURL("image/png");
$ o; B3 A$ X, C" O+ Q7 T$ o - // img.src = dataUrl;2 Z8 m( u4 h" g5 I
- socket.send(dataUrl);3 \& k+ N6 P( @; ^, i: k0 c6 a
- }
8 g B# T. u3 `6 u - var tick;
* ?3 }: I9 t+ n5 J; L: ^" H - function aphla() {" o; j% d9 K7 ]: q! |+ Q: x
- tick = setInterval(function () {5 w. @7 r3 |- d6 z3 e0 D' e2 n
- playVideo();9 f4 d0 h) k; E
- }, 1);$ u5 i4 |( i% n6 |9 T" U
- }
1 r% e; A4 h( P: A - function vdStop() {8 E. Z {" O8 j/ k( n' ^
- clearInterval(tick);$ I. j5 ^8 }# M8 N( R" ^* r
- }
+ C7 D+ h8 z9 ~" A/ F- O1 e4 m
复制代码 用户页面& V* l/ n* t0 e' c( z
html
- <img src="" id="liveImg">
复制代码javascript
- var img = document.getElementById("liveImg");
( Q" f$ ~2 C P7 {! W - const socket = new WebSocket("ws://lm.com:9502");
' C4 p) M5 l2 Z/ y - //+ a$ {/ h( w& @* \- O
- socket.addEventListener('open',function(){( h& M/ S2 @6 S5 t3 P7 f
- socket.send('Hello Server! Im live.html');
0 l/ U. B0 O9 W; r7 R - });
- w, W$ b, y1 }' |, s; r* | - // Listen for messages$ I3 i+ m w' |$ h* x
- socket.addEventListener('message', function (event) {% r; }6 H/ u `
- //图片地址, T7 E$ M: H9 G$ k; _" C
- img.src = event.data;6 j4 L2 V. N p5 H
- });8 I* Y8 G$ e8 l5 [; A! t
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
" F, R; \' D4 B+ f. g7 w
9 i' c8 U2 O, S( }6 B7 a* v2 V1 r. G
欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |