
Workerman ialah rangka kerja PHP berprestasi tinggi yang boleh mencapai berpuluh juta sambungan serentak melalui I/O tak segerak Ia sesuai untuk komunikasi masa nyata, pelayan konkurensi tinggi dan senario lain. Dalam artikel ini, kami akan memperkenalkan cara menggunakan rangka kerja Workerman untuk membangunkan sistem video langsung berdasarkan protokol WebSocket, termasuk perkhidmatan membina, melaksanakan tolakan dan penerimaan strim video langsung, paparan halaman hadapan, dsb.
1. Bina pelayan
1 Pasang pakej kebergantungan Pekerja:
Jalankan arahan berikut untuk memasang pakej tanggungan Pekerja:
composer require workerman/workerman
2 . Kodnya adalah seperti berikut:
<?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();
Dalam kod di atas, kami mencipta objek Worker bernama worker dan mendengar port 2345 untuk berkomunikasi menggunakan protokol websocket. Dalam fungsi panggil balik onMessage, jika pelanggan menghantar mesej "mula", ini bermakna pelanggan ingin meminta strim video langsung. Kami memperoleh strim video melalui fungsi getVideoStream dan menggunakan pemasa untuk menolak data strim video kepada pelanggan setiap saat. Jika pelanggan menghantar mesej "berhenti", ini bermakna pelanggan berhenti meminta strim video langsung dan kami menutup pemasa yang sepadan dengan sambungan. Permintaan lain mengembalikan respons secara langsung.
2. Cipta fail video
Kami mencipta folder video dalam direktori akar dan menambah fail video bernama video.mp4 di dalamnya. Fail video ini boleh digantikan dengan strim video langsung anda sendiri.
3 Mulakan pelayan
Pergi ke direktori di mana workerman.php terletak pada baris arahan dan jalankan arahan berikut untuk memulakan pelayan:
php workerman.php start
Selepas permulaan yang berjaya, pelayan akan mendengar pada port 2345 dan boleh menerima permintaan daripada pelanggan Diminta.
2. Laksanakan klien
1. Perkenalkan socket.io dan video.js
Kami menggunakan dua perpustakaan, socket.io dan video.js, untuk melaksanakan fungsi klien ini perlu diperkenalkan dalam halaman html .
<!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>
Dalam kod di atas, kami mencipta halaman html ringkas termasuk butang mula, butang tamat dan pemain video. Apabila butang mula diklik, mesej "mula" dihantar ke pelayan untuk meminta aliran video. Apabila butang tamat diklik, mesej "berhenti" dihantar kepada pelayan untuk berhenti meminta strim video dan menjeda main balik video. Apabila menerima data strim video yang ditolak oleh pelayan, kami menggunakan fungsi URL.createObjectURL untuk mencipta URL strim video dan menghantar URL kepada pemain video.js untuk main semula.
2 Mulakan pelanggan
Lawati halaman html di atas dalam penyemak imbas dan klik butang mula untuk mula memainkan strim video langsung. Klik butang Berhenti untuk berhenti meminta strim video dan jeda main balik video.
Ringkasan
Dengan menggunakan rangka kerja Workerman dan protokol WebSocket, kami boleh melaksanakan sistem siaran langsung video berprestasi tinggi dan kependaman rendah dengan mudah. Workerman menyediakan sokongan I/O tidak menyekat tak segerak dan boleh mengendalikan senario dengan cepat di mana berjuta-juta sambungan diakses secara serentak, membawa kemudahan hebat kepada komunikasi masa nyata, pelayan konkurensi tinggi dan medan lain. Dalam artikel ini, kami menggunakan keupayaan komunikasi tak segerak Workerman untuk menolak dan menerima strim video masa nyata antara pelayan dan pelanggan, menjadikan sistem siaran langsung lebih lancar dan cekap.
Atas ialah kandungan terperinci Pembangunan pekerja: Cara melaksanakan sistem siaran langsung video berdasarkan protokol WebSocket. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!