参加电子设计大赛,设计包含了一个简单的监控系统。使用的网络摄像头开发板是类似树莓派的嵌入式开发板,摄像头的输出是 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,如果想要支持其他语言的话可能就要自己移植了……
希望有这方面经验的老司机能够带我一把,新手求轻喷。
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.