cncml手绘网
标题: PHP大道至简之Swoole伪直播功能 [打印本页]
作者: admin 时间: 2020-3-31 19:50
标题: PHP大道至简之Swoole伪直播功能
伪直播功能Websocket服务器
- s2 [" {# x. F$ \- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websockt服务代码如下
- error_reporting(-1); 0 n9 I W8 X8 H5 ^
- //创建socket服务
3 m- R# v4 l5 m5 k' t - $ws = new swoole_websocket_server("0.0.0.0", 9502);5 z' @, S9 b9 I( U# q! K8 G
- //监听WebSocket连接打开事件9 P7 ~8 h: Q& I/ R7 p1 Q" i
- $ws->on('open', function ($ws, $request) {( f( w' o/ q, n: W) f1 S9 g! i5 j
- var_dump($request->fd, $request->get, $request->server);
* x$ T- ?/ b" } A - $ws->push($request->fd, "hello, welcome\n");
! K4 v5 R+ @0 z7 e3 ? - });! O+ f2 u7 q6 W. g8 D6 Z; g
. {; g' u* H7 `, V( Z- //监听WebSocket消息事件+ T6 q- j, _+ [5 V5 \1 d" ?
- $ws->on('message', function ($ws, $frame) {8 H, Q9 R; `( U! x
- //推送消息给所有用户
: P, @! c: C5 |2 \$ S* P: \: J5 P - foreach($ws->connections as $fd){" }4 G* c2 ~) @0 U9 ]3 C* x
- $ws->push($fd, $frame->data);
* V+ S, ]) _1 c: r% P$ V - }
# @5 V- T! G! H2 g' F8 z: @4 {. ~& X - });1 T9 @' N! W8 `+ @( [
- 7 [) k) s- ?+ o j
- //监听WebSocket连接关闭事件; ]* g3 f& {1 p# S8 ?' B; u! w
- $ws->on('close', function ($ws, $fd) {: J. _: w2 c; M1 f7 _7 _
- echo "client-{$fd} is closed\n";
7 @% b% ~. I+ L. S2 U! T5 P; O - });
- }3 m! h1 _0 x% f: {; A - //启动服务- O9 G7 h) R( s9 q6 ^
- $ws->start();
6 o! h. I/ A. M" Y- T
( q1 J6 L5 {- I; R
复制代码
3 c0 f$ M% k( C, ^, |Websocket客户端- socket 通信技术就是两台联网的计算机之间交换数据的技术,这就是 socket 的全部内容了吗?是的!socket 编程远比想象中的简单很多,阅读完这套简明的入门教程你就能胜任简单的 socket 编程了。
复制代码 创建websocket客户端& z+ O; X8 G+ J
代码如下
- //连接服务器5 z& [3 C7 T$ R+ J o
- const socket = new WebSocket('ws://lm.com:9502');: {' W8 y" ?1 g! E" H0 i
- //Connection opened: o- T' J% d1 ~
- socket.addEventListener('open', function (event) {, Y3 p" x) ?" ]; e8 J
- //发送消息给服务器" S7 v j( }; A* b2 h3 E
- socket.send('Hello Server! im websockt');
* t" E! L5 S% N: a9 a2 O- _ - });
% M) R( t, A, I! ] - // Listen for messages
+ ^9 ?4 s$ J: A ^0 n' c/ ?6 v- M - socket.addEventListener('message', function (event) {- n7 s; U' R; Z p
- //接收服务器返回信息
! ^, x5 K( d& ~ - console.log('Message from server ', event.data);
) Q6 r4 v7 S+ z6 _ - });) K# p* S/ x. ?/ [0 N; J
- 1 }% @: ]+ h. C+ A
复制代码 伪直播主播页面
/ B8 p" Z) T q2 e5 b( Khtml
- <body>- e o1 x5 K1 P2 r
- <video id="myVideo" src="./video/tikto.mp4" style="height:auto;width: 350px;" controls=true muted=true></video># y* a7 C( d p
- <canvas id="myCanvas" width="350" height="700" style="border:1px solid #d3d3d3;">' O- V) {% E# ^$ ^" j" ~
- 画布& y" w( c6 Q" M) j7 Q' K
- </canvas>( S4 D! Y" v; z! B: X; B5 N
- <img src="" id="videoImage" width="350" height="700">
0 i" U# K1 ~3 g! F8 \ - <button onclick="aphla()" style="height: 50px;width: 50px;">播放</button>
" V% ~; z8 }. B# a7 \2 i, G - <button onclick="vdStop()" style="height: 50px;width: 50px;">暂停</button>+ w+ T* _& h6 t
- </body>
3 | g( v9 F! J
复制代码javascript
- var v = document.getElementById("myVideo");/ x" l6 b$ T% Y$ R; C ?
- var c = document.getElementById("myCanvas");) g- ~: s" i3 L0 f5 F
- // var c = document.createElement("canvas");. ^+ t; W; B* Z7 v/ X" H' X" N
- var img = document.getElementById("videoImage");4 ?4 z( A, @, G* Y4 i
- ctx = c.getContext('2d');4 A1 ^9 D, m9 n- e4 q
- var dataUrl;. i9 T* E3 V. b$ }8 y6 ~0 j1 A
- const socket = new WebSocket('ws://xxxx.com:9502');
# X. O' I$ J' Q, s) |2 u - //Connection opened4 ~* F [8 o$ S0 z& O
- socket.addEventListener('open', function (event) {$ i+ z! d) t- K. J9 g
- // socket.send('Hello Server! im websockt');0 Z0 `; m8 ~6 H. G r/ y
- });
. l: {0 c& P4 [8 U/ r, ]; o - // Listen for messages
3 x! g0 w8 V* d1 C' z- E! X - socket.addEventListener('message', function (event) {# @2 r# V& p, G& Z
- console.log('Message from server ', event.data);" f* B* a$ S/ o- O
- img.src = event.data;
2 V; `4 u P' S. n - });# U' n* X( d, v O3 D* ~
- 3 E S X- k _$ A" Q
- function playVideo() {
8 I% {1 }% n# M - ctx.drawImage(v, 0, 0, 350, 700);
+ Y5 k$ a# A8 f; K' d - dataUrl = c.toDataURL("image/png");
7 s. T' P) X& @/ O2 n2 I - // img.src = dataUrl;: a; _$ Z+ s5 O, ]7 B
- socket.send(dataUrl);
5 D- \/ Z, b6 _; v! i% f4 O e - }
$ S% n3 S: z$ e, R" E- n" D( m" L* p% f - var tick;
6 Q" |3 f5 D2 V- F- N4 x- {% M - function aphla() {0 _1 o$ j4 C. `7 F" c1 Z# a% b( M
- tick = setInterval(function () {: w. t4 `* ?9 _6 L
- playVideo();
8 A& S( c) C+ I - }, 1);# z6 S* w1 V1 P2 Y0 Y
- }
- J/ J, o/ i7 L7 |+ e/ _ - function vdStop() {
0 s8 y& e+ e* s! A0 ]4 w' z - clearInterval(tick);. O: ~3 u5 K- {3 m7 t% A
- }4 _: H% O4 [0 ^
复制代码 用户页面. C& E( F+ K3 n2 q- U
html
- <img src="" id="liveImg">
复制代码javascript
- var img = document.getElementById("liveImg");
6 A3 x% b2 D- @* Q7 P. q M - const socket = new WebSocket("ws://lm.com:9502");
4 E3 S# G+ }6 W- T s" L3 x - //
2 `- \/ s* r/ o. C - socket.addEventListener('open',function(){
8 T, y+ j9 [+ I$ O( [ - socket.send('Hello Server! Im live.html');$ \' \( t$ ~ ]# Z+ D
- });
; Q9 A# C, B) J! o% [: O: k5 V0 ~ - // Listen for messages6 q! N! \$ }& u" S
- socket.addEventListener('message', function (event) {* P; T" t/ Q% W/ \5 u, a+ r
- //图片地址$ c; T" X* V9 h; E* S. _ @
- img.src = event.data;
. L/ U, r# c5 f' K+ i) Q2 o - });
/ C5 u6 k, p/ Y- |* O
复制代码真直播应是通过rtmp推流实现的,本次功能仅作为swoole框架的一个案例用法
x; z$ A$ {1 j: d' f# F. a% U
' a4 i/ y2 X# x) j" F5 P
| 欢迎光临 cncml手绘网 (http://www.cncml.com/) |
Powered by Discuz! X3.2 |