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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    & s+ i' M+ K: }; S& a; Q
  2. //创建socket服务) s+ i+ c0 d2 s( U- B
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    . l; ^; H6 d% c5 F1 I
  4. //监听WebSocket连接打开事件7 e8 v* M! Y( k+ i5 M3 V
  5. $ws->on('open', function ($ws, $request) {
    ! A# @/ }8 n9 i) x
  6.      var_dump($request->fd, $request->get, $request->server);, x+ Q; U, A8 V/ h& ^1 ?
  7.      $ws->push($request->fd, "hello, welcome\n");2 ^0 B6 R) B& r5 A
  8. });5 l6 b' o# o: z$ G
  9. 8 w* m- w: a4 B8 s6 y2 Z2 h
  10. //监听WebSocket消息事件
    . T3 V, `  @! L6 C
  11. $ws->on('message', function ($ws, $frame) {2 i* {: Q1 o3 y) ], N
  12.     //推送消息给所有用户; ~. ^/ S% @  S- i
  13.     foreach($ws->connections as $fd){
    / s: M+ d$ g6 r6 P
  14.         $ws->push($fd, $frame->data);
    3 S3 l: q6 _! T3 V- A
  15.     }
    / G0 W+ N  T6 S/ l; ]1 x
  16. });5 C" y3 p3 h- u/ `  q- R

  17. ) @, @2 V2 W/ W0 v; y* f7 r
  18. //监听WebSocket连接关闭事件& I! }5 p' A( u2 \
  19. $ws->on('close', function ($ws, $fd) {0 t3 P. _. ]2 q: Z' h5 ^* s
  20.     echo "client-{$fd} is closed\n";
      t6 F6 l( A# P6 t1 b
  21. });0 h3 Z/ [- v1 ?, b; @
  22. //启动服务5 B  T% i7 W0 h
  23. $ws->start();- I/ ?8 d( z, Q
  24. ( z5 ^4 P1 b8 l! n2 L, L0 L2 y/ `% ~/ g
复制代码

+ C2 G* g5 a* N0 i. AWebsocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端- H" h, ^4 {1 O* P0 n

代码如下

  1. //连接服务器4 ^% S5 g3 D3 X2 `4 ^6 u3 E& Y
  2.     const socket = new WebSocket('ws://lm.com:9502');
    6 q; Z3 H: E3 H6 k' j; S
  3.     //Connection opened
    . h# D2 z" h- S
  4.     socket.addEventListener('open', function (event) {7 H2 q) {; b1 c( x5 e! o* I# z+ Z0 x
  5.             //发送消息给服务器
    + r3 a& V0 p4 v8 s
  6.         socket.send('Hello Server! im websockt');; ?0 j/ }2 \' m+ q7 a+ C; U
  7.     });
    ( R. \2 ?) B$ _
  8.     // Listen for messages
    8 M0 G3 d. Y0 V9 s( F
  9.     socket.addEventListener('message', function (event) {; E% T" ?- `) J7 y9 A2 c& h* L
  10.             //接收服务器返回信息
    : C4 Z& U6 n5 D  b. ]. }
  11.         console.log('Message from server ', event.data);
    ) R# K/ X$ l" D/ q7 ]; P4 |+ G
  12.     });8 {2 `! q+ a) S% g

  13.   K( n  H: T4 S$ N  D
复制代码
伪直播主播页面
8 d& A3 z/ W% u0 x( M' }

html

  1. <body>5 `8 r: E+ y* f! {0 ~( T( n( w
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    2 Q% W8 Z9 D/ k5 h0 g8 H2 F8 G
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">; b( {. V( b, h5 y/ w
  4.         画布7 D4 ?$ c  X- X' [
  5.     </canvas>, |0 H' B$ [# ?# R% R# a2 c
  6.     <img src="" id="videoImage" width="350" height="700">8 {6 Z8 s; i* z8 _
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>1 X  X5 l' X$ a! {+ B- ~# `5 I  N
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button># a4 s4 Z0 U) `6 c1 t
  9. </body>/ M3 b+ G5 d# J0 a7 [* d
复制代码

javascript

  1.     var v = document.getElementById("myVideo");
    $ s# [- j* g0 C8 A
  2.     var c = document.getElementById("myCanvas");
    2 l! }5 z1 S2 M" {6 R8 i0 V9 p! I
  3.     // var c = document.createElement("canvas");
    ; e8 _& U& O3 M& B/ z
  4.     var img = document.getElementById("videoImage");% n& z# p. \4 b. n" ~
  5.     ctx = c.getContext('2d');: z: a/ Y9 I: ]
  6.     var dataUrl;( ?0 L3 J! K5 }% z% `6 z5 {6 U
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    0 z" ?6 z- z$ J4 ~
  8.     //Connection opened  T! {/ n! r& M* g
  9.     socket.addEventListener('open', function (event) {
    & X2 H/ b# P, H
  10.         // socket.send('Hello Server! im websockt');: {. o; j: s$ T
  11.     });1 j- r' s' C$ D; m1 S
  12.     // Listen for messages
    / N1 p8 _& ~# }- H0 c3 Y- B
  13.     socket.addEventListener('message', function (event) {
    , Z  q4 c0 K# [# ~
  14.         console.log('Message from server ', event.data);
    / A5 }$ g6 Q4 X# |' P
  15.         img.src = event.data;- H$ S) Y& }- j) j
  16.     });: p+ q. N  m3 X" K$ |* J
  17. % c8 B0 p* y: e. }; h# E& ^- z
  18.     function playVideo() {
    . G" v9 J, g+ G
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    & M; |% k$ m' L* _$ |" ~- z
  20.         dataUrl = c.toDataURL("image/png");: f1 Q, b- i" ]
  21.         // img.src = dataUrl;; L' ]" d5 M& L5 ?' k: k: v, X
  22.         socket.send(dataUrl);; b. F8 M/ I1 f7 d& B
  23.     }
    $ ?" {3 g4 b4 e& I6 ]8 t6 x4 p
  24.     var tick;4 T  ~9 B* m" z2 X4 U
  25.     function aphla() {9 K% l. R8 Z3 N! R2 j% j. x
  26.         tick = setInterval(function () {
    $ d1 ]2 G, B9 V4 o$ r" b5 [
  27.             playVideo();1 D, |1 h% ~2 e: i2 o
  28.         }, 1);. b# n% l' S2 n' j! \! a- g: H" A! n
  29.     }' m' N- ?. G+ A7 t% }5 P! |3 z% Q
  30.     function vdStop() {
    5 l7 O  a) W0 a; R% G
  31.         clearInterval(tick);! {; {3 G3 J$ ^8 w/ B
  32.     }
    - a& j# M3 e/ _: j: `' l
复制代码
用户页面, I5 Q( w. e% M3 R8 V  C' g2 e

html

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

javascript

  1. var img = document.getElementById("liveImg");4 R1 ]1 A5 A$ l6 [# |4 N
  2.     const socket = new WebSocket("ws://lm.com:9502");
    : ~3 D7 q* X/ w* y
  3.     //$ y8 g# l. u% O( J3 |
  4.     socket.addEventListener('open',function(){
    ! W* M' W$ N. ?" D% p$ M
  5.      socket.send('Hello Server! Im live.html');
    , q; B4 k: k$ j+ G
  6.     });
    . d! @- s3 m) [* k6 y9 S
  7.      // Listen for messages4 D0 s( b, R" i( O
  8.     socket.addEventListener('message', function (event) {
    1 }0 x' B) K) v$ q0 Z" C/ c2 ?
  9.         //图片地址
    ) d& y# {, Q$ ~& K) w7 e
  10.         img.src = event.data;4 m/ W) R" U' v
  11.     });6 v: G9 j6 A6 Q% l8 _6 |( O
复制代码

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


5 X- p* ^5 m. X3 L
3 E- f5 M; W& Y8 K( h
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2025-2-5 19:48 , Processed in 0.131245 second(s), 21 queries .

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