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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    3 ]+ l* h1 l: h5 x) i7 f
  2. //创建socket服务
    * n8 M* t) h: y* Q: D" b% i
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);* o8 h, K& \4 l: I. d: P
  4. //监听WebSocket连接打开事件9 M* M  i  `; T
  5. $ws->on('open', function ($ws, $request) {/ Q9 j) z9 p/ @" z
  6.      var_dump($request->fd, $request->get, $request->server);
    8 I/ S. _( B. d/ G3 E! O0 ]
  7.      $ws->push($request->fd, "hello, welcome\n");; V7 g* ~" a! ~
  8. });
    : P. H5 |6 O: G% }- }: D0 ?: s: \* u
  9. 4 x; R, S$ m9 h+ K
  10. //监听WebSocket消息事件# ^  K. N% N6 Q
  11. $ws->on('message', function ($ws, $frame) {
    ; A. w5 r  ~6 Y1 V) E4 z
  12.     //推送消息给所有用户! u. d" N2 K7 f9 D: V( Z1 |
  13.     foreach($ws->connections as $fd){( @. |# l7 n$ \/ F7 }& N- W
  14.         $ws->push($fd, $frame->data);
    + R- a8 ^9 M# D# _$ ~
  15.     }. x/ Q: r+ N- h5 r) h
  16. });
    , ]  d; [3 k) q. \9 f

  17. 1 U6 F/ N+ w2 j# Q3 c! T/ ]
  18. //监听WebSocket连接关闭事件
    : z; g7 d, f& \5 H
  19. $ws->on('close', function ($ws, $fd) {
    : h* Q# q8 H# l+ I% f/ a
  20.     echo "client-{$fd} is closed\n";
    : V, l+ T3 a9 Q) O. z
  21. });
    # _4 N' I6 {) ~" I4 l
  22. //启动服务' z3 L5 `" b9 C, {% x7 t
  23. $ws->start();. c8 R/ T- ?9 [* \0 P
  24. / `9 B/ U6 E0 s9 J/ m
复制代码

# X* Y1 ]! A7 _' Z7 {/ D! |Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
* H  z9 L  t8 D# H

代码如下

  1. //连接服务器
    ' y! d4 C3 a+ T7 m. M% b! x8 B) C
  2.     const socket = new WebSocket('ws://lm.com:9502');( k- _3 p7 X; r* G; k% @: B
  3.     //Connection opened
    6 ]( D! D* m  d( m
  4.     socket.addEventListener('open', function (event) {( U* |- z6 C/ L2 F
  5.             //发送消息给服务器3 Z+ L3 m& K% b+ a% J; c6 J4 B
  6.         socket.send('Hello Server! im websockt');
    6 u9 ^. R7 D3 ]$ B
  7.     });
    8 e' T8 B+ Y2 q7 d+ t& a4 M& M
  8.     // Listen for messages! @* e- S9 w" H% O0 I
  9.     socket.addEventListener('message', function (event) {8 J! s) m* {$ F
  10.             //接收服务器返回信息
    3 X) x+ H1 G! V1 T
  11.         console.log('Message from server ', event.data);
    7 A. w& {. U7 A: d( ^$ O& D
  12.     });; C5 }% g0 ^! Y9 S+ K

  13. ; g1 X* c" R# D6 U% P& w- A* C# V
复制代码
伪直播主播页面+ W! L4 q( r% s8 O' {" J" f- o

html

  1. <body>
    7 h6 ~0 Q' y3 W. [
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>" |, {9 h7 M1 x4 L7 O1 h
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    ; S( R; C7 ~1 @1 ^1 p% }: B- _
  4.         画布5 V0 e! ^/ D* ?- g/ w- a" m
  5.     </canvas>0 P& O2 W! R; J( Y# ?5 m
  6.     <img src="" id="videoImage" width="350" height="700">6 @$ ?; Z$ \* T# Y  g
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    # Y! i" F" z* Q/ P9 r
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    ; h2 o3 h  A' M8 J5 e1 H! u
  9. </body>
    ) {3 i# Z1 w" ]7 ]
复制代码

javascript

  1.     var v = document.getElementById("myVideo");1 H5 u5 |, c0 ?1 [0 m
  2.     var c = document.getElementById("myCanvas");
    2 M1 ]( _! X0 m* b& Z/ U
  3.     // var c = document.createElement("canvas");% I+ Y( e# X' o8 Q9 L
  4.     var img = document.getElementById("videoImage");' e6 U; h5 v5 I# B0 g7 I
  5.     ctx = c.getContext('2d');0 O, D: ?* {& ~0 r, h8 m- g
  6.     var dataUrl;' q% {' j0 X2 N7 z4 I. e
  7.     const socket = new WebSocket('ws://xxxx.com:9502');  s& k8 C; W( l
  8.     //Connection opened' J- Q2 H8 K8 H8 y0 v% {2 u7 N
  9.     socket.addEventListener('open', function (event) {- d  O6 N2 j& n& a+ R2 r* x+ C
  10.         // socket.send('Hello Server! im websockt');. V  i& J& [6 ?% H  S% c
  11.     });
    % C0 T) D. {7 J( m  k
  12.     // Listen for messages' x8 v# v% P0 G, b' R0 t$ v
  13.     socket.addEventListener('message', function (event) {
    & `2 z3 J/ Z. J1 o- \! t/ x# _
  14.         console.log('Message from server ', event.data);
    1 \, h* `5 y2 G" L% G, W) T
  15.         img.src = event.data;
    - V4 x: B( w8 e0 V
  16.     });/ d2 |5 ~/ J) `% s5 |, _/ y
  17. 7 m9 c) [  M) \# `0 ?
  18.     function playVideo() {
    . O* t; V! t  L$ D
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    6 H8 z6 F5 K7 k6 d2 j
  20.         dataUrl = c.toDataURL("image/png");  Q/ \5 ?% l  \+ _  {1 V. X
  21.         // img.src = dataUrl;
    4 r* i$ c  V0 l0 t- @) [2 G* a# |2 t0 x
  22.         socket.send(dataUrl);
    3 p% X' \7 d8 w
  23.     }3 Q4 A5 ^5 r7 m  y/ y% I% {
  24.     var tick;2 a3 u8 I1 _$ A
  25.     function aphla() {3 l* F5 \' {  r6 e7 W/ z: `  Z
  26.         tick = setInterval(function () {  L3 k6 q" s: {- x+ n+ E2 c$ F
  27.             playVideo();% G2 Q8 A& n; y6 J
  28.         }, 1);) Y% ^: B/ [5 O8 d/ N/ @* Y
  29.     }- j3 E2 q& R( F# G
  30.     function vdStop() {
      t) G# w  g0 J0 x. L# X
  31.         clearInterval(tick);
    & ^$ n9 \; T4 t: t9 M
  32.     }
    , v% K, z. Z1 h
复制代码
用户页面0 q+ m+ J# b  d1 a5 n! D

html

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

javascript

  1. var img = document.getElementById("liveImg");
    * C! M3 D/ {: x1 X* q
  2.     const socket = new WebSocket("ws://lm.com:9502");5 @+ r/ Z* L, E- a% K9 I. L
  3.     //
    ' {, ^) w) e+ ?: i/ q. |
  4.     socket.addEventListener('open',function(){1 ~5 _% R3 H) k* Q0 ]2 o# h' X2 g" D* Y. [
  5.      socket.send('Hello Server! Im live.html');
    - [* d0 Y9 i0 t8 z% l: L( s
  6.     });% `+ i' `& C& P. A3 `$ P. m
  7.      // Listen for messages( ]9 F5 l" y* M+ w6 ^2 A
  8.     socket.addEventListener('message', function (event) {/ q3 z' T! C8 n8 x. K
  9.         //图片地址' G2 t6 z4 d5 V( x
  10.         img.src = event.data;) z* v. q' w. I) b
  11.     });
    . V! {  Q& Q) {; o! K5 I5 {
复制代码

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

& w& I9 K& p5 c& C3 A. I
9 r' J5 _% u2 M& @/ C3 d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-5-20 12:02 , Processed in 0.130600 second(s), 19 queries .

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