php ffmpeg实现直播
PHP 结合 FFmpeg 实现直播
环境准备
确保服务器已安装 FFmpeg,可通过命令行检查版本:
ffmpeg -version
PHP 需开启 shell_exec 或 exec 函数权限,用于调用 FFmpeg。
推流到 RTMP 服务器
使用 FFmpeg 将视频源推流到 RTMP 服务器(如 Nginx-RTMP 或 SRS):
$ffmpegPath = '/usr/bin/ffmpeg'; // FFmpeg 路径
$inputFile = 'input.mp4'; // 输入文件或设备(如摄像头)
$rtmpUrl = 'rtmp://server/live/stream_key'; // RTMP 地址
$command = "$ffmpegPath -re -i $inputFile -c:v libx264 -preset ultrafast -tune zerolatency -c:a aac -f flv $rtmpUrl";
shell_exec($command);
参数说明:
-re:以输入源原生帧率读取。-c:v libx264:使用 H.264 编码视频。-preset ultrafast:低延迟编码。-f flv:输出 FLV 格式兼容 RTMP。
处理实时摄像头流
若从摄像头采集,需指定设备(如 /dev/video0)并调整参数:
$command = "$ffmpegPath -f v4l2 -i /dev/video0 -vf format=yuv420p -c:v libx264 -preset ultrafast -f flv $rtmpUrl";
生成 HLS 直播流
将直播流切片为 HLS 格式供网页播放:
$hlsPath = '/var/www/html/live/stream.m3u8';
$command = "$ffmpegPath -i $rtmpUrl -c:v copy -c:a copy -f hls -hls_time 2 -hls_list_size 5 $hlsPath";
参数说明:
-hls_time 2:每个切片 2 秒。-hls_list_size 5:保留最近 5 个切片。
网页播放器集成
在 HTML 中使用 HLS.js 或原生 video 标签播放:
<video controls>
<source src="http://yourdomain.com/live/stream.m3u8" type="application/x-mpegURL">
</video>
错误处理与日志
捕获 FFmpeg 执行状态和输出:
$output = [];
$returnCode = 0;
exec("$command 2>&1", $output, $returnCode);
if ($returnCode !== 0) {
error_log("FFmpeg 错误: " . implode("\n", $output));
}
注意事项
- 推流前测试 FFmpeg 命令能否在终端单独运行。
- 确保服务器带宽和 CPU 足够处理实时编码。
- 对于长时间直播,建议用 Supervisor 监控 FFmpeg 进程。







