云计算百科
云计算领域专业知识百科平台

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.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的视频输入缓冲区已满或接近满,导致部分帧被丢弃) 在这里插入图片描述 ![在这里插入图片描述](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播放器全指南:下载、安装与功能操作,-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:

  • VLC的测试方法和上面一样
  • 如果测试播放rtsp流:ffplay rtsp://127.17.0.24:8554/stream
  • 如果只是判断是否接收到了rtsp流:ffmpeg -i rtsp://127.17.0.24:8554/stream -f null –
  • 如果用的是Mobaxterm,但没有弹出任何窗口的话可以看这篇帖子:https://blog.csdn.net/qq_51308160/article/details/143481559
  • 参考文档: 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

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » RTSP推流将电脑外接摄像头内容传到docker服务器
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!