Heim > Artikel > PHP-Framework > Workerman-Entwicklung: So implementieren Sie ein Video-Live-Übertragungssystem basierend auf dem WebSocket-Protokoll
Workerman ist ein leistungsstarkes PHP-Framework, das durch asynchrone, nicht blockierende E/A zig Millionen gleichzeitige Verbindungen erreichen kann. Es eignet sich für Echtzeitkommunikation, Server mit hoher Parallelität und andere Szenarien. In diesem Artikel stellen wir vor, wie Sie mit dem Workerman-Framework ein Live-Videosystem basierend auf dem WebSocket-Protokoll entwickeln, einschließlich der Erstellung von Diensten, der Implementierung von Push und Empfang von Live-Videostreams, der Anzeige von Front-End-Seiten usw.
1. Erstellen Sie den Server
1. Installieren Sie das Workerman-Abhängigkeitspaket:
composer require workerman/workerman
2. Erstellen Sie eine workerman.php-Datei als unseren Servercode . Der Code lautet wie folgt:
<?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();
Im obigen Code erstellen wir ein Worker-Objekt namens worker und überwachen Port 2345, um über das Websocket-Protokoll zu kommunizieren. Wenn der Client in der Rückruffunktion onMessage eine „Start“-Nachricht sendet, bedeutet dies, dass der Client einen Live-Videostream anfordern möchte. Wir erhalten den Videostream über die Funktion getVideoStream und verwenden einen Timer, um jede Sekunde Videostreamdaten an den Client zu senden. Wenn der Client eine „Stopp“-Nachricht sendet, bedeutet dies, dass der Client die Anforderung des Live-Videostreams beendet und wir den der Verbindung entsprechenden Timer schließen. Andere Anfragen geben Antworten direkt zurück.
2. Erstellen Sie eine Videodatei
Wir erstellen einen Videoordner im Stammverzeichnis und fügen darin eine Videodatei mit dem Namen video.mp4 hinzu. Diese Videodatei kann durch Ihren eigenen Live-Videostream ersetzt werden.
3. Starten Sie den Server
Gehen Sie in der Befehlszeile in das Verzeichnis, in dem sich workerman.php befindet, und führen Sie den folgenden Befehl aus, um den Server zu starten:
php workerman.php start
Nach erfolgreichem Start lauscht der Server auf Port 2345 und kann empfangen Anfragen des Kunden.
2. Implementieren Sie den Client
1. Führen Sie socket.io und video.js ein. Wir verwenden zwei Bibliotheken, socket.io und video.js, um Client-Funktionen zu implementieren .
<!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>
Im obigen Code haben wir eine einfache HTML-Seite erstellt, die eine Startschaltfläche, eine Endschaltfläche und einen Videoplayer enthält. Wenn auf die Schaltfläche „Start“ geklickt wird, wird eine „Start“-Nachricht an den Server gesendet, um den Videostream anzufordern. Wenn auf die Schaltfläche „Ende“ geklickt wird, wird eine „Stopp“-Nachricht an den Server gesendet, um die Anforderung des Videostreams zu beenden und die Videowiedergabe anzuhalten. Beim Empfang der vom Server gepushten Videostream-Daten verwenden wir die Funktion URL.createObjectURL, um eine Videostream-URL zu erstellen und die URL zur Wiedergabe an den video.js-Player zu übergeben.
2. Starten Sie den Client
Besuchen Sie die obige HTML-Seite im Browser und klicken Sie auf die Schaltfläche „Start“, um die Wiedergabe des Live-Videostreams zu starten. Klicken Sie auf die Schaltfläche „Stopp“, um die Anforderung des Videostreams zu beenden und die Videowiedergabe anzuhalten.
Zusammenfassung
Durch die Verwendung des Workerman-Frameworks und des WebSocket-Protokolls können wir problemlos ein leistungsstarkes Video-Live-Übertragungssystem mit geringer Latenz implementieren. Workerman bietet asynchrone, nicht blockierende E/A-Unterstützung und kann schnell Szenarien bewältigen, in denen auf Millionen von Verbindungen gleichzeitig zugegriffen wird, was großen Komfort für Echtzeitkommunikation, Server mit hoher Parallelität und andere Bereiche bietet. In diesem Artikel nutzen wir die asynchronen Kommunikationsfunktionen von Workerman, um Echtzeit-Videostreams zwischen dem Server und dem Client zu übertragen und zu empfangen, wodurch das Live-Übertragungssystem reibungsloser und effizienter wird.
Das obige ist der detaillierte Inhalt vonWorkerman-Entwicklung: So implementieren Sie ein Video-Live-Übertragungssystem basierend auf dem WebSocket-Protokoll. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!