php实现视频直播
PHP 实现视频直播的基本方法
PHP 本身并不直接处理视频流,但可以作为后端支持视频直播系统的搭建。以下是几种常见的实现方式:
使用第三方流媒体服务 利用现成的流媒体平台(如 Wowza、Red5、Nginx-RTMP)作为中转,PHP 负责生成推流地址和权限验证。例如通过 API 生成临时推流密钥,前端通过 WebRTC 或 RTMP 协议推流到这些服务器。
FFmpeg 转码推流 通过 PHP 调用 FFmpeg 将上传的视频实时转码并推送到流媒体服务器:
$ffmpeg = 'ffmpeg -re -i input.mp4 -c:v libx264 -preset ultrafast -f flv rtmp://server/live/streamkey';
shell_exec($ffmpeg);
WebRTC 信令服务器 使用 PHP 搭建 WebRTC 的信令服务器,交换 SDP 和 ICE 候选信息。需配合前端 JavaScript 实现 P2P 直播:
// 示例:处理 WebSocket 信令
$server = new WebSocketServer("0.0.0.0", 9000);
$server->on('message', function($data) {
// 转发信令消息给其他客户端
});
关键组件与技术栈
推流端方案

- OBS Studio:专业推流工具,支持 RTMP/WebRTC
- 手机端:Larix Broadcaster 等 App 推送 RTMP 流
- 浏览器端:通过 MediaRecorder API 捕获并推送 WebRTC 流
播放器集成
- HLS 协议:使用 hls.js 库兼容所有浏览器
- FLV 协议:通过 flv.js 播放 RTMP 流的低延迟方案
- MSE (Media Source Extensions):实现自定义流处理
<!-- HLS 播放示例 -->
<video id="video" controls></video>
<script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
<script>
if(Hls.isSupported()) {
const hls = new Hls();
hls.loadSource('http://server/live/stream.m3u8');
hls.attachMedia(document.getElementById('video'));
}
</script>
性能优化建议
延迟控制
- 使用 WebRTC 可实现 500ms 以下延迟
- RTMP 转 HLS 时设置短分片时长(如 1s)
- 开启低延迟模式:
-tune zerolatency(FFmpeg 参数)
服务器配置

- Nginx 需添加 RTMP 模块:
rtmp { server { listen 1935; application live { live on; interleave on; hls on; hls_path /tmp/hls; hls_fragment 1s; } } }
安全措施
- 推流鉴权:通过 PHP 动态生成带签名的 RTMP URL
- 防盗链:检查 HTTP Referer 或使用 Token 验证
- 流量限制:限制单个 IP 的推流带宽
完整实现示例
后端推流鉴权
// 生成临时推流地址
function generateStreamUrl($userId) {
$key = 'secret_key';
$expire = time() + 3600;
$token = md5("/live/{$userId}-{$expire}-{$key}");
return "rtmp://server/live/{$userId}?token={$token}&expire={$expire}";
}
前端播放器集成
// 输出自适应播放器代码
function embedPlayer($streamId) {
return <<<HTML
<div id="player-container"></div>
<script>
initPlayer('$streamId', {
hls: 'https://cdn.domain/hls.js',
flv: 'https://cdn.domain/flv.js'
});
</script>
HTML;
}
实际部署时建议结合具体需求选择协议和技术栈,WebRTC 适合互动直播场景,RTMP+HLS 更适合大规模分发。





