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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

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

代码如下

  1. error_reporting(-1);  
    1 |7 }! S  N1 H9 {
  2. //创建socket服务+ y9 y9 M, M: g  O% ]& r- n
  3. $ws = new swoole_websocket_server("0.0.0.0", 9502);
    % M7 W/ y1 F! @$ Q
  4. //监听WebSocket连接打开事件) E9 |. ^$ J7 F, w7 ~
  5. $ws->on('open', function ($ws, $request) {9 A2 @* T. N7 j5 ?
  6.      var_dump($request->fd, $request->get, $request->server);9 f: [' p4 ^1 X6 q* d; t
  7.      $ws->push($request->fd, "hello, welcome\n");
    2 c' J' U0 {# L! m6 c4 Y) U) o
  8. });
    : ]7 Y$ v5 X. n: e9 q" r' p. [
  9. ! R( E) [, |/ K9 a- }' p
  10. //监听WebSocket消息事件: [' C8 C: D$ K4 p
  11. $ws->on('message', function ($ws, $frame) {& W' y4 l! m( ~# Q
  12.     //推送消息给所有用户
    7 X9 n# d" K/ }% j3 h
  13.     foreach($ws->connections as $fd){
    . N% e9 S! G1 v5 z, @
  14.         $ws->push($fd, $frame->data);  B# s- U: s1 W  \' e
  15.     }
    * C( I- T, h, k" `/ W
  16. });+ |" j$ j# G' T& I

  17. 3 ?1 A# J# C7 ?  {9 j+ Z
  18. //监听WebSocket连接关闭事件
    / O% z+ j* j! V( W$ P
  19. $ws->on('close', function ($ws, $fd) {
    6 [5 y) m* [8 K) e
  20.     echo "client-{$fd} is closed\n";
    + |! S) I: g+ k7 a  {* T+ {" J
  21. });, n) \6 S3 {8 ^
  22. //启动服务
    , Z. C$ a) v/ }5 S# P3 t
  23. $ws->start();% t$ z+ m, j: b* N

  24. 2 \8 W2 g2 S  [9 T6 p& ]3 T
复制代码
& K; R: H; S5 {, M. P2 G0 k
Websocket客户端
  1. socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码
创建websocket客户端
; f% J( ?1 t* ^3 J& {7 Z

代码如下

  1. //连接服务器3 E, v. T& ~) |: \
  2.     const socket = new WebSocket('ws://lm.com:9502');" U, ]4 m' K/ }3 I
  3.     //Connection opened5 A3 F& t' |& g& B' ?
  4.     socket.addEventListener('open', function (event) {
    * E' z2 J' x7 ^5 {& w, ]
  5.             //发送消息给服务器; t; W+ ]. ^/ v+ _  j! M; {
  6.         socket.send('Hello Server! im websockt');
      U- O4 H! n$ M4 S2 T
  7.     });, ~7 {4 |* E* v5 }1 v: s8 q
  8.     // Listen for messages# `9 C7 E- ^) K3 g0 G
  9.     socket.addEventListener('message', function (event) {, ]4 I: F7 e* ?  W, }" C! P/ m! n
  10.             //接收服务器返回信息+ O! w& B" S1 F2 Y! s, [$ s2 n5 D
  11.         console.log('Message from server ', event.data);) V6 n9 g! W  J6 ?
  12.     });
    * O, P  R; z& K

  13. 0 z5 k+ J0 F2 |# q3 Q' {
复制代码
伪直播主播页面& t& g5 h  L8 B- T) {+ Y

html

  1. <body>& _% {( w* y& J4 x* A9 D: A4 M
  2.     <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video>
    ( s+ y, B* t% P  e# O0 j1 H; B
  3.     <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">9 |, R5 K& g0 F# U" a
  4.         画布
    $ M* f% J& D3 i0 P$ j7 P: M# u& i
  5.     </canvas>
    2 S0 S6 G/ V! U5 W) E
  6.     <img src="" id="videoImage" width="350" height="700">* D) c+ e, ~/ o: l3 ]
  7.     <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
    ' p. ]. j+ x4 c. G. E) k0 S2 ?3 x
  8.     <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>: s' N% W) T' H; \
  9. </body>' G4 D! ^* w3 R
复制代码

javascript

  1.     var v = document.getElementById("myVideo");8 t3 c6 {+ a- U# k8 Y; f
  2.     var c = document.getElementById("myCanvas");
    7 d6 e3 i3 K% X* e  v
  3.     // var c = document.createElement("canvas");
    ' z2 a& w4 \* ]7 e* r5 `6 o
  4.     var img = document.getElementById("videoImage");$ l. T+ S8 t( F# c
  5.     ctx = c.getContext('2d');
    ; e7 {" i1 U, \5 p* X7 v: v7 g5 C+ Q
  6.     var dataUrl;, K( S  L& h/ \! B5 _: ~
  7.     const socket = new WebSocket('ws://xxxx.com:9502');
    $ e6 q+ b  d% {0 z+ f
  8.     //Connection opened9 P6 K+ @9 W3 z% Q; d# f( A
  9.     socket.addEventListener('open', function (event) {
    0 Y# {% b/ F6 W
  10.         // socket.send('Hello Server! im websockt');: q% d8 x( Z# m; H7 V6 G$ R
  11.     });7 Q9 P% \: r9 D; }. e
  12.     // Listen for messages. P6 E# Z% e/ h1 m
  13.     socket.addEventListener('message', function (event) {
      L8 i, C. }8 U6 Y4 t
  14.         console.log('Message from server ', event.data);
    3 N( A! J6 a- m5 p$ ~
  15.         img.src = event.data;% \# G* o8 D8 ]$ N  y4 h# I7 @
  16.     });1 W7 }3 x3 p/ o) H( L3 D* ?" }

  17. # U" c# c, \! t7 H/ i* b5 Z7 u
  18.     function playVideo() {) V' k) y7 Z& _4 s
  19.         ctx.drawImage(v, 0, 0, 350, 700);
    2 @. X: K! Y% n: G
  20.         dataUrl = c.toDataURL("image/png");
    & z& \5 C. y% p* i
  21.         // img.src = dataUrl;  `$ g. t; k6 q0 C
  22.         socket.send(dataUrl);
    # X( @* y. W9 L: H. H% H
  23.     }/ P! Z- x/ P) V( n
  24.     var tick;) J# u, B* m7 z' _8 Z7 P$ j
  25.     function aphla() {
    , ?  I1 z# D0 M, ?( j* `; s( \
  26.         tick = setInterval(function () {3 x6 Y( b* F5 J7 f- z3 `5 p4 O
  27.             playVideo();
    : [! i7 t! Q8 \% e  L+ X* Z
  28.         }, 1);
    3 \, O3 W! K$ s+ w. D
  29.     }1 z3 b8 K" s5 ]. A
  30.     function vdStop() {% c4 L& K  o+ _$ {' @# f7 j
  31.         clearInterval(tick);
    ' ~/ ^3 Z" [2 y: p  R  A' I# L; S  h
  32.     }2 R4 H- [& V6 @% f
复制代码
用户页面# [& o. E3 g7 H, B2 {

html

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

javascript

  1. var img = document.getElementById("liveImg");3 @& Z  t5 I* }7 t4 ?2 y
  2.     const socket = new WebSocket("ws://lm.com:9502");
    6 h- K% P& h8 f: F8 |1 Y% U0 y" F
  3.     //  j$ `, U6 ~$ b& m) r/ v9 A( ?& J
  4.     socket.addEventListener('open',function(){
    2 s& k: e. D8 \. R1 G8 m
  5.      socket.send('Hello Server! Im live.html');
    * A2 k" o( _$ b$ K- b* P1 k
  6.     });. D1 B  H; l! Y2 a
  7.      // Listen for messages( f/ Y% e5 b* G) B$ R" y6 e: X
  8.     socket.addEventListener('message', function (event) {$ d" Z5 {* u' b* ?3 I. D
  9.         //图片地址3 _! L$ {  x% p+ j9 n
  10.         img.src = event.data;8 j/ b& i1 Z1 e2 E' x
  11.     });
    ' {& X+ x( c; e- ]/ t
复制代码

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


7 N3 i7 t4 r! E' W  T2 i! v" |- p/ Y* g$ [! K. ]
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2024-4-25 01:21 , Processed in 0.118432 second(s), 21 queries .

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