Rumah > Artikel > rangka kerja php > Pembangunan pekerja: Cara melaksanakan sistem siaran langsung video berdasarkan protokol WebSocket
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'; // 创建一个Worker监听2345端口,使用websocket协议通讯 $worker = new Worker("websocket://0.0.0.0:2345"); // 启动4个进程对外提供服务 $worker->count = 4; // 客户端连接时触发 $worker->onConnect = function($connection) { echo "New client connected! "; }; // 客户端请求时触发 $worker->onMessage = function($connection, $data) { if(strpos($data, 'start') === 0) { // 该客户端请求直播视频流 $connection->send(getVideoStream()); // 启动定时器,每秒向客户端发送一份视频流 $timer_id = Timer::add(1, function()use($connection){ $connection->send(getVideoStream()); }); // 将定时器ID绑定到连接上,方便后续停止定时器 $connection->timer_id = $timer_id; } else if(strpos($data, 'stop') === 0) { // 该客户端停止请求直播视频流 Timer::del($connection->timer_id); } else { // 其他请求,直接返回响应 $connection->send("Hello, $data!"); } }; // 客户端断开连接时触发 $worker->onClose = function($connection) { // 清除定时器 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; } // 运行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'); // 点击开始按钮,向服务端发起请求获取视频流 document.querySelector('#start').addEventListener('click', function() { socket.send('start'); }); // 点击结束按钮,停止请求视频流 document.querySelector('#stop').addEventListener('click', function() { socket.send('stop'); player.pause(); }); // 收到服务端推送的视频流数据,开始播放视频 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!