it编程 > 软件设计 > 架构设计

纯php编写rtmp服务

73人参与 2024-08-04 架构设计

rtmp_server

简介

一个使用纯php开发的rtmp直播服务器,支持rtmp协议推流,rtmp拉流,支持flv格式拉流,可以使用http或者ws协议拉流。<br>

安装

composer create-project xiaosongshu/rtmp_server

环境配置

本项目使用php8.1,建议新手使用<a href="https://www.xp.cn/">phpstudy</a>这个集成环境,一键搞定环境搭建工作。<br> 或者使用本项目提供的<a href="https://www.docker.com/">docker</a>环境,在本项目根目录下命令行执行以下命令:

docker-compose up -d

本项目自带的docker配置已经集成了php相关扩展和ffmpeg。<br> 本项目默认使用三个端口:

1935:rtmp服务
8501:flv服务
80:web服务

开启服务

进入本项目的根目录,在命令行执行以下命令:

php server.php

关闭服务

windows系统

ctrl + c 

linux系统

kill -9 pid

推流

推流地址:rtmp://127.0.0.1/a/b

其中a是应用名称,b是频道名称,这两个参数可以改变,但只能是英文或者数字。可以自行修改。

我自己调试使用的obs,使用方法可以参考 <a href="https://www.tencentcloud.com/zh/document/product/267/31569">网上教程</a>, obs工具<a href="https://obsproject.com/">下载</a>。<br> 你也可以使用<a href="https://ffmpeg.org/">ffmpeg</a>工具,命令如下

ffmpeg -re -stream_loop 1  -i "movie.mp4" -vcodec h264 -acodec aac -f flv rtmp://127.0.0.1/a/b

命令详解

-re:表示以实时模式运行 ffmpeg。
-stream_loop 1:设置流循环次数为1。
-i "movie.mp4":指定输入文件为"movie.mp4"。
-vcodec h264:强制使用 h.264 视频编解码器进行编码。
-acodec aac:强制使用 aac 音频编解码器进行编码。
-f flv:指定输出格式为 flv。
rtmp://127.0.0.1/a/b:指定 rtmp 服务器的地址和路径。

拉流

rtmp: rtmp://127.0.0.1/a/b

flv(http): http://127.0.0.1:8501/a/b.flv

flv(ws): ws://127.0.0.1:8501/a/b.flv

hls:http://127.0.0.1:80/a/b.m3u8 (需要使用ffmpeg转换协议)

播放工具可以使用:<br> <a href="https://get.videolan.org/vlc/3.0.20/win64/vlc-3.0.20-win64.exe">vlc</a>打开网络串流地址<br> <a href="https://ffmpeg.org/">ffplay</a> ffplay rtmp://127.0.0.1/a/b<br> 本项目提供网页播放,直接使用浏览器打开index.html即可,访问地址 http://127.0.0.1:80/index.html 。<br> 本项目提供网页播放,直接使用浏览器打开play.html即可,访问地址 href="http://127.0.0.1:80/play.html 。<br>

延迟问题

在理想状态的情况下测试,延迟在1秒以内。理想状态就是:直播服务器和推流,拉流都在同一台电脑,减少了网络波动的影响。<br> 另外,如果使用浏览器播放,某些浏览器如果切换到后台,因为节能的关系,浏览器不会播放直播,当浏览器切换到前台才会接着上一次的位置重新播放,这样子延迟 就相当高了。<br> 当然了如果服务端处理器性能拉胯,延迟也会很高,因为直播服务很耗性能的。

关于对hls协议的支持

本项目非常抱歉没有实现对hls的支持,但是提供了一个解决办法,使用ffmpeg工具对协议的转换,以上面的rtmp://127.0.0.1/a/b流为例,本项目默认将 hls协议的文件保存在hls目录下,所以你需要在项目根目录手动创建一个/a/目录。然后在命令行执行以下命令即可完成rtmp协议转换为hls协议。

ffmpeg -i rtmp://127.0.0.1/a/b -c:v h264 -c:a aac -f hls -hls_time 3 -hls_list_size 0   ./a/b.m3u8

若需要退出协议转换,请在命令行输入q即可退出。

注意:如果需要使用hls协议,那么创建流的时候,应用名称(比如上面的变量a)要避免使用本项目的目录,否则会污染项目。需要避开的关键字如下所示:
mediaserver,public,root,sabreamf,vendor。另外不建议使用php语言相关关键字,可能后期拓展会用到。

命令详解

-i rtmp://127.0.0.1/a/b              rtmp输入流,即rtmp拉流地址                     可以修改
-c:v h264                            选择视频编码方式为h264                         不用修改
-c:a aac                             选择音频编码方式为aac                          不用修改
-f hls                               指定输出格式为hls                             不用修改
-hls_time 3                          设置hls切片的时间间隔为1秒                      可以修改
-hls_list_size 0                     设置hls播放列表的大小为0,即只生成一个播放列表文件  不用修改
./a/b.m3u8                           指定输出文件的路径和名称                        可以修改

直播代理转发服务

本项目提供直播转发服务,使用多进程转发音视频数据。因为如果所有的播放器都接入到主进程,一旦播放器客户端数量上升到一定数量级后,只靠一个进程处理延迟会很高。 所以加入了子进程转发数据的服务。开启子进程转发服务后,播放器客户端可以接入到子进程。<br>

操作方法

启动主进程服务

php server.php

启动子进程服务

php gateway.php

子进程转发的是flv数据流。子进程可以设置一个flv的端口,不要和主进程server.php一样。你可以开启多个子进程转发,每一个子进程的端口都不一样。你的播放器 可以接入子进程的服务器。<br> 比如:开启一个主进程服务推流服务器,开启一个子进程,端口好为8504,创建一个直播应用为/a/b,使用ffmpeg或者obs推流到服务器。那么子进程的拉流 地址是


http://127.0.0.1:8504/a/b.flv

ws://127.0.0.1:8504/a/b.flv

。如果播放不了,可能是因为转发延迟,刷新一下重新播放。<br>

本项目提供了两个测试播放转发数据页面。访问地址是:http://127.0.0.1:80/daili.htmlhttp://127.0.0.1:80/flv.html

存在的问题

转发后的数据,可能是因为数据还原有问题,或者丢失了关键帧,或者关键帧之间的数据顺序错乱了,或者关键帧之间的时间相距过长,导致花屏马赛克,不清晰。 尚未找到具体原因,等待后面解决吧。<br>

转发后,使用vlc播放器可以立即解码播放(虽然花屏有马赛克,可终究可以播放是吧),但是使用js的浏览器不能立即解码(目测是js不够强大,不能还原数据), 看运气,有时候能够立刻解码,有时候要很久才能解码。猜测是缺少完整的连续帧引起的,但是检测连续帧是正确的,奇了怪了。<br>

另外,经过测试,项目在linux环境能够正常工作。但是在windows环境下,如果使用移动端拉流,可能无法播放,转发功能也不能正常工作。目前还不知道原因,大概 是和windows环境有关吧。<br>

其他

需要注意的是,本项目使用的是php的cli模式,和传统的fpm模式有根本的区别。 如果在运行的时候报错,请检查报错信息,多半是缺少php扩展,根据报错信息安装对应扩展,如果使用本项目的docker配置,一般不会报错的。<br> 本项目已经添加了自定义的hls协议,在root\hlsdemo::class,开启hls协议在mediaserver::publisheronframe()方法里面。不过本协议尚有问题。有兴趣的 朋友可以帮忙修正一下。

声明

本项目只用于学习,里面很多资料来源于网络,如有侵权,请联系删除。本项目完全开源,用于相互学习交流,如有问题,欢迎联系我。<br> 如果你觉得项目还将就,请点个星星吧。

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

手把手案例!怎样拿开源的 GPT-2 训练小模型,挑战 GPT-3.5

08-04

一款新奇的操作系统:GodoOS,您的全能办公伙伴!

08-04

Go-Job让你的任务调度不再繁琐

08-04

ETL数据集成丨快速将MySQL数据迁移至Doris数据库

08-04

缓存有大key?你得知道的一些手段

08-04

每日一图--微服务架构v2.0

08-04

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论