您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 11524|回复: 0
打印 上一主题 下一主题

[swoole] PHP大道至简之Swoole伪直播功能

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-31 19:50:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
伪直播功能Websocket服务器+ w3 {& j5 t* M) P: P2 a
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websockt服务

代码如下

  1. error_reporting(-1);  
    4 V' @9 ]- K% m' C1 j
  2. //创建socket服务7 D, q: i( a/ a" k: B, H) S
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    1 y( o8 e6 Y% T7 \
  4. //监听WebSocket连接打开事件
    ; c1 l+ Y$ e8 J
  5. $ws->on('open', function ($ws, $request) {1 Z, {) |6 v1 n" `3 R
  6.      var_dump($request->fd, $request->get, $request->server);
    . z* }5 y! i6 C/ L7 @0 h6 x
  7.      $ws->push($request->fd, "hello, welcome\n");
    + r; g; N- c2 T  q2 }$ u
  8. });
    6 b/ c$ m: F% p

  9. 0 R) F( R9 e8 C9 P  l: c
  10. //监听WebSocket消息事件
    $ }0 N. R$ ~5 U$ E
  11. $ws->on('message', function ($ws, $frame) {
    - H) [: y6 j' G* e2 k0 |$ h
  12.     //推送消息给所有用户
    ! H9 _+ B6 m1 `& f* ?0 Q
  13.     foreach($ws->connections as $fd){
    5 n7 x9 U9 b* c5 d
  14.         $ws->push($fd, $frame->data);* F4 M0 W- U1 l4 L$ C) W$ q
  15.     }
    " g1 v* {2 k2 |, }$ W. l/ T7 O
  16. });
    7 h# U% [0 Z9 H

  17. ' }+ f) S2 I% s. v; @
  18. //监听WebSocket连接关闭事件: q+ p' A' S1 B6 Y
  19. $ws->on('close', function ($ws, $fd) {: A, t' ]$ M( k+ h
  20.     echo "client-{$fd} is closed\n";
    6 A0 y( o! F8 t0 f* M+ ?, l3 Z
  21. });: X! K" Y" D# G9 T0 O: N
  22. //启动服务8 c) g( e1 R# b  T5 p) Y
  23. $ws->start();' D2 f( @, L8 q% b
  24. 6 _) B* c! r0 V6 P. K: L- G
复制代码

- u( X' |5 z" w" SWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
) n! y. }; u' v; F! x$ d( @/ N" z

代码如下

  1. //连接服务器
    6 b1 T) [: K% F$ k/ `
  2.     const socket = new WebSocket('ws://lm.com:9502');9 g: l- x3 C: b( z- p7 j: X1 }, ~
  3.     //Connection opened) M' h4 V* i( q& P( d% R1 J- J3 M
  4.     socket.addEventListener('open', function (event) {4 {* e# J  `: J- s' a/ w5 B$ z" ], [4 O
  5.             //发送消息给服务器# m: O4 H# F! c
  6.         socket.send('Hello Server! im websockt');
    3 U  {. T7 Z0 i' n% [2 z+ }
  7.     });
    ! d2 N2 P/ M6 B- ^$ o! {! d4 L
  8.     // Listen for messages
    5 L7 a4 [+ r( u: x0 s$ f  [
  9.     socket.addEventListener('message', function (event) {4 w: i  ?  Y+ h( B3 \" x
  10.             //接收服务器返回信息1 m) I5 m  F( m1 s6 w! P4 a: i
  11.         console.log('Message from server ', event.data);
    1 [( c) Z* b- S0 D
  12.     });
    4 U/ n3 o. e; S( T' X5 U
  13. 2 \- i2 ]) ?+ R  S
复制代码
伪直播主播页面
3 x: Q" A5 U# G! }/ H7 o

html

  1. <body>, y; e, `) p- l# v$ k
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>- \( \  }( n$ y  C% k* R- c
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">2 _9 U5 |: P: c4 z! G7 ?" p
  4.         画布9 v* n6 ?* ]# s, F( `. y9 b- U) {
  5.     </canvas>
    7 q9 |3 K, \* ~, K( j
  6.     <img src="" id="videoImage" width="350" height="700">. A1 |: C/ }% M( C( a/ t: o8 Y
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>8 p( d1 B4 c/ Z3 [
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>* V# |. Q6 h4 |- p% t
  9. </body>2 j( ~* j7 S/ r& \1 u* f; Z! c6 J# l
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    # ^+ g& `" u8 J
  2.     var c = document.getElementById("myCanvas");" d9 O5 X2 x2 i+ I
  3.     // var c = document.createElement("canvas");/ }% r( b5 s4 w* r
  4.     var img = document.getElementById("videoImage");
    6 d. b* ~- U3 v# Z
  5.     ctx = c.getContext('2d');
    3 o" U  s7 T0 n- U+ F& d% B  x/ B
  6.     var dataUrl;' X4 ?& k" B1 V* \. ?' y: j. t
  7.     const socket = new WebSocket('ws://xxxx.com:9502');' B: F* T  V* B& V% k; ~* J
  8.     //Connection opened
    + r. i! b2 c* ^  K9 g& L( Z
  9.     socket.addEventListener('open', function (event) {' V' F+ J* E$ l3 B5 F
  10.         // socket.send('Hello Server! im websockt');
    ( r+ |2 ]) _# x  G
  11.     });# N5 h# Z7 v* S% {1 Y5 B- o
  12.     // Listen for messages
    - \5 W- W4 l8 h0 P3 c
  13.     socket.addEventListener('message', function (event) {1 Q+ F3 M- p; R% p$ L1 c- I+ v& j9 y
  14.         console.log('Message from server ', event.data);; O2 p8 u. z9 K  ]5 \# i
  15.         img.src = event.data;# p( d3 ^: a" Q" q+ f
  16.     });
    & {$ e7 {3 w+ @; W7 o6 f$ l
  17. & Q: [6 R0 d" c
  18.     function playVideo() {
    3 t0 Z. g" k9 I  e) [) I2 s
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    3 L  _2 I: V9 h, R+ l2 U/ D
  20.         dataUrl = c.toDataURL("image/png");
    8 v- e5 S' R3 K( g& D! ~
  21.         // img.src = dataUrl;2 y* F% x/ Z0 l# ?" r2 X
  22.         socket.send(dataUrl);
    6 E$ A. Z0 Y% v5 o: F" Y2 l( z2 B3 \
  23.     }
    ' O2 h5 U) e: Y  y
  24.     var tick;1 p# T# ?: H+ }% T
  25.     function aphla() {$ q& i) l% B) x+ p9 H. l
  26.         tick = setInterval(function () {$ V$ ?. k. J6 y
  27.             playVideo();
    . h1 i; t/ s: E1 P
  28.         }, 1);5 o% F* K/ w: A# p
  29.     }, `6 y) Y  J. ^
  30.     function vdStop() {4 {! V1 i0 h) |8 L( m0 f7 Q/ t6 Y! k
  31.         clearInterval(tick);
    $ E' v4 P4 {  f- T" e2 N2 y
  32.     }
    3 a2 E" G3 B* {5 k2 G3 V1 ~
复制代码
用户页面
( i9 W; |8 Y' p

html

  1. <img src="" id="liveImg">
复制代码

javascript

  1. var img = document.getElementById("liveImg");
    ) W* S2 Q' t& X
  2.     const socket = new WebSocket("ws://lm.com:9502");
    # ~; b9 ^7 w  N9 }
  3.     //- ~3 o6 A+ l( ^
  4.     socket.addEventListener('open',function(){4 I* D3 M3 Z  x1 O3 }
  5.      socket.send('Hello Server! Im live.html');8 _; O3 H+ _6 N/ h/ a- Z
  6.     });
    . k$ k, E' F* Q9 Y3 q6 b- N
  7.      // Listen for messages! j$ K/ ^3 a, |7 J7 `: x# B& q5 }
  8.     socket.addEventListener('message', function (event) {( p+ }; n; X; \( y  a$ L
  9.         //图片地址6 D1 k: X: i) Y! X; v4 r" K( `, i
  10.         img.src = event.data;
    8 T: Q. A# H; s9 P$ _3 t- I# R
  11.     });0 z8 M" S9 k& c$ |4 N, e* ]
复制代码

真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法


& f" f: n/ g! L8 E$ J$ r2 ]5 @' h7 e7 l
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 14:48 , Processed in 0.120867 second(s), 20 queries .

Copyright © 2001-2024 Powered by cncml! X3.2. Theme By cncml!