php 实现 rtmp
PHP 实现 RTMP 流媒体
PHP 本身并不直接支持 RTMP(Real-Time Messaging Protocol)协议,因为 RTMP 是 Adobe 开发的专有协议,主要用于低延迟的流媒体传输。不过可以通过以下几种方式间接实现 RTMP 相关功能:
使用 FFmpeg 推流
FFmpeg 是一个强大的多媒体处理工具,可以通过 PHP 调用其命令行工具实现 RTMP 推流。
$rtmpUrl = "rtmp://example.com/live/streamkey";
$videoSource = "input.mp4";
$command = "ffmpeg -re -i " . escapeshellarg($videoSource) .
" -c:v libx264 -preset ultrafast -tune zerolatency " .
"-c:a aac -f flv " . escapeshellarg($rtmpUrl);
exec($command, $output, $returnCode);
-re参数表示以实际速率读取输入-c:v libx264指定 H.264 视频编码-preset ultrafast和-tune zerolatency用于降低延迟-f flv指定输出格式为 FLV 容器
使用 PHP-FFmpeg 扩展包
对于更 PHP 友好的方式,可以使用 php-ffmpeg/php-ffmpeg 包:
require 'vendor/autoload.php';
$ffmpeg = FFMpeg\FFMpeg::create();
$video = $ffmpeg->open('input.mp4');
$format = new FFMpeg\Format\Video\FLV();
$format->on('progress', function ($video, $format, $percentage) {
echo "转码进度: {$percentage}%";
});
$video->save($format, 'rtmp://example.com/live/streamkey');
通过 Nginx RTMP 模块接收
在服务器端配置 Nginx 的 RTMP 模块来接收 PHP 推送的流:
rtmp {
server {
listen 1935;
chunk_size 4096;
application live {
live on;
record off;
allow publish 127.0.0.1;
deny publish all;
}
}
}
使用 WebSocket 作为替代方案
对于需要低延迟但不需要严格 RTMP 的场景,可以考虑:
// 使用 Ratchet 实现 WebSocket 服务器
$server = new Ratchet\App('localhost', 8080);
$server->route('/live', new MyVideoStreamHandler());
$server->run();
配合前端使用 MSE (Media Source Extensions) 或 WebRTC 实现类似效果。
注意事项
- RTMP 需要专门的媒体服务器如 Wowza、Nginx-RTMP 或 SRS
- 现代浏览器已不再支持原生 RTMP,需通过 Flash 或转 HLS/DASH
- 考虑使用更新的协议如 SRT 或 WebRTC 替代 RTMP
- 确保服务器防火墙允许 TCP 1935 端口通信
以上方法提供了在 PHP 环境中处理 RTMP 流的多种途径,具体选择取决于项目需求和基础设施条件。







