需求:windows笔记本ssh远程连接服务器,usb摄像头连接在电脑上,想把摄像头拍摄的内容传到服务器以便后续工作。查阅了一些帖子后发现需要进行RTSP推流,服务器端是不能直接打开笔记本摄像头的,所以进行了本文工作。
最后有最新的解决方法!!!
0.查找ip和摄像头名字
1 查找服务器的ip地址:在服务器端ipconfig或者ip addr show得到 < Remote ip >
2 查找本机的ip地址:在CMD中输入ipconfig
3 在本地CMD中:ffmpeg -list_devices true -f dshow -i dummy(可能需要提前在本地安装一下ffmpeg,这篇已经讲得很详细了:https://blog.csdn.net/csdn_yudong/article/details/129182648)
第一个表示的是内置摄像头,第二个连接的USB摄像头 ,因此,设备名称就为“2K USB Camera”。
1.在服务器端打开mediamtx
./mediamtx
1.1在这之前需要安装mediamtx:
1)在Releases · bluenviron/mediamtx · GitHub中选择适合自己的版本
2)解压文件
tar -xvzf mediamtx_v1.11.3_linux_amd64.tar.gz
cd mediamtx_v1.11.3_linux_amd64.tar.gz
3)然后就可以启动mediamtx了./mediamtx
像这样就表示启动成功了
1.2确保8554端口正在被监听
netstat -tuln | grep 8554
ss -tulnp | grep 8554
1.3确保本地端可以连接到服务器的8554端口
telnet <Remote ip> 8554
如果出现了问题可以看本文最后的解决方法。
2.在本机进行视频推流
用ffmpeg将USB摄像头的视频流推送到远程服务器的RTSP地址:
ffmpeg -f dshow -i video="2K USB Camera" -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://<Remote ip>:8554/stream
出现图二这样,并且摄像头灯亮了表示ffmpeg成功捕获了USB摄像头的视频流
(图一是未成功版本警告是说ffmpeg的视频输入缓冲区已满或接近满,导致部分帧被丢弃) :
在本地安装VLC软件:官方下载:VLC media player,最棒的开源播放器 – VideoLAN
安装就看这篇帖子就行:VLC播放器全指南:下载、安装与功能操作,-CSDN博客
测试部分:
a.打开网络串流
b.输入rtsp://:8554/stream
然后就能看到结果啦!
4.我在推流中遇到的问题
能发现服务器端正在监听8554端口,但是本地连接不到8554端口telnet <Remote ip> 8554
ping <Remote ip>也可以ping通。
经过尝试捣鼓发现问题其实是服务器本身没有直接绑定公网IP,需要手动用iptables进行端口转发。一些是我解决该问题的方法:
1.检查服务器是否直接绑定公网IP
在服务器端运行ip a,我这里eth0的IP只有172.17.0.24,并没有直接绑定<Remote ip>,说明<Remote ip>可能是NAT(网络地址转换)设备分配的公网IP,流量进入公网后,需要额外的端口转发规则,才能正确到达服务器的mediamtx进程。
2.修改mediamtx的配置文件,再重新启动mediamtx
找到mediamtx中的配置文件mediamtx.yml,修改rtspAddress
之前meidamtx默认监听的是0.0.0.0:8554,0.0.0.0代表监听的是所有本地IP,不包括127.0.0.1(回环地址)和172.17.0.24(内网地址)。从公网IP过来的流量,NAT不会默认自动转发到内网地址,所以访问时,会被Connection Refused。
3.更改iptables的8554端口转发规则
通过iptables -L -n -v查看服务器规则,发现没有设置NAT端口转发。外部请求<Remote ip>:8554进来后,服务器并不知道要转发给172.17.0.24:8554,所以直接拒绝了连接。
进行如下修改,就可以将<Remote ip>:8554的流量转发到172.17.0.24:8554上了。
sudo iptables -t nat -A PREROUTING -p tcp –dport 8554 -j DNAT –to-destination 172.17.0.24:8554
sudo iptables -t nat -A PREROUTING -p udp –dport 8554 -j DNAT –to-destination 172.17.0.24:8554
sudo iptables -A INPUT -p tcp –dport 8554 -j ACCEPT
sudo iptables -A INPUT -p udp –dport 8554 -j ACCEPT
4.最后再在本地端和服务器端测试telnet <Remote ip>:8554就都能通了!
PS:
参考文档: https://www.cnblogs.com/lhxzz/articles/18332645 https://blog.csdn.net/ZhangNP_/article/details/133781513 基于ffmpeg 监控摄像头 rtsp视频推流 并以opencv播放 https://blog.csdn.net/qq_51308160/article/details/143481559
————————————————————————————————– 上面的方法在我隔了一周之后就不能用了。。。。。。 但其实说到底就是端口映射问题,所以我们只需要找到怎样将本地端口通过ssh端口转发到docker就能解决问题了。
下面是新的解决方法:
1.在CMD中使用ssh连接到远程服务器
这时本地的8554端口流量通过ssh被转发到了服务器的localhost:8554上
ssh -L 8554:localhost:8554 -p 38575 user@remote-server-ip
2.启动mediamtx
同之前1.1的3)启动mediamtx./mediamtx & (如果要退出记得先kill再启动下一次mediamtx pkill mediamtx)
3.在CMD上打开另一个窗口开始推流
ffmpeg -loglevel info -f dshow -i video="2K USB Camera" -rtsp_transport tcp -c:v libx264 -preset ultrafast -tune zerolatency -f rtsp rtsp://localhost:8554/mystream
这时可能会出现这个错误 这时在mediamtx.yml中添加path就可以了
4.在服务器端
ffplay rtsp://localhost:8554/mystream就能播放成功了。
参考连接: https://cloud.tencent.com/developer/article/2311822
评论前必须登录!
注册