日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

Workerman是一款高性能的PHP框架,它能夠通過異步非阻塞I/O實(shí)現(xiàn)千萬(wàn)級(jí)并發(fā)連接,適合用于實(shí)時(shí)通訊、高并發(fā)服務(wù)器等場(chǎng)景。在本文中,我們將介紹如何使用Workerman框架開發(fā)一個(gè)基于WebSocket協(xié)議的視頻直播系統(tǒng),包括搭建服務(wù)、實(shí)現(xiàn)直播視頻流的推送和接收、前端頁(yè)面的展示等。

一、搭建服務(wù)端

1.安裝Workerman依賴包:

運(yùn)行以下命令安裝Workerman的依賴包:

composer require workerman/workerman

登錄后復(fù)制

2.創(chuàng)建服務(wù)端

創(chuàng)建一個(gè)workerman.php文件,作為我們的服務(wù)端代碼。代碼如下:

<?php
use WorkermanWorker;
use WorkermanLibTimer;

require_once __DIR__ . '/vendor/autoload.php';

// 創(chuàng)建一個(gè)Worker監(jiān)聽2345端口,使用websocket協(xié)議通訊
$worker = new Worker("websocket://0.0.0.0:2345");

// 啟動(dòng)4個(gè)進(jìn)程對(duì)外提供服務(wù)
$worker->count = 4;

// 客戶端連接時(shí)觸發(fā)
$worker->onConnect = function($connection) {
    echo "New client connected!
";
};

// 客戶端請(qǐng)求時(shí)觸發(fā)
$worker->onMessage = function($connection, $data) {
    if(strpos($data, 'start') === 0) {
        // 該客戶端請(qǐng)求直播視頻流
        $connection->send(getVideoStream());
        // 啟動(dòng)定時(shí)器,每秒向客戶端發(fā)送一份視頻流
        $timer_id = Timer::add(1, function()use($connection){
            $connection->send(getVideoStream());
        });
        // 將定時(shí)器ID綁定到連接上,方便后續(xù)停止定時(shí)器
        $connection->timer_id = $timer_id;
    }
    else if(strpos($data, 'stop') === 0) {
        // 該客戶端停止請(qǐng)求直播視頻流
        Timer::del($connection->timer_id);
    }
    else {
        // 其他請(qǐng)求,直接返回響應(yīng)
        $connection->send("Hello, $data!");
    }
};

// 客戶端斷開連接時(shí)觸發(fā)
$worker->onClose = function($connection) {
    // 清除定時(shí)器
    Timer::del($connection->timer_id);
    echo "Client disconnected!
";
};

// 以下是獲取直播視頻流的代碼,可以替換為你自己的視頻流獲取代碼
function getVideoStream() {
    $fp = fopen("videos/video.mp4", "rb");
    $chunk_size = 1024*1024; // 每次讀取1MB
    $buffer = "";
    while(!feof($fp)) {
        $buffer .= fread($fp, $chunk_size);
        ob_flush();
        flush();
    }
    fclose($fp);
    return $buffer;
}

// 運(yùn)行worker
Worker::runAll();

登錄后復(fù)制

在上面的代碼中,我們創(chuàng)建了一個(gè)名為worker的Worker對(duì)象,并監(jiān)聽2345端口,使用websocket協(xié)議通信。在onMessage回調(diào)函數(shù)中,如果客戶端發(fā)送了”start”消息,則表示客戶端想要請(qǐng)求直播視頻流。我們通過getVideoStream函數(shù)獲取視頻流,并使用定時(shí)器每秒向客戶端推送一份視頻流數(shù)據(jù)。如果客戶端發(fā)送了”stop”消息,則表示客戶端停止請(qǐng)求直播視頻流,我們關(guān)閉該連接對(duì)應(yīng)的定時(shí)器。其他請(qǐng)求則直接返回響應(yīng)。

2.創(chuàng)建視頻文件

我們?cè)诟夸浵聞?chuàng)建一個(gè)videos文件夾,并在其中添加一個(gè)名為video.mp4的視頻文件。該視頻文件可以替換為你自己的直播視頻流。

3.啟動(dòng)服務(wù)端

在命令行中進(jìn)入到workerman.php所在的目錄,運(yùn)行以下命令啟動(dòng)服務(wù)端:

php workerman.php start

登錄后復(fù)制

啟動(dòng)成功后,服務(wù)端就監(jiān)聽在2345端口上,可以接收來自客戶端的請(qǐng)求了。

二、實(shí)現(xiàn)客戶端

1.引入socket.io和video.js

我們使用socket.io和video.js兩個(gè)庫(kù)實(shí)現(xiàn)客戶端的功能,需要在html頁(yè)面中引入這兩個(gè)庫(kù)。

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Video live demo</title>
    <style>
        video {
            width: 800px;
            height: 600px;
        }
    </style>
</head>

<body>
    <h1>Video live demo</h1>
    <button id="start">Start live</button>
    <button id="stop">Stop live</button>
    <br/><br/>
    <video id="video-player" class="video-js vjs-default-skin"></video>

    <script src="https://cdn.bootcss.com/socket.io/3.1.3/socket.io.js"></script>
    <link href="https://cdn.bootcss.com/video.js/7.15.4/video-js.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/video.js/7.15.4/video.min.js"></script>
    <script>
        var socket = io('http://localhost:2345');
        var player = videojs('video-player');

        // 點(diǎn)擊開始按鈕,向服務(wù)端發(fā)起請(qǐng)求獲取視頻流
        document.querySelector('#start').addEventListener('click', function() {
            socket.send('start');
        });
        // 點(diǎn)擊結(jié)束按鈕,停止請(qǐng)求視頻流
        document.querySelector('#stop').addEventListener('click', function() {
            socket.send('stop');
            player.pause();
        });
        // 收到服務(wù)端推送的視頻流數(shù)據(jù),開始播放視頻
        socket.on('message', function(data) {
            player.src({ type: 'video/mp4', src: URL.createObjectURL(new Blob([data], { type: 'video/mp4' })) });
            player.play();
        });
    </script>
</body>
</html>

登錄后復(fù)制

在上面的代碼中,我們創(chuàng)建了一個(gè)簡(jiǎn)單的html頁(yè)面,包括一個(gè)開始按鈕、一個(gè)結(jié)束按鈕和一個(gè)視頻播放器。當(dāng)點(diǎn)擊開始按鈕時(shí),向服務(wù)端發(fā)送”start”消息表示請(qǐng)求視頻流。當(dāng)點(diǎn)擊結(jié)束按鈕時(shí),向服務(wù)端發(fā)送”stop”消息表示停止請(qǐng)求視頻流,并暫停視頻播放。當(dāng)收到服務(wù)端推送的視頻流數(shù)據(jù)時(shí),我們使用URL.createObjectURL函數(shù)創(chuàng)建一個(gè)視頻流的URL,并將該URL傳遞給video.js的播放器進(jìn)行播放。

2.啟動(dòng)客戶端

在瀏覽器中訪問上述html頁(yè)面,點(diǎn)擊開始按鈕,即可開始播放直播視頻流。點(diǎn)擊停止按鈕,則停止請(qǐng)求視頻流并暫停視頻播放。

總結(jié)

通過使用Workerman框架和WebSocket協(xié)議,我們可以輕松實(shí)現(xiàn)一個(gè)高性能、低延遲的視頻直播系統(tǒng)。Workerman提供了異步非阻塞I/O的支持,能夠快速處理數(shù)百萬(wàn)連接同時(shí)訪問的場(chǎng)景,為實(shí)時(shí)通訊、高并發(fā)服務(wù)器等領(lǐng)域帶來了極大的便利。本文中,我們用到了Workerman的異步通訊能力,在服務(wù)端和客戶端之間實(shí)現(xiàn)了實(shí)時(shí)視頻流的推送和接收,讓直播系統(tǒng)變得更加流暢和高效。

分享到:
標(biāo)簽:WebSocket Workerman 視頻直播
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定