php使用swoole编写简单直播系统

字号+ 编辑: 种花家 修订: 种花家 来源: 网络转载 2024-06-01 我要说两句(0)

swoole 4.4之后彻底甩掉了某些不明框架作者所造的“不稳定”的帽子,文档中也明确解释了不希望开发者声明全局静态变量的原因。本文使用swoole4.4+编写直播页面demo代码。

首先编写一个后端server.php,代码如下

<?php

// 设置路径
define('_ROOT_', dirname(__FILE__));
require_once _ROOT_.'/tongji.php';

// swoole服务器
$server = new swoole_websocket_server("0.0.0.0", 9001);
$server->on('open', function (swoole_websocket_server $server, $request) {
    if(!file_exists(_ROOT_.'/client/'.$request->fd.'.client')){
        @file_put_contents(_ROOT_.'/client/'.$request->fd.'.client',$request->fd);
    }
});

// 服务端接收信息事件
$server->on('message', function (swoole_websocket_server $server, $frame) {
    foreach(notice(_ROOT_.'/client/') as $v){
        $server->push($v,$frame->data);
    }
});

// 服务端接收关闭事件
$server->on('close', function ($ser, $fd) {
    @unlink(_ROOT_.'/client/'.$fd.'.client');
});

$server->start();


后端统计模块  tongji.php

<?php
// 统计在线人数用

function clearDir($dir)
{
    $n = 0;
    if ($dh = opendir($dir))
    {
        while (($file = readdir($dh)) !== false)
        {
            if ($file == '.' or $file == '..')
            {
                continue;
            }
            if (is_file($dir . $file)) {
                $n++;
            }
        }
    }
    closedir($dh);
    return $n;
}

// 通知在线的人
function notice($dir){
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false)
        {
            if ($file == '.' or $file == '..')
            {
                continue;
            }
            if (is_file($dir . $file)) {
                $array[]=file_get_contents($dir.$file);
            }
        }
    }

    closedir($dh);

    return $array;
}

 

前端index.html

<!DOCTYPE html>
<html>

    <head>
        <meta charset="UTF-8"/>
        <title>直播页</title>
    </head>

<body>

    <img id="receiver" style='width:640px;height:480px'/>
    <script type="text/javascript" charset="utf-8>
        var ws = new WebSocket("ws://127.0.0.1:9001");
        var image = document.getElementById('receiver');
        ws.onopen = function() {}
        ws.onmessage = function(data) {
            image.src = data.data;
        }
    </script>

</body>
</html>


直播录制页 recorder.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>主播录制</title>
</head>
<body>
<video id="video" autoplay="" style='width:640px;height:480px'></video>
<canvas id="output" style="display:none"></canvas>
<script type="text/javascript" charset="utf-8">
    var ws = new WebSocket("ws://127.0.0.1:9001");
    var back = document.getElementById('output');
    var backcontext = back.getContext('2d');
    var video = document.getElementById("video");
    var success = function(stream){
        video.src = window.URL.createObjectURL(stream);
    }
    ws.onopen = function() {
        draw();
    }
    var draw = function() {
        try {
            backcontext.drawImage(video,0,0, back.width, back.height);
        } catch(e) {
            if ("NS_ERROR_NOT_AVAILABLE" === e.name) {
                return setTimeout(draw, 100);
            } else {
                throw e;
            }
        }
        
        if (video.src) {
            ws.send(back.toDataURL("image/jpeg", 0.5));
        }
        
        setTimeout(draw, 100);
    }
    
    navigator.getUserMedia = navigator.getUserMedia || navigator.webkitGetUserMedia ||
    navigator.mozGetUserMedia || navigator.msGetUserMedia;
    navigator.getUserMedia({video:true, audio:false}, success, console.log);
</script>
</body>
</html>


前端聊天室  chat.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8"/>
    <title>前端聊天室</title>
</head>
<body>
<div id="msg"></div>
<input type="text" id="text">
<input type="submit" value="发送数据" onclick="sendMsg()">
</body>
<script>
    var msg = document.getElementById("msg");
    var wsServer = 'ws://127.0.0.1:9001';
    // 调用websocket对象建立连接:
    // 参数:ws/wss(加密):// ip:port (字符串)
    var websocket = new WebSocket(wsServer);
    // onopen监听连接打开
    websocket.onopen = function (evt) {
        // websocket.readyState 属性:
        /**
            CONNECTING    0    尚未开始连接
            OPEN    1    连接成功准备通讯
            CLOSING    2    连接准备关闭
            CLOSED    3    连接已关闭不能重开
        */
        msg.innerHTML = websocket.readyState;
    };
    function sendMsg(){
        var text = document.getElementById('text').value;
        document.getElementById('text').value = '';
        //向服务器发送数据
        websocket.send(text);
    }
      //监听连接关闭
//    websocket.onclose = function (evt) {
//        console.log("Disconnected");
//    };
    // onmessage 监听服务器数据推送
    websocket.onmessage = function (evt) {
        msg.innerHTML += evt.data +'<br>';
//        console.log('Retrieved data from server: ' + evt.data);
    };
// 监听连接错误信息
//    websocket.onerror = function (evt, e) {
//        console.log('Error occured: ' + evt.data);
//    };
</script>
</html>


首先确定你当前php环境里是否正确安装了swoole

php --ri swoole

如果检查没有,需要安装swoole先

如果安装了,用以下命令来运行直播间

php ./server.php

完结撒花

阅完此文,您的感想如何?
  • 有用

    43

  • 没用

    3

  • 开心

    12

  • 愤怒

    1

  • 可怜

    2

1.如文章侵犯了您的版权,请发邮件通知本站,该文章将在24小时内删除;
2.本站标注原创的文章,转发时烦请注明来源;
3.Q群: 2702237 13835667

相关课文
  • mac开发接入微信公众号接口返回报错 cURL error 56: SSLRead() return error -9806

  • pecl安装程序时报错Array and string offset access syntax with curly braces is no longer supported

  • PHP的换行符是什么

  • 由于商家传入的H5交易参数有误,该笔交易暂时无法完成,请联系商家解决

我要说说
网上嘉宾点评