RTSP推流将电脑外接摄像头内容传到docker服务器


需求: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.youkuaiyun.com/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的视频输入缓冲区已满或接近满,导致部分帧被丢弃)
在这里插入图片描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/02b6e10a10954cbaa7f014765738d80a.png
在这里插入图片描述

3.在服务器端接收视频推流,验证推流是否成功

~如果要播放rtsp流:ffplay rtsp://<Remote ip>:8554/stream

~如果只是判断是否接收到了rtsp流:ffmpeg -i rtsp://<Remote ip>:8554/stream -f null -

这两种方法都不行的话看最后的解决方法

~也可以在VLC上进行测试(有可视化界面):

在本地安装VLC软件:官方下载:VLC media player,最棒的开源播放器 - VideoLAN

安装就看这篇帖子就行:VLC播放器全指南:下载、安装与功能操作,-优快云博客

测试部分:

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:

  1. VLC的测试方法和上面一样
  2. 如果测试播放rtsp流:ffplay rtsp://127.17.0.24:8554/stream
  3. 如果只是判断是否接收到了rtsp流:ffmpeg -i rtsp://127.17.0.24:8554/stream -f null -
  4. 如果用的是Mobaxterm,但没有弹出任何窗口的话可以看这篇帖子:https://blog.youkuaiyun.com/qq_51308160/article/details/143481559

参考文档:
https://www.cnblogs.com/lhxzz/articles/18332645
https://blog.youkuaiyun.com/ZhangNP_/article/details/133781513
基于ffmpeg 监控摄像头 rtsp视频推流 并以opencv播放
https://blog.youkuaiyun.com/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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值