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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    0 j! L: D& s% |  z' R
  2. //创建socket服务
    ; [# Z% V* i) ?& B/ t. O  |( S
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);7 s' g/ l' [) _5 H: A
  4. //监听WebSocket连接打开事件
    5 N" B# K4 o5 `* P) t- S
  5. $ws->on('open', function ($ws, $request) {" K$ P6 F0 C1 f! g* F% ~/ R
  6.      var_dump($request->fd, $request->get, $request->server);3 s9 D: n, O* [, u( z
  7.      $ws->push($request->fd, "hello, welcome\n");  \2 x8 w6 X( ?' R# d. @
  8. });3 H9 i3 q, I! K
  9. 0 N& v  [: X; u  y% ~& X  E
  10. //监听WebSocket消息事件6 v" [. ~. b# X/ U
  11. $ws->on('message', function ($ws, $frame) {
    2 ~) D& ~+ K$ t0 P3 C7 [
  12.     //推送消息给所有用户& B! Y9 K" E. s# Z# m( D) G
  13.     foreach($ws->connections as $fd){+ [$ {+ {+ U1 A- A# X
  14.         $ws->push($fd, $frame->data);
    ( n9 w) N  O; w7 q& D7 B! s
  15.     }# b1 r% c3 h( K0 t# j7 \' Q! V
  16. });6 c$ d- f! o6 S) b
  17. # P, @. J7 Z2 M% {( p  W6 ?
  18. //监听WebSocket连接关闭事件$ H! W: b8 z; ^9 p; Y& w+ ^
  19. $ws->on('close', function ($ws, $fd) {1 x; U2 a0 b( I; k/ [
  20.     echo "client-{$fd} is closed\n";
    ! l) Z4 O: Z* P/ G1 R2 j- o
  21. });4 T5 `# |3 x; x, \# P6 M% B
  22. //启动服务
    / ]8 \# }) P- O! i
  23. $ws->start();7 B( t' v+ u7 W+ ^5 U
  24. % x% \/ d& T, o2 k% _9 K
复制代码
7 i9 J7 v( W1 k! q
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
& o1 o' |. H; L3 S

代码如下

  1. //连接服务器5 T9 M4 E! i$ K. y4 a- S" }, J) n5 C
  2.     const socket = new WebSocket('ws://lm.com:9502');
    6 ^3 T( `7 j* f8 ]; f" r
  3.     //Connection opened
    " n  ?% m# H" M: e' L7 {" D% B# s
  4.     socket.addEventListener('open', function (event) {, p1 [2 {' ~' f/ ~' u  Y; l7 Y- y' v
  5.             //发送消息给服务器
    ! C4 ^0 K+ S# |  H6 j) p
  6.         socket.send('Hello Server! im websockt');
    6 ~* |8 K! M. K
  7.     });) j) l( r5 a0 E9 ]8 M
  8.     // Listen for messages) f5 g4 [* b; S# V5 @
  9.     socket.addEventListener('message', function (event) {3 W5 c2 J! J: q- _; r# o5 Y) L( l
  10.             //接收服务器返回信息
    ' ?  X( F) }% f8 q' M) ^
  11.         console.log('Message from server ', event.data);
    $ c0 s; t1 i% K
  12.     });
    ) m" ]/ p, ^) H1 E2 o: k! o

  13. ( m" O- t$ C, C
复制代码
伪直播主播页面
; l' T9 w. H* X

html

  1. <body>4 H  x% b+ d- R9 n8 V2 O- e
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>" j. ^- c8 e$ J: }: h3 @  X
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
      Z9 T% P3 ]6 K0 \
  4.         画布/ z: }, C9 G5 D% _9 }; {+ M
  5.     </canvas>
    8 P0 W! U! p8 R) n! Y
  6.     <img src="" id="videoImage" width="350" height="700">
    ( G. a; k# Q) A/ O
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>0 Y" x( W( x; C8 R
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    . q) |7 d8 U+ Y: |5 {: {1 l  G
  9. </body>9 L/ z2 E. p. Y3 V9 i+ W: e& n" x
复制代码

javascript

  1.     var v = document.getElementById("myVideo");: m& `4 ~3 T& v, W3 U% I' b7 @
  2.     var c = document.getElementById("myCanvas");
    - i0 @5 N! `, x6 @( Q
  3.     // var c = document.createElement("canvas");
    5 V  x* G- @1 ?) l9 R
  4.     var img = document.getElementById("videoImage");
    9 m  u" j4 k2 |+ i7 l8 |4 a
  5.     ctx = c.getContext('2d');
    3 J3 Q% K+ W! X7 D9 m- S
  6.     var dataUrl;
    3 L' ]/ H' P: W) q; Z
  7.     const socket = new WebSocket('ws://xxxx.com:9502');3 R) q/ a! G6 ?- ^3 e0 u" E5 F
  8.     //Connection opened
      F* D  M/ q. X/ R& Y
  9.     socket.addEventListener('open', function (event) {
    - m. N% f5 z& x% W# D$ U9 ^
  10.         // socket.send('Hello Server! im websockt');; S( c5 V7 Z! I- P$ B
  11.     });
    - |5 M/ ^6 r9 I8 A- w
  12.     // Listen for messages
    % C2 }* |- B# C( m9 g( m5 O6 R
  13.     socket.addEventListener('message', function (event) {
    $ }% a) d# _, ^) ?
  14.         console.log('Message from server ', event.data);
    # R) B% d1 x5 n: X5 e, B0 [# {4 _  U
  15.         img.src = event.data;7 V% M/ F, l2 m" d! {5 u" s
  16.     });- n6 X( u1 A+ e; o

  17. ' W! S7 H4 Y% l0 k' D
  18.     function playVideo() {
    # c% V" O, k" K4 Q
  19.         ctx.drawImage(v, 0, 0, 350, 700);  S0 L0 }) X6 x6 j1 E' q1 A
  20.         dataUrl = c.toDataURL("image/png");0 o* r, h: G: t' r, |! J
  21.         // img.src = dataUrl;8 L% Z3 X+ B0 U6 V
  22.         socket.send(dataUrl);
    / W# j* V7 s" b( Z3 h% U! T
  23.     }+ m9 |$ q- U# @3 n$ J$ H0 f3 C
  24.     var tick;' m, w( q+ M' I+ N7 _/ \
  25.     function aphla() {7 k  \2 m4 r  ^# S" s/ z, L
  26.         tick = setInterval(function () {# b3 [& u- I" Z' l  A
  27.             playVideo();; a5 B' n$ ?  @) N4 T
  28.         }, 1);
    * p! F3 v1 ]8 {0 `
  29.     }( ?8 t' e# @7 p
  30.     function vdStop() {- w% o' r; {" v1 y  T
  31.         clearInterval(tick);
      d; j5 k! L0 J2 q0 `
  32.     }
    9 o' m6 Q, a$ m6 N8 \
复制代码
用户页面, E  F: g+ Y1 K2 J% I

html

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

javascript

  1. var img = document.getElementById("liveImg");5 C0 ]) W" J9 P( W) Z
  2.     const socket = new WebSocket("ws://lm.com:9502");4 M  \3 K" i2 x, S( P& M
  3.     //
    ' o7 {  z4 l; Q0 y
  4.     socket.addEventListener('open',function(){8 s! `* n6 l# D
  5.      socket.send('Hello Server! Im live.html');1 |. S3 [% ?* e" F' [
  6.     });0 k- {' x; W0 L2 [, [1 C
  7.      // Listen for messages
    : l2 f) n( g" `. Q
  8.     socket.addEventListener('message', function (event) {9 p5 y; A7 m) u' Q
  9.         //图片地址* J2 V' M  [& L/ C6 H+ {
  10.         img.src = event.data;! C4 \# I# M% [1 y8 Y, Y
  11.     });
    : K, G; A: f0 A; J; Z* `
复制代码

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

& A, s6 W' W7 G; x2 E2 q: @8 V
9 |1 g& B- c/ n3 S9 ?& d
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-1-30 14:36 , Processed in 0.050666 second(s), 20 queries .

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