求助,处于 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 条回复
computerfan
2016-04-28 09:56:05 +08:00
打电话向电信要公网 IP
joe1213
2016-04-28 09:59:59 +08:00
@computerfan 请问现在的 3G 、 4G 运营商是否都给公网 IP 呢?或者哪家会给分配公网 IP 。
computerfan
2016-04-28 10:01:18 +08:00
@joe1213 数据流量应该是都不给了……
joe1213
2016-04-28 10:04:57 +08:00
3G 的网络摄像机,如何在外网访问呢?如果是直接用的大华这样的厂商的, P2P 服务器报价上 10 万了,有没有办法用他们的摄像机,但是用一些开源的 P2P 服务器软件?有哪些开源软件推荐?
jedyu
2016-04-28 10:05:08 +08:00
STUN
zrp1994
2016-04-28 10:05:56 +08:00
@computerfan 额,关键是到时参加比赛的时候应该是要把作品带到现场的,那里的网络环境未知……
zrp1994
2016-04-28 10:07:05 +08:00
@jedyu 新技能 GET ,我去研究下
joe1213
2016-04-28 10:07:57 +08:00
不在前端另配 PC ,或嵌入式设备。而是直接用网络摄像机本身的嵌入式系统做 P2P ,客户端的 SDK 是有的,但没有服务器端。大华也没有文档说明他们的 P2P 通信协议过程
zrp1994
2016-04-28 10:15:55 +08:00
@joe1213 之所以不考虑另外连接 PC 是因为这部分定位就是一个简单的监控,最好就是开箱即用的那种……如果真的必要的话也可以考虑外接 PC 处理通信。
sen506
2016-04-28 11:09:53 +08:00
[Zerotier]( https://www.zerotier.com/)
没人推荐下这个啊?
jacy
2016-04-28 11:49:48 +08:00
vpn...
fzinfz
2016-04-28 12:03:33 +08:00
zrp1994
2016-04-28 12:04:19 +08:00
@sen506
@fzinfz
感谢,我研究下
zrp1994
2016-04-28 12:06:27 +08:00
@jacy 如果是 VPN 的话,假设我用 Android 客户端访问摄像头,也需要我的手机连接到 VPN ,一方面的话需要请求系统权限,对于用户也不是很友好,另外如果要支持多设备的话,不知道这种方式吃不吃得消……
wohenyingyu01
2016-04-28 12:38:16 +08:00
在公网建立 sip 服务器,两边客户端都注册上, rtsp 交给 sip 就行
xmoiduts
2016-04-28 12:40:35 +08:00
ffserver feed 配置不对吧?我也遇到过同样的问题,改 feed 参数--格式还是尺寸来着, flv , 160*120 。
这货太费 cpu 了, -c copy 也没用。延迟 25 秒😂。

如果需要勉强能用的话,输出裸流,管道到 cvlc , http 发送,延迟小一点。 3 秒左右。

我在树莓派上的命令:
raspivid -o - -t 0 -w 1280 -h 720 -b 1000000 |cvlc -vvv stream:///dev/stdin --sout '#standard{access=http,mux=ts,dst=:8090}' :demux=h264 // 在 8090 端口开启直播
电脑端用 vlc 打开网络串流。
dalaomj
2016-04-28 13:19:42 +08:00
这让我想起个问题。以前以灰鸽子为首的反弹连接木马,监控 NAT 内肉鸡屏幕和摄像头是如何传输的?
zrp1994
2016-04-28 14:10:08 +08:00
@dalaomj 真相了😱
zwh8800
2016-04-28 15:08:47 +08:00
中转的话服务器压力可能有点大。你可以试试 udp 打洞。搜搜关键字 STUN udp 隧道。
我这里写过一篇介绍性的文章 https://hzzz.lengzzz.com/blog/755/
Bryan0Z
2016-04-28 15:09:56 +08:00
@zrp1994 用的花生壳,初中的时候玩的

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

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

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

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

© 2021 V2EX