参加电子设计大赛,设计包含了一个简单的监控系统。使用的网络摄像头开发板是类似树莓派的嵌入式开发板,摄像头的输出是 RTSP 流。
已经有的思路:
通过一个公网有固定 IP 地址的服务器作为中转,服务器通过 SSH 反向代理摄像头的指定端口号,然后其他查看设备通过连接外网服务器来与摄像头直接通信。不过经过试验以后,每当查看设备连接指定端口后, SSH 端总是提示 Connect failed 。
使用的命令:
ssh -R 554:remote_addr:554 user@remote_addr
我认为可能的原因之一是由于 SSH 反向代理只能代理 TCP 流量,而 RTSP 协议在传输流媒体的过程中用了 UDP ,所以可能在查看设备与摄像头握手之后无法继续传递其他数据。当然这只是我的猜测……
个人认为最靠谱的一个方案:通过 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
使用 DDNS 服务,例如花生壳,代理指定端口。但是缺点很明显:支持 NAT 的 DDNS 服务没找到有开源的,找到的支持 NAT 的基本不开源……对于一个嵌入式的摄像头开发板来说,花生壳这里软件过大而且可能不兼容。另外 RTSP 同时使用 TCP 与 UDP ,不清楚这类软件是否能同时代理。
最后是尝试自己实现 RTSP 协议,目前还没有尝试,不知道有哪些坑等着我……
PS:片上可用的语言有C、C++、Node,如果想要支持其他语言的话可能就要自己移植了……
希望有这方面经验的老司机能够带我一把,新手求轻喷。
1
computerfan 2016-04-28 09:56:05 +08:00 1
打电话向电信要公网 IP
|
2
joe1213 2016-04-28 09:59:59 +08:00
@computerfan 请问现在的 3G 、 4G 运营商是否都给公网 IP 呢?或者哪家会给分配公网 IP 。
|
3
computerfan 2016-04-28 10:01:18 +08:00
@joe1213 数据流量应该是都不给了……
|
4
joe1213 2016-04-28 10:04:57 +08:00
3G 的网络摄像机,如何在外网访问呢?如果是直接用的大华这样的厂商的, P2P 服务器报价上 10 万了,有没有办法用他们的摄像机,但是用一些开源的 P2P 服务器软件?有哪些开源软件推荐?
|
5
jedyu 2016-04-28 10:05:08 +08:00 1
STUN
|
6
zrp1994 OP @computerfan 额,关键是到时参加比赛的时候应该是要把作品带到现场的,那里的网络环境未知……
|
8
joe1213 2016-04-28 10:07:57 +08:00 1
不在前端另配 PC ,或嵌入式设备。而是直接用网络摄像机本身的嵌入式系统做 P2P ,客户端的 SDK 是有的,但没有服务器端。大华也没有文档说明他们的 P2P 通信协议过程
|
9
zrp1994 OP @joe1213 之所以不考虑另外连接 PC 是因为这部分定位就是一个简单的监控,最好就是开箱即用的那种……如果真的必要的话也可以考虑外接 PC 处理通信。
|
10
sen506 2016-04-28 11:09:53 +08:00 1
[Zerotier]( https://www.zerotier.com/)
没人推荐下这个啊? |
11
jacy 2016-04-28 11:49:48 +08:00 1
vpn...
|
12
fzinfz 2016-04-28 12:03:33 +08:00 via iPad 1
|
14
zrp1994 OP @jacy 如果是 VPN 的话,假设我用 Android 客户端访问摄像头,也需要我的手机连接到 VPN ,一方面的话需要请求系统权限,对于用户也不是很友好,另外如果要支持多设备的话,不知道这种方式吃不吃得消……
|
15
wohenyingyu01 2016-04-28 12:38:16 +08:00 via iPhone 1
在公网建立 sip 服务器,两边客户端都注册上, rtsp 交给 sip 就行
|
16
xmoiduts 2016-04-28 12:40:35 +08:00 via Android 1
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 打开网络串流。 |
17
dalaomj 2016-04-28 13:19:42 +08:00 1
这让我想起个问题。以前以灰鸽子为首的反弹连接木马,监控 NAT 内肉鸡屏幕和摄像头是如何传输的?
|
19
zwh8800 2016-04-28 15:08:47 +08:00
中转的话服务器压力可能有点大。你可以试试 udp 打洞。搜搜关键字 STUN udp 隧道。
我这里写过一篇介绍性的文章 https://hzzz.lengzzz.com/blog/755/ |
21
sec 2016-04-28 15:39:57 +08:00 via Android
对 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 解决 |