一. 推拉流测试的前置nginx、ffmpeg、ffplay准备工作
查看端口状态
启动nginx后:即./nginx后,先ps -ef|grep nginx 来判断是否启动成功:nginx在运行中,有进程号
在使用云服务的地址,用浏览器去访问时,如果出现错误,可以去查看80端口是否开启
firewall-cmd --query-port=80/tcp
firewall-cmd --zone=public --add-port=80/tcp --permanent
重启下 firewall -cmd --reload
查看监听的1935端口是否打开,看到这个表示已经打开
找到nginx和ffmpeg的位置:
检查ffmpeg:
找到ffplay的位置
启动ffplay开始拉流,有数据过来就会播放:
/usr/local/ffmpeg/bin/ffplay rtmp://localhost/live/room
启动ffmpeg开始推数据到nginx
/usr/local/ffmpeg/bin/ffmpeg -re -i "/root/文档/test.mp4"
-c copy -f flv rtmp://localhost/live/room
推流失败,搜索可能的解决办法:
- 关闭防火墙:先查看防火墙状态firewall-cmd --state,如果running就关闭:systemctl mask firewalld,永久关闭:systemctl mask firewalld
- 访问nginx服务器,如果报错403 Forbidden,则编辑nginx配置文件,配置user root;然后执行nginx -s reload
查看防火墙状态
二. 推拉流知识点
1. nginx反向代理、负载均衡
(1)先在后台打开要运行的项目,可以查看当客户端要访问服务器项目时的日志;
(2)配好nginx之后,在配置文件中修改:
- 监听80端口,那么nginx就会来接浏览器http协议的请求;
- 在location中配置反向代理服务器proxy_pass用来代理kuangstudy的运行项目;
- 再在上面配置upstream kuangstudy的负载均衡,分别指向已经打开了两个服务器,不同监听端口号,并附上负载均衡的权重
(3)在nginx的命令行中重载配置文件,即nginx -s reload,保存好
(4)在浏览器中不断访问localhost的80端口,查看到后台运行的访问日志,轮询访问会被负载均衡按照权重来分别导入到不同的服务器上
2. RTMP推拉流测试简单示例
(1) ffmpeg本地视频推流测试
ffmpeg -re -i .\推流文件.mp4 -vcodec libx264 -acodec aac -f flv
rtmp://127.0.0.1:1935/live/test
启动ffmpeg开始推数据到nginx
/usr/local/ffmpeg/bin/ffmpeg(启动ffmpeg) -re -i "/root/文档/test.mp4"(被推视频的存放位置) -c copy -f flv rtmp://localhost/live/room(推流去往的具体位置)
(2) 使用ffplay拉流测试
ffplay rtmp://127.0.0.1:1935/live/test
启动ffplay开始拉流,有数据过来就会播放
/usr/local/ffmpeg/bin/ffplay(启动ffplay) rtmp://localhost/live/room(之前推流到这儿后,nginx从这里开始拉流)
(3) 使用VLC拉流
打开VLC,媒体 -> 打开网络串流 -> 网络
rtmp://127.0.0.1:1935/live/test
三. 本地推拉流测试实操&不同问题和解决
ffmpeg -re -i test.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/live/home
重新配置nginx后打开,显示端口被占用
查看是因为之前在配置conf文件的时候,80端口被占用
根据网上搜索到的建议,对http监听协议修改成8080
重新配置并链接配置文件nginx.conf
再次打开就没问题了
再次做推流测试:
出现以下问题:
搜索解决方法一:
修改:
仍然有问题:
搜索解决方法二:
修改:
出现新的报错:
解决不了问题可能是参数设置存在问题
换个编码采样方式,添加参数-ar 44100:
如果取消循环播放,可以一次推流成功:
关于broken pipe的猜想:
原因可能是:这个错误是底层socket传递给ffmpeg的,它是一个管道错误,意思是在管道两端,当一端不停的写,另一边却断开接收。那么就会出现broken pipe
关于Past duration 0.668327 too large:
是由于帧率的原因,由高帧率转低帧率就会报错
-r:定义输入图像序列的帧率,原视频是29.97fps,所以翻了三倍,就是89.91
我的是30 翻个3倍写90
之后就没出现黄色的Past duration ×× too large这样的报错
关于循环播放坚持不了太久就管道坏了,延长时间的命令:
ffmpeg -re -stream_loop -1 -i "/root/code/test/video/123test.mp4" -ar 44100 -s 420*360 -r 50 -f avi rtmp://10.200.102.201:1935/live
(s:分辨率调整一下;r:帧速调整大一些)