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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  ' v2 k& h" l6 g; a2 D
  2. //创建socket服务
    : r" j7 V/ R2 @7 G
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    - y- g) P# S# q1 U* Z8 B* B
  4. //监听WebSocket连接打开事件
    2 A* l% A5 r; ~8 W
  5. $ws->on('open', function ($ws, $request) {
    1 i0 a5 [9 m- S! l, G
  6.      var_dump($request->fd, $request->get, $request->server);
    * a; Y; [4 j% _- z' m
  7.      $ws->push($request->fd, "hello, welcome\n");
    * B; i3 L  ~% i! t+ h
  8. });8 V0 J9 P2 x7 e" p4 B
  9. ! ~2 g- J6 b9 U2 P: p
  10. //监听WebSocket消息事件+ I8 ^) i1 `4 z9 @1 }
  11. $ws->on('message', function ($ws, $frame) {% o) q4 ?* q- R" f" Q
  12.     //推送消息给所有用户( N0 z6 y* a# h0 H! ~
  13.     foreach($ws->connections as $fd){
    $ R; O2 W& H# q( L5 m1 g8 e$ c
  14.         $ws->push($fd, $frame->data);% ~8 k  Z# o/ l  c' T8 s" `; C
  15.     }0 i! n3 M& l- b
  16. });- X2 @% n- j0 e; N
  17. 8 z# P. ?+ E+ p# Q8 |' a9 I
  18. //监听WebSocket连接关闭事件
    6 |( o; x4 W, ~+ v6 h% t
  19. $ws->on('close', function ($ws, $fd) {
    ! Y* ]9 a( J3 q$ s7 e3 i  C
  20.     echo "client-{$fd} is closed\n";
    % @' q  l' Q% _" L! L2 R2 w) g
  21. });1 h. g: s: s: L. \. N
  22. //启动服务* T! f$ F" ^1 i9 \. W
  23. $ws->start();
    $ @& G: W) F) ]+ ~7 V
  24. 0 I9 I+ U3 L/ @
复制代码
- J5 y4 _3 Q! ~! N; i8 _  f
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端! c7 X1 Q: U( _6 A/ w

代码如下

  1. //连接服务器
    ' i3 k% {6 [5 J/ r( A( U- _- _) e
  2.     const socket = new WebSocket('ws://lm.com:9502');
    ( w: Z7 S) c. p& K+ I) s7 F! ~8 N7 j
  3.     //Connection opened" v8 {. Y$ k8 ~2 v+ s/ H
  4.     socket.addEventListener('open', function (event) {' `7 y( Y2 [' c) J% E5 ~
  5.             //发送消息给服务器+ \+ J! K9 F% J# N8 B% w% S
  6.         socket.send('Hello Server! im websockt');
    5 O9 ?  T8 O5 r! V/ p
  7.     });3 c8 l5 C3 i" f2 m/ @$ r
  8.     // Listen for messages+ h) X; q; f. m' T: b4 b# @
  9.     socket.addEventListener('message', function (event) {
    , L1 p1 t8 x* p7 @- g$ m; p8 X, S
  10.             //接收服务器返回信息( j$ y5 I5 |9 E3 A5 [. c
  11.         console.log('Message from server ', event.data);
    ' v( S' t9 p" D* k9 U0 B- O
  12.     });
    $ k( F. }  `6 I% a3 m, D5 d
  13. 8 k3 r; i- t% r) i
复制代码
伪直播主播页面
3 V  M2 Z% O0 [( C9 `$ U0 t  @/ }

html

  1. <body>
    2 J- i9 s  M, V, k4 ~% ?
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    ( R" {) G9 r6 {& ^
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">0 q% [6 r% K% {/ Z
  4.         画布
    2 t! H# U+ Z( a' C+ ^
  5.     </canvas>
    ! \- ^' K' d; _5 o1 ?% R
  6.     <img src="" id="videoImage" width="350" height="700">+ f9 d% T1 j& f
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    5 ?- ~# z- ~  S# j
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>; \3 V) j  b8 F; g
  9. </body>
    % L( x6 q3 f) c( G
复制代码

javascript

  1.     var v = document.getElementById("myVideo");9 N/ O) {& ^: S7 \( }0 p6 Q' c
  2.     var c = document.getElementById("myCanvas");/ a' T7 j8 C4 C/ c# I# x/ I
  3.     // var c = document.createElement("canvas");
    . A3 M- c" [* ^
  4.     var img = document.getElementById("videoImage");
    , q( B3 |9 h; ?( j0 C. z
  5.     ctx = c.getContext('2d');0 w2 G$ c3 R+ I; ?
  6.     var dataUrl;& o5 Q4 o* v+ U( f" K4 a' N. m# T
  7.     const socket = new WebSocket('ws://xxxx.com:9502');9 M5 w* j1 Q8 b$ n! h" F
  8.     //Connection opened
    ! l& ^0 D3 b+ E- u& |4 P
  9.     socket.addEventListener('open', function (event) {  [% z- @, z, ?; u5 ~# k3 V
  10.         // socket.send('Hello Server! im websockt');) u+ m1 j& x' P. w9 ^
  11.     });5 k& ?- [( |( A$ [1 a4 k
  12.     // Listen for messages
    1 ?5 z. l" Z+ C: P5 f
  13.     socket.addEventListener('message', function (event) {
    . c$ p3 W! Z5 E" t* Q/ ^% g
  14.         console.log('Message from server ', event.data);! l/ B; R6 o$ G) D2 F
  15.         img.src = event.data;
    - M: @1 m, J7 N  ~
  16.     });0 m: C" ^8 h- j# Q2 m1 ^" t

  17. 0 |- A/ o" ~' X) A% L
  18.     function playVideo() {0 K" x* C6 T6 l2 V
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    ! ~7 |" b. P: _! b# s3 t! B
  20.         dataUrl = c.toDataURL("image/png");5 Y, z- L$ h) V8 s+ K. I( Q
  21.         // img.src = dataUrl;1 W) J( h' ]% z3 f' _
  22.         socket.send(dataUrl);
    7 `& x4 `9 Q3 R6 K
  23.     }% s! ?; w: H( H( l3 H
  24.     var tick;1 U5 ^' n( C3 |+ C- y
  25.     function aphla() {
    # r3 E( T$ v2 H9 ~( Y5 f
  26.         tick = setInterval(function () {9 A; f% X/ H2 p0 I$ r
  27.             playVideo();
    - H$ ^* ]$ i1 i7 n1 O! S
  28.         }, 1);& b$ M) l, E& C4 w$ h4 y& j
  29.     }- X3 g* }1 K& p" a( _; R- N
  30.     function vdStop() {
    % {1 e: J- G5 Y6 E8 B, V" x
  31.         clearInterval(tick);+ [0 Q5 D6 K! u' B
  32.     }
    3 `7 V6 P, }) O: _
复制代码
用户页面
9 c8 Y; m+ t% U$ E- z' j

html

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

javascript

  1. var img = document.getElementById("liveImg");
    5 K/ o9 J& c( V5 l- h, [/ [
  2.     const socket = new WebSocket("ws://lm.com:9502");" |3 K4 X2 w) b: a" y2 p
  3.     //3 |4 }+ D2 {. O2 _' T; e
  4.     socket.addEventListener('open',function(){, \7 n% T' I' i: b
  5.      socket.send('Hello Server! Im live.html');: p, N: u4 j. \4 S- C0 Y& _
  6.     });0 ]1 R2 p* X$ Y7 P  g9 C
  7.      // Listen for messages
    / S! h8 i% [. L7 R+ V
  8.     socket.addEventListener('message', function (event) {  T- s3 l8 f. S5 e
  9.         //图片地址8 D" i# K  q& _. W, u% B
  10.         img.src = event.data;/ v+ w* M4 f; h2 h
  11.     });& I1 \" r  [' E3 H5 D
复制代码

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

6 E5 E2 o) K) g4 T
$ Y7 ]% C+ [, ]6 I5 n" H. V9 R" K! k+ O8 |: g
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 14:57 , Processed in 0.140006 second(s), 19 queries .

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