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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

[swoole] swoole视频直播(记录用 未测试)

[复制链接]
跳转到指定楼层
楼主
发表于 2020-3-29 18:53:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
服务器代码  t( z  w2 g- M) q) [+ z. n6 D
  1. $serv=new swoole_websocket_server("0.0.0.0",9501);, [! O) q9 a- Y" o
  2. $client=array();. e0 n: N1 H. s9 Q2 ^1 W0 l' q  Z+ e
  3. $serv->on("open",function($serv,$req)use($client){
    % D# f) y+ e! F- ~( |
  4.         //echo 'connect'.$req->fd;6 t; ?; J8 l1 L$ \" N6 p8 f" l. Z
  5.         $client[]=$req;  B. w% X8 w3 E9 R' J7 g
  6.         //var_dump($client);% G! ?+ u9 S; h& [* D, ^
  7.         $serv->push($req->fd,'aa');
    ' z& D; |: u3 T2 x
  8. });
    * Z! H' E  ?5 z9 e3 D6 K
  9. 2 ^3 Z8 r- ~- D7 V+ q
  10. $serv->on("message",function($serv,$frame)use ($client){- a9 F/ R) X% {2 Y3 ~, n* L& W+ d5 r1 k9 z
  11.         /*var_dump($frame->data);
    ( h9 q( m7 F- d- _. S8 n0 P; Y
  12.         foreach($client as $key =>$val){% h% u) y0 c6 p2 P  o, q
  13.                 $serv->push($val->fd,'aa');
    ' n1 ^/ S0 l! [8 Y$ ?
  14.         }*/
    % U- g1 ^$ O8 o% g% m
  15.         $client=$serv->connection_list();
    ; Y+ b* F, O1 M# ]# n
  16.         var_dump($client);- U  Q1 h; v% a, o
  17.         foreach($client as $key =>$val){7 K/ F6 d* [: o% A" S, U+ x
  18.                 if($val!=$frame->fd){$ c" f1 U; w  K2 {3 h
  19.                         $serv->push($val,$frame->data);. L* i( ?( s4 d- J, v) x5 V
  20.                 }' ~) E: g) M4 L9 ?
  21.         }  p2 w: V) J4 e! x* U6 c* J
  22.         ' l* z2 S! C( I% s
  23. });
    ' n# l( v# o, m# [3 L/ s7 O

  24. & k2 s4 ^+ X! ]. Z
  25. $serv->on("close",function($serv,$fd){7 |  a+ K8 B2 D; q4 O
  26.         echo 'close';5 b1 ^5 f; T' j. E; ]
  27. });
    # p* D7 X9 J  d% X: G
  28. / }/ M* Z) D! \; N' [/ \4 X2 K
  29. $serv->start();
    1 r4 a9 ~- V9 Y0 E( u
  30. % Y4 ^* T: g9 x) x& i" n  r
复制代码
主播客户端* R  C0 R; Q3 b% y6 P8 j0 w
  1. <!doctype html>6 w4 T" Y1 m( k8 A+ i" d
  2. <html>0 P0 `5 O# t9 O& U
  3. <head>: |- Q0 p* }" @6 w3 E5 |# c
  4. <meta charset="utf-8">
    2 w% u8 Z; K( S8 o9 {7 V

  5.   N! e% X9 I( e+ ?' R0 j
  6. <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    $ \5 P1 u4 @' |# W/ h( l( y1 V: E3 {
  7. <title>404</title>/ t" T9 d4 m) d3 F, [% f4 G" ?& E
  8. <style>
    2 Z% ~0 k- r6 u$ i: A+ ]! Y
  9.         body{
    + A# ?* s; s) J
  10.                 background-color:#444;
    ! M; \. v/ s! Y6 V
  11.                 font-size:14px;7 f* W  |  G1 k: L
  12.         }
    , c6 b2 N. v. U  ~5 S) t
  13.         h3{
    6 k" x9 O& A0 q2 }" F) \
  14.                 font-size:60px;" H7 j- S# p( H, K" W7 {; `' c, f
  15.                 color:#eee;$ Z* B9 m; N& c9 n% O" W
  16.                 text-align:center;# p' `% y) [; s, h
  17.                 padding-top:30px;! N1 ?7 B4 X1 ]7 b- B
  18.                 font-weight:normal;
    0 a7 x8 F5 r7 O! F" z2 X+ S/ y: e% q
  19.         }# v7 O6 }* t2 a2 L* _! j8 N/ j
  20. </style>. \3 x# d' j# W& T+ i
  21. </head>
    : I4 F- k2 o  R* Q4 E

  22. 5 h5 W2 }8 r5 K* g
  23. <body>+ Y0 {+ R8 y8 z+ Z+ q* m( n
  24. <video src="test.mp4" width="400" id="video" autoplay="true" controls="true"></video>
    , C; x8 z- U/ [* S6 N( h
  25. <canvas width="400" id="canvas" height="400" style="display:none"></canvas>
    . ?8 k% p" K& }8 u+ f  v; G: g
  26. <canvas width="400" id="canvas2" height="400" ></canvas>
    3 r8 q9 J: ~# @3 o4 `( T4 K
  27. <script>
    : W) c! [% d& @8 y( b
  28. var video=document.getElementById('video');
    & [+ t% Y9 P1 Y+ f/ ~' c- |& `
  29. var canvas=document.getElementById('canvas');
    9 p  g' y/ W; u6 Q6 |( ]0 m/ M
  30. var canvas2=document.getElementById('canvas2');+ S/ L8 D. }" J, U" B
  31. var context=canvas.getContext('2d');, i9 i9 i! Y3 S% v6 }
  32. var context2=canvas2.getContext('2d');
    ' M+ Y+ x, ?2 r- k, Y& G
  33. function draw(){. y9 T$ H1 f" c9 B- e5 g
  34.         context.drawImage(video,0,0,400,400);  l7 [0 g; r. E& l7 M
  35.         ws.send(canvas.toDataURL('image/jpeg',0.8));
    9 ~: q! j( Z1 O/ N
  36.         setTimeout(draw,800);! g, @+ q( l+ x1 v% C# c2 k
  37. }8 A  W' n2 g/ Y' ]
  38. ) m- s  \: \+ M" v  Q0 a- P- B
  39. //客户端跟服务端通讯
    3 S% o* u# j0 o% [2 r
  40. if (window.MozWebSocket)# Z5 V# U; X$ H* o" {
  41. {' y1 ]) }2 ^) u9 k, X/ e
  42.         ws = new MozWebSocket("ws://182.61.42.187:9501");
    7 n8 ~6 c2 [) ]& l* J! z) w) j
  43. } else
    4 p$ i5 h8 D! A
  44. {
    : L/ i% K( o. W* B2 f9 O7 ]
  45.         ws = new WebSocket("ws://182.61.42.187:9501");
    1 S( R0 Z5 H4 ?$ `9 X
  46. }, R+ I, P9 Y# U' T
  47. * s8 Q- o+ K4 H: b# F/ v
  48. ws.onopen=function(event){
    9 z' x3 O* }: A4 u8 W! Z: a
  49.         alert('连接成功');
    $ h, Q) [' b( \8 L0 L' l2 |- k
  50.         ws.binaryType = 'arraybuffer';" o) f4 v$ j# t# N% s, N! J
  51.         draw();
    0 [9 d) I- K/ I8 f
  52. }
    1 \. h8 E! y3 \( h) T
  53. ws.onmessage=function(event){0 C7 F, u2 @2 o+ E" C+ @  m6 B
  54.         //alert(event.data);0 T0 ]+ k( P1 U& Z# K, g1 U( Z/ m
  55.         //ws.send(event.data+"client");' @! x  q: Y, V( A: L1 ?
  56.         qrCodeImg = new Image();
    ! @, C( A% F! K# v4 K5 [+ K
  57.         qrCodeImg.src = event.data;
    9 E5 w$ Q$ M5 ]6 o; [. @% P
  58.         context2.drawImage(qrCodeImg, 0, 0, 400, 400);
    / _0 J, s) W8 V- T/ ]7 g
  59.         
    " ~, ^( y0 ~7 O. e5 f" V0 n/ A" X
  60. }, C3 n! Y1 K" M: R. ~7 o6 U
  61. ws.onclose=function(event){
    . K( p/ Y7 ^0 Q) W
  62.         alert('close');
    / n7 N) u  D: `1 u
  63. }
    4 j2 s! j: B9 G) {
  64. ws.onerror=function(event){$ [% w- a; k. V8 R
  65.         alert('error');
    1 K  Z: ?6 F7 e. ]; j3 c
  66. }
    " G+ W3 m! t. g. t4 s: D7 [8 v
  67. //video,标签模拟视频8 ?/ ~! n' E" T8 r+ |, S

  68. 8 J3 [9 J$ U6 K# B; S: K
  69. </script>
    3 O7 k, v. t; L9 u1 ~2 e. E
  70. </body>
    7 d4 T+ S( N" F+ Y: w8 E
  71. </html>) N: K  L; a' a9 M  g6 X
  72. 7 _# {+ _' Y' W2 |- M. b, v
复制代码
客户端:
; [2 f- [& `: }) y% h: d
  1. <html>
    - z8 D  I: O8 ~! ^) W1 ?8 d* s- D
  2. <head>+ o3 J) n* h0 k: I+ ~. X$ ^
  3. <meta http-equiv="content-type" content="text/html; charset=utf-8">
    2 S' S' l; ]4 Y+ P: [9 [
  4. <title>客户端直播页面</title>  i4 Q3 }+ u' o2 j$ F: l/ {
  5. </head>  q: P: |* K/ q' f9 M
  6. <body>
    1 r" r. Z# G, ?1 L9 S" l
  7. <img id="receiver" style="width:720px;height:480px">2 m# l1 v+ t- d! K# e6 O5 r) g, n

  8. 4 Z: v. P( a* w% d4 T
  9. <script type="text/javascript" charset="utf-8">
    ' K0 y8 J) C. {; e3 g7 ]2 w5 p: w
  10. var receiver_socket = new WebSocket("ws://182.61.42.187:9501");* A$ r; B9 G- s8 I! p
  11. var image = document.getElementById('receiver');0 w. W  A9 T& t) N
  12. receiver_socket.onmessage = function(data) {
    8 r4 ?9 s% a; I8 [1 |9 @6 k
  13.         console.log(data.data);3 p# `! \" {0 q& E
  14.         image.src = data.data;
    , w+ K, }# D- |% K$ N
  15. }
    ( e8 y' W/ ?- Y3 F) i
  16. </script>
    5 X7 C9 Y1 ^, p) ^
  17. </body>
    3 {: |& g. r4 x# G& N7 z9 z& \9 _
  18. </html>
    : u3 M0 S" z2 Z( ]( e% v

  19. / @7 C/ U; e1 N  ]8 h
复制代码
9 `' r% ]% ?8 r& H# B) e
: F' {9 d) H& q! W& ~# Q; i
, k1 m, A! D; g# Y% o3 T3 T
% ~# V$ l3 j1 G% A6 ^

# r9 u. C4 S5 w) o' ?8 @' _0 E
: \3 Y. K3 c/ W
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 21:44 , Processed in 0.067285 second(s), 19 queries .

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