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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  2 T$ U2 ?, f& D6 k- Y
  2. //创建socket服务
    2 U: K2 w! r& N
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    ( g: h# n/ l, Y% X
  4. //监听WebSocket连接打开事件4 o* t; L8 c0 u, \' Z
  5. $ws->on('open', function ($ws, $request) {( W9 _6 _; c5 D6 n, g& Z
  6.      var_dump($request->fd, $request->get, $request->server);" r- c- b% {- z9 a
  7.      $ws->push($request->fd, "hello, welcome\n");
    3 O' `: }5 Z+ u! c) e7 F. Y
  8. });
    ' b( u: ~) x# R. U/ P  @, h

  9. , A7 c5 H+ k6 G& f3 O* G
  10. //监听WebSocket消息事件
    7 S3 U* b* r+ N
  11. $ws->on('message', function ($ws, $frame) {
    " \! e/ x1 |" B# n
  12.     //推送消息给所有用户
    ) O& e" @- ], f. v9 a% X
  13.     foreach($ws->connections as $fd){
    & E( f+ ^- k% }# B! |, H
  14.         $ws->push($fd, $frame->data);, D9 u* z6 ^6 S: h  M
  15.     }
    $ V5 A5 O3 R0 h& S# \
  16. });# r+ R+ t! s( B- u$ n

  17. , K  a2 s; e- J& R
  18. //监听WebSocket连接关闭事件
    8 }# S6 J# g+ o( {* \8 P! c
  19. $ws->on('close', function ($ws, $fd) {
    9 t0 w0 G! b! N% ]" F6 {
  20.     echo "client-{$fd} is closed\n";
    % v- h( i6 M6 J1 u7 D- n* T$ L
  21. });9 k3 J1 x3 T9 i* ~, ]" o
  22. //启动服务. J: \# }0 e! ~1 ^  ?/ }
  23. $ws->start();) R- P- l, b( {' g( B( |' j
  24. & p" U# K* O( s# G
复制代码

/ \3 Y* [) @- E0 Y4 x; a) IWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
- p/ m4 w( _; v3 A" q& N; Q: G/ U

代码如下

  1. //连接服务器2 p* o0 G' V+ E/ w
  2.     const socket = new WebSocket('ws://lm.com:9502');
    % u$ E9 x+ I$ z( o% z: @, `$ J
  3.     //Connection opened; K6 @8 X  c9 X8 T
  4.     socket.addEventListener('open', function (event) {
    9 J4 d. B0 ~" r7 W4 p
  5.             //发送消息给服务器
    6 u; Y" A) r4 Q2 Z8 Y
  6.         socket.send('Hello Server! im websockt');; {5 o% D* q  Q! y6 z) k1 E3 u2 S. U
  7.     });* ~0 e% ]" O2 L  o* G
  8.     // Listen for messages8 f" v. ]; J" }% T2 j
  9.     socket.addEventListener('message', function (event) {
    ' N( q9 l- ]7 y% g8 `* c
  10.             //接收服务器返回信息/ R2 H2 Q" ^6 M/ ?
  11.         console.log('Message from server ', event.data);
      x- {1 w6 D. E! A
  12.     });
    7 g- `: o8 z$ S, \/ c4 G2 _$ x
  13. 0 \/ F+ u8 q+ j) p  j  F3 o3 }' W' S1 h
复制代码
伪直播主播页面* @4 J5 _" X6 t

html

  1. <body>
    3 }! P# a8 o! T" f
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>4 y: G4 M5 W0 T% E, G
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">3 L% t) X6 W/ D# `: n. i$ N
  4.         画布
    , z1 d6 b  r, L; R
  5.     </canvas>
    / L& |( @- h& F) f. @3 l. e, ]$ U
  6.     <img src="" id="videoImage" width="350" height="700">3 m  P# Q/ A1 l# b: N6 d
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    - I* z4 T5 v. a( C$ s$ R2 z. I! H, R, D
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>" K  R: s7 G. |: A* W' P1 J8 h
  9. </body>
    . e0 h! t/ F8 b$ \. @! }$ f% S8 R
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    3 {' }" @1 D7 ?' b/ D' O
  2.     var c = document.getElementById("myCanvas");9 w: j8 V2 v6 o2 n* J5 W
  3.     // var c = document.createElement("canvas");- i# }4 S6 j* u4 y' b8 P. A% d4 H2 ~
  4.     var img = document.getElementById("videoImage");
    ) q- ?/ r0 J9 p9 v" @8 g
  5.     ctx = c.getContext('2d');
    7 E( y! `, Z3 V
  6.     var dataUrl;
    5 A6 q' ~! }$ I' O% }) V( n" Y$ U  N
  7.     const socket = new WebSocket('ws://xxxx.com:9502');( ~  c3 v) p* W1 j( [% N
  8.     //Connection opened
    3 J& R2 m/ `' X3 \: U8 a
  9.     socket.addEventListener('open', function (event) {
    / V6 @4 ]  d5 [* Q% U8 i
  10.         // socket.send('Hello Server! im websockt');
    % b0 g6 h5 c# ~
  11.     });
    ) }. s7 f; h# M) z4 }" m$ u: r0 q
  12.     // Listen for messages
    9 ?/ q6 S; s) |* n5 e* `1 D
  13.     socket.addEventListener('message', function (event) {
    8 |6 [3 e; }  K
  14.         console.log('Message from server ', event.data);
    + m* U4 ~. l$ h* }6 w& g
  15.         img.src = event.data;; ]! b5 A4 X# A- ^% H3 X, B
  16.     });0 Q  S" r# M/ `/ `; w3 B
  17. 3 Y# D, O0 L' a# _2 j
  18.     function playVideo() {
    , _* q& p# F. O
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ) \2 n2 G) v5 K
  20.         dataUrl = c.toDataURL("image/png");4 Y6 P' h2 }) t8 I  W; q2 X* O
  21.         // img.src = dataUrl;
    5 S+ I8 T/ H2 }  E' {/ h) r- S; D2 v, v
  22.         socket.send(dataUrl);
    9 q) h  _, U. J- u
  23.     }
    + h; K" o' A+ l1 s5 R+ s8 G6 h, y
  24.     var tick;0 E$ k- t  |7 V. _  i# F  \/ O2 |
  25.     function aphla() {
    7 q. n( I, H- y" K9 _
  26.         tick = setInterval(function () {
    0 u7 q' j  S$ w# F3 c
  27.             playVideo();
    ; f! N' Y" u/ l. j: ]- J0 V
  28.         }, 1);
    ; D- A2 s! h" T6 R# ]
  29.     }) `- d( x) W6 \, |
  30.     function vdStop() {1 v# @* {& q! R+ p6 H0 O
  31.         clearInterval(tick);3 Q9 I$ W& a+ {. l
  32.     }* E& g5 [6 J( w1 {' l9 x$ V4 A( F
复制代码
用户页面" L& A, b# Z  r, N: N5 @8 G. m9 a

html

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

javascript

  1. var img = document.getElementById("liveImg");) N9 X0 g6 O' m9 V3 n9 C& f: F) C. z; V
  2.     const socket = new WebSocket("ws://lm.com:9502");# k9 ]! v! m. V8 }
  3.     //
    , ]. f5 m" v: }4 u# O' J4 Y/ D
  4.     socket.addEventListener('open',function(){- Z, c$ {4 q2 l* N* l
  5.      socket.send('Hello Server! Im live.html');! V8 E8 J6 C% [; T3 \9 V8 c
  6.     });
    2 l( V$ X, p, C+ A
  7.      // Listen for messages6 F+ B3 O, k# ~( |( i* A" w
  8.     socket.addEventListener('message', function (event) {
    1 Z) u. F2 p+ |. s1 [& k  `% W
  9.         //图片地址
    + Q$ j" P) k& e, c2 T) ?5 B
  10.         img.src = event.data;
    ) g7 X$ n  v0 `; l8 N
  11.     });' H& y7 j( f" b4 M, U5 e
复制代码

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

& n. ~9 h0 J: C& n' ]6 E

; F5 z. R+ @3 h; Z6 Q/ m8 G
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-26 00:13 , Processed in 0.126727 second(s), 21 queries .

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