php 实现视频直播
PHP 实现视频直播的基本方法
PHP 本身不直接处理视频流的编解码或传输,但可以结合其他技术实现直播功能。以下是常见的实现方案:
使用 FFmpeg 和流媒体服务器
安装 FFmpeg 工具处理视频流:
sudo apt-get install ffmpeg
PHP 调用 FFmpeg 推流到 RTMP 服务器:
$ffmpegPath = '/usr/bin/ffmpeg';
$inputFile = 'input.mp4';
$rtmpUrl = 'rtmp://your-server-url/live/stream-key';
$command = "$ffmpegPath -re -i $inputFile -c:v libx264 -preset veryfast -maxrate 3000k -bufsize 6000k -pix_fmt yuv420p -g 50 -c:a aac -b:a 160k -ac 2 -ar 44100 -f flv $rtmpUrl";
exec($command);
搭建流媒体服务器
常用流媒体服务器选择:
- Nginx with RTMP module
- SRS (Simple RTMP Server)
- Red5
- Wowza
Nginx RTMP 模块配置示例:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
}
}
}
前端播放器集成
使用 HLS 或 DASH 协议播放:
<video id="player" controls autoplay></video>
<script>
if(Hls.isSupported()) {
var video = document.getElementById('player');
var hls = new Hls();
hls.loadSource('http://your-server/live/stream.m3u8');
hls.attachMedia(video);
hls.on(Hls.Events.MANIFEST_PARSED,function() {
video.play();
});
}
</script>
实现直播聊天互动
PHP 结合 WebSocket 实现实时聊天:
// 使用 Ratchet 库实现 WebSocket 服务器
use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use MyApp\Chat;
require dirname(__DIR__) . '/vendor/autoload.php';
$server = IoServer::factory(
new HttpServer(
new WsServer(
new Chat()
)
),
8080
);
$server->run();
安全与认证措施
实现推流和播放的权限控制:
// 生成临时 token
function generateStreamToken($streamKey) {
$secret = 'your-secret-key';
$expire = time() + 3600; // 1小时有效期
return md5($streamKey . $secret . $expire) . ':' . $expire;
}
// 验证 token
function verifyStreamToken($token, $streamKey) {
$secret = 'your-secret-key';
list($hash, $expire) = explode(':', $token);
if(time() > $expire) return false;
return $hash === md5($streamKey . $secret . $expire);
}
性能优化建议
- 使用 CDN 分发直播流减轻服务器压力
- 配置多级转码适应不同设备
- 实现自适应码率 (ABR) 技术
- 使用硬件加速编码 (如 NVIDIA NVENC)
- 监控服务器负载和网络带宽
云端直播解决方案
对于不想自建服务器的场景,可考虑:
- AWS Elemental MediaLive
- 阿里云直播服务
- 腾讯云直播
- 七牛云直播
这些服务通常提供 PHP SDK 便于集成:
use Qiniu\Pili\Mac;
use Qiniu\Pili\Client;
$accessKey = 'YOUR_AK';
$secretKey = 'YOUR_SK';
$mac = new Mac($accessKey, $secretKey);
$client = new Client($mac);
$hub = $client->hub('live-hub');
$stream = $hub->stream('stream-id');
$url = $stream->rtmpPublishUrl();






