求助,处于 NAT 内网的网络摄像头,如何在外网进行访问?

2016-04-28 09:45:11 +08:00
 zrp1994

参加电子设计大赛,设计包含了一个简单的监控系统。使用的网络摄像头开发板是类似树莓派的嵌入式开发板,摄像头的输出是 RTSP 流。

已经有的思路:

  1. 通过一个公网有固定 IP 地址的服务器作为中转,服务器通过 SSH 反向代理摄像头的指定端口号,然后其他查看设备通过连接外网服务器来与摄像头直接通信。不过经过试验以后,每当查看设备连接指定端口后, SSH 端总是提示 Connect failed 。

    使用的命令:

    ssh -R 554:remote_addr:554 user@remote_addr
    

    我认为可能的原因之一是由于 SSH 反向代理只能代理 TCP 流量,而 RTSP 协议在传输流媒体的过程中用了 UDP ,所以可能在查看设备与摄像头握手之后无法继续传递其他数据。当然这只是我的猜测……

  2. 个人认为最靠谱的一个方案:通过 ffmpeg 与 ffserver 配合,在本地用 ffmpeg 将 RTSP 流发送到远程的 ffserver 上,然后其他的设备访问 ffserver 就可以了。然而测试之后, ffmpeg 总是卡在了:

    Could not write header for output file #0 (incorrect codec parameters ?): Invalid data found when processing input
    

    使用的命令是:

    ffmpeg -i rtsp://rtsp_stream_addr -f rtsp -c copy http://127.0.0.1:8090/feed1.ffm
    
  3. 使用 DDNS 服务,例如花生壳,代理指定端口。但是缺点很明显:支持 NAT 的 DDNS 服务没找到有开源的,找到的支持 NAT 的基本不开源……对于一个嵌入式的摄像头开发板来说,花生壳这里软件过大而且可能不兼容。另外 RTSP 同时使用 TCP 与 UDP ,不清楚这类软件是否能同时代理。

  4. 最后是尝试自己实现 RTSP 协议,目前还没有尝试,不知道有哪些坑等着我……

PS:片上可用的语言有C、C++、Node,如果想要支持其他语言的话可能就要自己移植了……

希望有这方面经验的老司机能够带我一把,新手求轻喷。

11363 次点击
所在节点    问与答
21 条回复
sec
2016-04-28 15:39:57 +08:00
对 rtsp 协议不了解,但最近在玩与第一个思路类似的情况,两台多层 nat 后的 windows 主机如何进行远程桌面通讯,中介机 centos6 , iptables INPUT 链 accept 对应端口,默认 drop , forward 链空,默认 accept , windows 下用 plink 建立 ssh 隧道,如果把一台 windows 的特定端口映射至中介机,中介机本身能够通过(localhost:端口)的形式访问,但另一台 windows 尝试通过(中介机 IP:端口)是连接不上的,提示连接被拒绝,关闭 iptables 无果,后来发现中介机的 ipv4 转发未开启,遂开启之,仍然是连接被拒绝,又看了下不同的教程,在另一台 windows 下将中介机的特定端口映射至本地后,再通过(localhost:端口)成功连接

@dalaomj 灰鸽子是被控端主动建立连接到控制端,控制端的地址和端口写入了被控端可执行文件中,后来好像也支持通过一个可访问的 ip.txt 更新控制端 ip 和端口,控制端必须是可以直连的地址,动态 IP 用 DDNS 解决

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/274987

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX