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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15531|回复: 0

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

[复制链接]
发表于 2020-3-31 19:50:03 | 显示全部楼层 |阅读模式
伪直播功能Websocket服务器; V# c6 a# R1 ]! j
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websockt服务

代码如下

  1. error_reporting(-1);  ! a: Q/ V9 [! R- Q$ `; i
  2. //创建socket服务- t, p, t. `4 t+ ]5 ^; B( W6 {/ k
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    # y8 y2 r6 H) Z/ w6 G5 Y, b# k- g
  4. //监听WebSocket连接打开事件# n) x- R8 v7 _
  5. $ws->on('open', function ($ws, $request) {: `$ U" P8 Q8 [  `4 k+ \2 B' h
  6.      var_dump($request->fd, $request->get, $request->server);  p0 b7 g& V1 F$ p' f5 }' A
  7.      $ws->push($request->fd, "hello, welcome\n");
      a: L6 Z" h; H9 v0 L
  8. });! t3 p) a# |( U' o3 |3 j

  9. . {2 G, `+ [4 Y% ]- ^0 Z* ~1 Q
  10. //监听WebSocket消息事件
    ! N/ `( F4 i) @- e  [6 T2 p  B: j+ e
  11. $ws->on('message', function ($ws, $frame) {# s0 t9 a0 p1 U: B% _) ]7 q# |
  12.     //推送消息给所有用户
    " y# [% @$ |  T+ e3 d
  13.     foreach($ws->connections as $fd){
    ( F) x6 J( Y7 q/ r2 _& V
  14.         $ws->push($fd, $frame->data);- A4 x5 {9 N, x0 R* ~+ {9 Z
  15.     }
    5 B+ o  @6 a; H3 p) o
  16. });* U# V5 D* o( m% S3 O1 A5 c  o
  17. 3 ^5 h" \  ], k, R# G
  18. //监听WebSocket连接关闭事件* [8 a' q2 O8 ]+ K( J" N
  19. $ws->on('close', function ($ws, $fd) {' Y& V6 _# F: M1 ?' d, y, \
  20.     echo "client-{$fd} is closed\n";
    , c4 ]( x0 V/ t5 ?7 [
  21. });
    9 Q5 M2 e& }, K' f. m6 d
  22. //启动服务" U$ K: Q+ ?7 y+ T8 p
  23. $ws->start();9 H, _+ y  n) Y9 ~; I
  24. - Y: R  @" @. \% ?  ^8 a# e
复制代码
. b3 @+ p) G( o8 _& k& r: K
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端, G8 T& S& C$ @% H

代码如下

  1. //连接服务器3 M9 T8 `  V$ o, v, j! I+ B0 {
  2.     const socket = new WebSocket('ws://lm.com:9502');
    $ D- d* n4 E2 ]- r2 \
  3.     //Connection opened+ q; N! M+ `  S6 }  N9 D
  4.     socket.addEventListener('open', function (event) {
      I4 r# z0 L8 Q3 m% J: ]5 ^
  5.             //发送消息给服务器5 ]  a( L9 S1 k& x2 [" c
  6.         socket.send('Hello Server! im websockt');, p% L. b9 d$ |
  7.     });6 h3 M! H6 ~! Q* G. z+ t
  8.     // Listen for messages
    / \" g( G6 r# U, I8 c. q
  9.     socket.addEventListener('message', function (event) {( Q) T/ g4 `4 Z! X8 F1 C( Q
  10.             //接收服务器返回信息# J+ N2 ^/ x# ]% W" q
  11.         console.log('Message from server ', event.data);
    ! K$ h+ X2 G% z! }1 b; E
  12.     });8 h8 R! l5 t) V  S1 L& |  Y" b0 l: r

  13. ( `8 @: N% F, W( V; _
复制代码
伪直播主播页面
* s% o# u* O! l: A2 N# u7 y& U$ y

html

  1. <body>: L  }! o8 d, |, Q! f  c) s
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>+ `1 `, h" Z( a
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">" T2 \- }# z% O' ?! i! Z; i
  4.         画布" E3 ~+ n& }9 o" J
  5.     </canvas>
    2 R$ U# P$ n. C
  6.     <img src="" id="videoImage" width="350" height="700">
    & }- s/ ?3 @, t& ?) r' O
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>4 _6 ~/ v0 k! S* V. ^3 }3 ~: q
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>
    2 b- q; y4 }' k/ q7 L
  9. </body>
    9 R0 \. B- ~: f
复制代码

javascript

  1.     var v = document.getElementById("myVideo");' Y+ X3 K) V) i& l9 R) R
  2.     var c = document.getElementById("myCanvas");" P2 o" \: b: S$ O3 X. s
  3.     // var c = document.createElement("canvas");: E9 ?# |; W1 Q  ^% h
  4.     var img = document.getElementById("videoImage");5 M! e, F# ]$ V
  5.     ctx = c.getContext('2d');  s, S8 c" d8 U6 c8 o  E) E9 h2 ~
  6.     var dataUrl;
      e# H9 K: ]; F5 C: K0 a/ M4 t) k
  7.     const socket = new WebSocket('ws://xxxx.com:9502');$ I- H2 q& x. T  |: M+ }
  8.     //Connection opened
    0 s/ \* o% v+ e+ x: z3 B
  9.     socket.addEventListener('open', function (event) {1 v: T6 r& s* |% v* j3 C
  10.         // socket.send('Hello Server! im websockt');
    ; c* c2 ?$ O7 Q& d" f$ H
  11.     });
    0 E- p% V& \9 r1 H$ n2 A$ M
  12.     // Listen for messages' Z7 t6 L# z5 [# @9 m3 o$ I
  13.     socket.addEventListener('message', function (event) {
    $ Q4 \( l/ p& B" L8 l
  14.         console.log('Message from server ', event.data);; j8 \" X" |, X: p, t
  15.         img.src = event.data;* k; N2 M! {6 Q- D2 Y2 i/ C6 ^9 I
  16.     });
    ' w: S1 F. b; D5 O8 Q

  17. - S, \  L+ o' G2 }5 P$ J! f; I- ~
  18.     function playVideo() {
    0 ^% z/ k; Z' y! ]( d/ g
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    6 u- B5 }* A+ E8 E6 r* e5 T0 V
  20.         dataUrl = c.toDataURL("image/png");. l4 J; u6 [6 _( Q- q/ I
  21.         // img.src = dataUrl;" c- x. b9 F' S- Y% G! b% R
  22.         socket.send(dataUrl);
    / U6 s% @! ?/ U, \1 L, Y
  23.     }
    9 A; x' q+ Z8 h  y* @! R! K; ?2 d  T
  24.     var tick;, g$ r# I! N. S1 s
  25.     function aphla() {
    2 k+ ~6 n- R! S" W) o
  26.         tick = setInterval(function () {  r' X, s# K" r- O
  27.             playVideo();
    8 w# m, ^6 J( d1 h* ^
  28.         }, 1);; h( U5 M1 S( F% u# u9 |
  29.     }. i+ ?; M" J. \
  30.     function vdStop() {, ]0 \" t0 J" J2 v7 y$ _
  31.         clearInterval(tick);
    $ e* c- {6 O/ _- _" v: g* t6 z
  32.     }
    2 S* n& v( _% j
复制代码
用户页面
9 _# ^# l4 X% d0 d

html

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

javascript

  1. var img = document.getElementById("liveImg");
    ) F" |( q6 k" |( j
  2.     const socket = new WebSocket("ws://lm.com:9502");
    , E& r8 F2 H! o' B2 d/ H$ i
  3.     //
    . {; e( V  B% N6 j
  4.     socket.addEventListener('open',function(){
    4 X$ ?* |  T3 O9 P: ^7 x. \
  5.      socket.send('Hello Server! Im live.html');7 D. B( @  D  S7 M' o) M' O9 S
  6.     });$ C2 c8 y, D4 x# ^2 y! O, B- b
  7.      // Listen for messages( S3 r% \( X3 N3 k( z, U* g8 U8 ^
  8.     socket.addEventListener('message', function (event) {
    + A- f- z' V+ e
  9.         //图片地址
    $ f1 Q1 A  R& }" e) J4 S# f  e
  10.         img.src = event.data;% R3 Y& \' g6 f) U
  11.     });
    # P9 k* s$ D* R& t/ h# t- f9 n, t- C
复制代码

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


  X( l6 Y/ I9 V# z2 A& [& w
, ]! F+ p3 Q2 Q0 c7 S: L: {
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-9-13 03:46 , Processed in 0.068546 second(s), 20 queries .

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