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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    $ o' v( }5 O1 \
  2. //创建socket服务
    7 _. v: y3 \1 D, g4 U1 t
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    # W* g2 e) v- b/ |% r; o0 j
  4. //监听WebSocket连接打开事件
    ( o! F$ C8 K' D4 n
  5. $ws->on('open', function ($ws, $request) {
    9 j4 b) ?$ O& D, B9 P, I
  6.      var_dump($request->fd, $request->get, $request->server);+ E* i2 }4 j- P$ u1 d6 M
  7.      $ws->push($request->fd, "hello, welcome\n");" b3 @& ]) V1 y
  8. });! l" I6 b/ W' i2 [2 L- Z
  9. 8 |! R2 h- p4 n  G% o* F% f
  10. //监听WebSocket消息事件
    0 f. {. R* I# j  x& k$ z
  11. $ws->on('message', function ($ws, $frame) {
    5 v7 C1 Z) Q# D9 v3 ?
  12.     //推送消息给所有用户
    , d4 J3 J! r$ ?8 }. _3 A0 A' x
  13.     foreach($ws->connections as $fd){
    9 w" g# h& v  I( A* }8 T
  14.         $ws->push($fd, $frame->data);  D, c: p, I- h# H3 @& u# r
  15.     }
    ' y% ]: p& c  _1 i  }- u
  16. });2 S  W: _1 d1 d0 A: Q+ h
  17. + u3 z; w$ g$ g  K) @* V
  18. //监听WebSocket连接关闭事件0 `: G% J5 D) x/ L) q# Z
  19. $ws->on('close', function ($ws, $fd) {
    8 D) x; a9 B5 H' b( s
  20.     echo "client-{$fd} is closed\n";# L! M- o' d2 P" S
  21. });/ H2 P- u+ q0 g! H. e
  22. //启动服务6 }  N; c$ y$ X5 u( r
  23. $ws->start();- e) J6 h; m- ~& d- Y: E

  24. 4 D: Z5 C7 @  L) e  s* q/ f$ B
复制代码
6 D* ?6 @' X. Y: G; Z- q! l3 {
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端( |# t3 P$ u) ]- t

代码如下

  1. //连接服务器
    ( O% ^% [8 T: ^# p7 K3 U
  2.     const socket = new WebSocket('ws://lm.com:9502');
    $ H7 `% z  ]  f$ t0 ?. x: R
  3.     //Connection opened
    ( ?) w  i3 s( ]' J
  4.     socket.addEventListener('open', function (event) {
    ; ?. o* Z! N, Q
  5.             //发送消息给服务器2 t. S7 c- o7 ^
  6.         socket.send('Hello Server! im websockt');1 e$ Z( ~9 c' }6 J- a6 C
  7.     });9 R" O8 k0 W2 n
  8.     // Listen for messages6 n7 y) l) g8 Y( I0 ^2 P
  9.     socket.addEventListener('message', function (event) {# V3 F* s3 G6 D8 Y
  10.             //接收服务器返回信息
    9 I- D9 o  p: |: U! `8 t
  11.         console.log('Message from server ', event.data);
    + H: h" c: R/ Y& ]: k
  12.     });
    " t. O* N' d1 M3 q* v

  13.   ]4 @/ D  ^8 T4 V! n+ r1 p& i
复制代码
伪直播主播页面
! F. s# p' r; P. r2 Y

html

  1. <body>0 O& h- r- i& b
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>7 D* r8 ]1 C2 C' p$ s9 Z2 i
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">+ p1 g8 ?' `4 n7 j9 S
  4.         画布0 D6 _! E& m. \3 t
  5.     </canvas>
    , h- z+ S" W7 \- q3 B3 d) w5 A" D! E
  6.     <img src="" id="videoImage" width="350" height="700">4 V1 a+ k6 K; k7 b) P2 k0 I9 g
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>& t9 D+ g  _5 R. }! B: n
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>$ g! Z, b# X. t; M) p) F. j
  9. </body>
    ; c. R+ s) I7 n
复制代码

javascript

  1.     var v = document.getElementById("myVideo");" Q  a4 N* t4 K/ c' H
  2.     var c = document.getElementById("myCanvas");, i6 x6 w" X- \; [' n4 c% A2 Z
  3.     // var c = document.createElement("canvas");
    " p1 k! s% J/ g) W& \; a; D% Z
  4.     var img = document.getElementById("videoImage");" ?; K2 H" Y) J7 a. Y9 p
  5.     ctx = c.getContext('2d');
    * [6 M8 i7 @: ?" n+ r0 L  m5 L
  6.     var dataUrl;7 o% f( N5 H: J7 e3 v
  7.     const socket = new WebSocket('ws://xxxx.com:9502');1 b; }( S) P2 Z* Z/ I0 c3 P
  8.     //Connection opened
    5 d$ \3 P5 P- A1 u
  9.     socket.addEventListener('open', function (event) {
    1 T$ Q* J3 {+ Y7 h
  10.         // socket.send('Hello Server! im websockt');
    : ~" T, f  Z1 {* ?3 q
  11.     });
    * T" [; i% e9 t) ?
  12.     // Listen for messages0 [& @" k- |& t
  13.     socket.addEventListener('message', function (event) {7 s6 O5 x: S5 Z' X; l
  14.         console.log('Message from server ', event.data);! `1 z0 `: i6 U  \
  15.         img.src = event.data;
    % A( O9 D" a# N: b, }
  16.     });
    0 h# E( ]/ S7 G. e& m9 r# R- `

  17. # f% p1 b( K+ m2 e7 J" K
  18.     function playVideo() {2 ?) B1 m3 v: Y
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    & o8 z. _& ^0 G4 y& O/ [' H# j
  20.         dataUrl = c.toDataURL("image/png");
    3 N% r1 I1 q, u  j
  21.         // img.src = dataUrl;! i: k' C4 a1 ?' ]5 j" n8 D
  22.         socket.send(dataUrl);4 u; X4 i: h7 d" ]
  23.     }
    4 Q/ i+ g, `. ]8 `1 m
  24.     var tick;
    0 m. |0 Z' ]" Z; b/ e
  25.     function aphla() {
    & S" [% U* `: G  y) @3 s& O
  26.         tick = setInterval(function () {
    % F3 e# `9 Z$ `. M# L
  27.             playVideo();' p0 l$ R, B) O
  28.         }, 1);
    4 E; s( ~1 o  \  h
  29.     }
    7 H& E* D# y4 X0 z7 c
  30.     function vdStop() {
    , O- k$ X! w, f: G" c& _7 |) h* z
  31.         clearInterval(tick);) \& F" w+ M4 K, G; u2 `
  32.     }; a% _1 u$ n8 r2 w/ N  l
复制代码
用户页面
2 l$ O" r6 ~7 V6 Z

html

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

javascript

  1. var img = document.getElementById("liveImg");
    6 y  a0 s7 k# U4 z2 H3 l7 F8 [3 H
  2.     const socket = new WebSocket("ws://lm.com:9502");. H( Z6 P' p: Y3 |# ?6 }
  3.     //
    ' t3 {. r/ k3 v- R/ B! r  ~; h
  4.     socket.addEventListener('open',function(){
    2 g9 S  `% Y; x+ j/ a; Y
  5.      socket.send('Hello Server! Im live.html');( v, B* ?: u- Q- K( p1 H) E* l
  6.     });2 m, R, a% C: M& E9 ~  M
  7.      // Listen for messages) P, ~5 w( I# c# ~4 m6 [$ u  e0 C
  8.     socket.addEventListener('message', function (event) {
    5 r; q; A* I+ l1 \8 u* N* `4 L
  9.         //图片地址
    1 f0 |% O: Q/ i  m$ D: P
  10.         img.src = event.data;
    9 ^$ T3 V, H9 G; g/ j; e
  11.     });
    ) C) i$ s7 i" m
复制代码

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


) B7 `3 x$ H/ M  t/ F" [/ p2 g! K7 L6 y* e
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-3-17 16:08 , Processed in 0.071104 second(s), 20 queries .

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