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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
      C! [( r& w) S, W8 `0 I, d( H, y
  2. //创建socket服务# w$ a# l. d. |/ \  z6 B
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    2 c8 a' L+ j- q3 {/ K% q8 a# K4 R
  4. //监听WebSocket连接打开事件# p$ r/ W3 g; k+ Z
  5. $ws->on('open', function ($ws, $request) {. v' T, x+ n3 P. K3 w6 H
  6.      var_dump($request->fd, $request->get, $request->server);- I2 y0 T2 n0 V& i$ M7 x
  7.      $ws->push($request->fd, "hello, welcome\n");& K) f$ A# E7 w/ F) U& U' q. T
  8. });
    7 g! j& ?0 @8 j- |1 `
  9. 2 a# n/ {9 d1 T+ K+ ^9 J
  10. //监听WebSocket消息事件
    # z  }7 d# \. b3 ^4 ]$ h) _8 A2 S: z5 T
  11. $ws->on('message', function ($ws, $frame) {
    ! F' w$ x% j$ y6 @& S
  12.     //推送消息给所有用户' c7 @) ^# w) \3 `
  13.     foreach($ws->connections as $fd){
    + L' T% N! E1 {" N
  14.         $ws->push($fd, $frame->data);& n+ T  v0 j6 p; O) Y
  15.     }2 v7 k$ N7 e, w& g% Q
  16. });- \, w) p2 n& T% g$ W$ i6 J' m
  17. / D' b9 D3 n8 V4 X
  18. //监听WebSocket连接关闭事件
    . L9 U3 X+ R8 C3 u. D
  19. $ws->on('close', function ($ws, $fd) {1 X+ m6 L$ B. |0 {4 W! c& K
  20.     echo "client-{$fd} is closed\n";
    5 j" b" D! {) Y! Q3 f
  21. });
    6 B9 h- c/ ?5 Z% r6 ^
  22. //启动服务6 I! t3 V6 ~( ~! W
  23. $ws->start();
    & p5 Z1 q# `5 K% b( A$ \7 t5 m

  24. + [: Q; R: c$ Z1 ~. E
复制代码
8 X6 n8 `8 M8 C, |( E( O* F; U
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端% a3 D7 X1 v# v4 r, S, ^) ^. g

代码如下

  1. //连接服务器. x4 u/ }- m9 y; o& v4 C; k) J
  2.     const socket = new WebSocket('ws://lm.com:9502');
    6 ^4 I/ n2 Z5 H& j4 K, Y
  3.     //Connection opened
    3 w1 L% h3 V5 d" S' Y
  4.     socket.addEventListener('open', function (event) {
    . k* P7 p7 s8 N9 \3 c0 `2 x' f
  5.             //发送消息给服务器, U( ^8 p& x2 y  N0 k) Y. Q
  6.         socket.send('Hello Server! im websockt');
    3 `0 T9 ]6 g. }2 s5 z9 z6 A
  7.     });
    $ z% q7 E1 \! n$ W, g5 j+ O  K2 [
  8.     // Listen for messages. a* q! I& A" E3 n! q3 d6 }8 p
  9.     socket.addEventListener('message', function (event) {
    ' C( f( E* l3 k- G, K
  10.             //接收服务器返回信息
    $ S* c- F9 z0 B6 B5 |; `
  11.         console.log('Message from server ', event.data);
    3 n$ C# n$ v" h) v( H- {
  12.     });) `& [4 }( O* Y* g8 @' H

  13. 9 i$ m6 c$ F6 c9 P
复制代码
伪直播主播页面
. p7 k1 O( C2 v6 a  K

html

  1. <body>5 \' a6 {) I9 B# G+ D
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>5 i  x6 |& `# k8 Q' \
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">
    / u6 Y# @( d6 }: O# S
  4.         画布5 F$ a; O6 b6 h$ i% f; Y4 {; q  q
  5.     </canvas>$ e) h/ s  ]4 r  |9 k7 R) ]: p
  6.     <img src="" id="videoImage" width="350" height="700">
    . W3 _  m' G# B+ u/ m) D7 X
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    5 P' N, Y8 F- `& H  y
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>, H- r2 R+ o: ^+ h8 i( ?6 j
  9. </body>. g( ^) H7 [5 B) x* V" c# k+ n
复制代码

javascript

  1.     var v = document.getElementById("myVideo");4 ]. z5 p& z9 {( E) R
  2.     var c = document.getElementById("myCanvas");
    2 ^3 M6 Z6 U& o& n8 J- c  [
  3.     // var c = document.createElement("canvas");
    ! b9 P* k! P9 y+ g
  4.     var img = document.getElementById("videoImage");- [4 X' T! A. |6 S5 `
  5.     ctx = c.getContext('2d');
    7 j, d! W4 X: _& ?. ?* B& g
  6.     var dataUrl;
    : s9 C( i  P( H# P" p5 H- H
  7.     const socket = new WebSocket('ws://xxxx.com:9502');' r4 ?8 ^: i3 c
  8.     //Connection opened. l9 R. w/ x8 Q* T+ V8 b0 r
  9.     socket.addEventListener('open', function (event) {* ~- D* U+ k: b5 C  ~7 [2 _
  10.         // socket.send('Hello Server! im websockt');
    2 g) a! S6 |/ r# e3 L. i' V
  11.     });
    ' O* C: G- h% C. p$ D
  12.     // Listen for messages% f2 t0 e; {" t! F  o+ P
  13.     socket.addEventListener('message', function (event) {
    6 ?/ I+ ?3 w! k4 \! m* T( N3 x, U
  14.         console.log('Message from server ', event.data);0 Q) x7 A) v2 j7 X3 i
  15.         img.src = event.data;
    1 L0 h5 b+ V  r& {  {( X$ A# W
  16.     });( T( S; {5 m# [$ g
  17. 7 ^; R! w9 g2 B  t5 R
  18.     function playVideo() {- G* ?0 a. S$ ^% p: n
  19.         ctx.drawImage(v, 0, 0, 350, 700);/ v2 X7 d, X0 A' c: P1 ~: E
  20.         dataUrl = c.toDataURL("image/png");
    5 ?& c, _) `& |( `0 D) @, T4 _
  21.         // img.src = dataUrl;9 R  g( \" @% g( ~$ D# b
  22.         socket.send(dataUrl);
    * d" F% \8 J6 F: j0 P
  23.     }
    % d- ^7 s# r6 u+ H* X
  24.     var tick;4 d0 `, p6 O& b. B4 b3 d3 i
  25.     function aphla() {
    ' u* `( K+ E7 S% Y; I6 b
  26.         tick = setInterval(function () {  P# W: d% ~. R' P- i' ]
  27.             playVideo();
    ' o5 i+ v3 n- N8 O- l
  28.         }, 1);
    ! q6 z4 ?; ]& R) l: w
  29.     }/ y% k4 z0 ~4 k5 l1 B# B
  30.     function vdStop() {. @9 Z# C3 Z: ~5 U/ [. ^
  31.         clearInterval(tick);' `0 H5 K$ {& t) Z, N6 \
  32.     }( X, @: T8 l* p; V- N! r
复制代码
用户页面
: r; n+ T& P( q' P: t& T' Z0 I

html

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

javascript

  1. var img = document.getElementById("liveImg");
    $ G1 Q& u) b; J; n1 q8 \) ?
  2.     const socket = new WebSocket("ws://lm.com:9502");
    4 T) C* x. {% O( t; u, S  V" D
  3.     //- j; S. j) V2 \# @2 s. t7 N
  4.     socket.addEventListener('open',function(){$ n. g7 S& m1 I, j% r5 e1 x* |
  5.      socket.send('Hello Server! Im live.html');
    - m4 P- A, u7 B
  6.     });9 Q/ \4 A: O0 X" E
  7.      // Listen for messages3 \( W. L; O! n: \& h
  8.     socket.addEventListener('message', function (event) {6 ?$ Z  c. `: V* D5 T
  9.         //图片地址8 f8 y: \0 X8 Z" m+ s: U! ?" U
  10.         img.src = event.data;
    ' v; u5 R. p: |' |( }4 |' R
  11.     });7 O! u, P) d6 R/ B  q1 j0 N8 h; V
复制代码

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

/ B+ b  [. @! D

1 T5 C, }. F4 P
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-12-22 00:53 , Processed in 0.112492 second(s), 21 queries .

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