树莓派mjpg-streamer+内网穿透

一.背景

我相信很多小伙伴和我一样,对物联网很感兴趣,就算你的专业、工作不是物联网方向。本科期间我就很想做个物联网宿舍(本人的本科学校不怎么样,但是我爱它),玩的都是单片机,画画PCB,玩玩安卓开发。实现远程控制、物联网总是会卡在很多地方,不了了之。写这篇博客也是想给那些和我一样经历的小伙伴们一些思路、帮助、动手搞起来~

二.你需要的材料

1.树莓派
2.USB摄像头
没了,内网穿透、域名均免费。
我所使用的摄像头是在淘宝上购买的一款USB摄像头,当然你也可以用树莓派的摄像头,价格都不是很贵。至于视频的传输方案,我试了两种,一种是motion、一种是本文采用的方案,就是mjpg-streamer,对比了两种方案,motion的效果比mjpg-streamer差很多,一开始我就用motion的方案,因为它的操作相对简单,但显示的视频非常卡,之后我就使用了mjpg-streamer这种方案,之后,在手机上实现远程视频监控,有点卡顿。内网穿透软件是免费的,人家的通道流量有限制,这是限制的一个很重要的原因。在局域网内,访问对应端口时,视频还是挺流畅的。本文使用的内网穿透工具,域名均是免费的,其中像申请域名,备案什么的就非常的麻烦。所以,根据本文,就可以很快的应用到你的项目中了。
可能大家会觉得用树莓派做这个不是特别划算,实际上,可以选择其他linux系统的开发板如荔枝派、香橙派,树莓派一代,要确保它可以上网,我使用的是树莓派3B+,因为实验室有两块3B+没人使用,我就拿来玩玩了,它上面也有WiFi模块,可以直接连接到你所在的局域网中。

三.视频传送

使用mjpg-streamer可以实现远程监控,mjpg-streamer的优点是图像清晰延迟小。
下面,假设你已经有树莓派,而且已经装好系统了,也有一个摄像头,且摄像头也测试成功(可以看这篇文章)。你应该在你的树莓派终端上进行下面的操作。按着上面这篇博客就可以实现在你的本机地址的8080端口下显示你的视频。确认是否已经成功的步骤是:直接在网站上输入127.0.0.1:8080(127.0.0.1是本机的ip地址:8080就是对应的8080端口),mjpg-streamer是将USB摄像头所采集到的视频放到本机的8080端口。操作成功就会显示下面的界面:
如图则说明已经可以将视频放到端口上了

四.内网穿透

内网穿透是个老生常谈的话题了,那这里如果不内网穿透会怎么样呢,那就只能在内网(局域网中,比如你公司、学校用的网络就是一个局域网),到了里其实你已经可以进行假的远程视频监控了,这要你在这个局域网内,比如你手机连接的是学校宿舍wifi,你的摄像头放在实验室,你也可以通过手机查看视频了,具体操作是:1.先在你的树莓派的终端中输入指令:ifconfig。这个时候会弹出很多信息,因为我的树莓派用的是无线连接wifi来上网的,所以我就看wlan:后面的地址多少就行比如我的是192.168.2.108,如果你是用网线的话,你看net:后面的地址是多少就行,然后就可以在你的手机浏览器下输入192.168.2.108.8080,就可以实现假的远程监控,而且视频还很流畅的。
说了这么多,很多小伙伴还是比较实现真的远程监控,毕竟还是想着在学校装一个摄像头,你在你老家的时候可以通过手机看看实验室的情况啊,宿舍的情况啊。
那么先用最简单易懂的图让小伙伴们知道什么是内网穿透原理:
网络图
上图是一个网络图,在你家的附近就有这样的一个网络,最终会连接到国际互联网,同样的道理,在学校也有这样的一个网络。最终这些局域网都会连接到国际互联网中。比如我们访问一些网站,就得知道它的域名。域名dns解析后就可以和网站空间对应起来(网站空间就是放网站内容的)。内网穿透就是把内网的地址穿透到外网,这样,就可以实现远程的数据读取,和远程视频监控了。
说了那么多废话,那应该怎么实现内网穿透呢?????
首先,内网穿透软件做的事是将你内网的某个端口映射到某个与国际互联网相连的服务器的地址上,一般得用前购买对应服务器的使用权,再在你的电脑上安装上他们的软件,就会将你本机某个端口与服务器的地址上建立起一个稳定的联系。这里我推荐的是Sakurafrp这个软件,它是免费的。下面就说一下具体步骤:
1.在这里插入图片描述
先注册一个用户、账号。密码账号都要记着,不要忘了。登录之后就会进入下面这个界面。
在这里插入图片描述
域名的话,你要自己有一个,但是,域名买是不难,但是备案是很麻烦的,一个月才能备案下来,期间手续也很麻烦,不用怕,后面我也是发现了一个免费二级域名的网站。那我们还是有必要先跳到
在这里插入图片描述
同样先注册一个用户,之后按着如下图操作步骤:
在这里插入图片描述
在这里插入图片描述
这里的地址线路可以根据下图选择(线路可以根据你的需要更改,每一次更改,域名解析就应该修改):
在这里插入图片描述
骚操作之后要看一下,你的解析是否可以用了(百度DNS:把自己的域名放进去检测,如果解析成功了就会显示解析信息,还没成功的话就再等等。。。):
在这里插入图片描述
2.经过上面的骚操作你就的域名就解析成功了,接着要操作的是在仪表盘、映射列表下,进入映射列表,管理隧道
在这里插入图片描述
这里的本机地址填127.0.0.1,本地端口填8080,绑定域名就用上你自己解析了的域名,添加。在这里插入图片描述
添加之后点击配置文件接着按着里面步骤修改:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你还需要安装这款软件,就是客户端,也可以直接在“软件下载”下下载对应的客户端如下图。
在这里插入图片描述
下载后并解压如下:
在这里插入图片描述
启动,按着自己之前选择的线路填写。
在这里插入图片描述
最终如图,则表示,穿透成功了~
在这里插入图片描述
之后,就实现的整个远程监控的功能。最好还要开启自启动,内网穿透、还有mjpg_streamer自启,不然远程断电了之后就麻烦了~这部分也实现了,不过写了这么多有些累了就不介绍了 ~

五.应用及效果

在手机浏览器,显示如下:
在这里插入图片描述
在这里插入图片描述
后续将会写一篇yolov3的应用实操、以及原理介绍。

<think>好的,我需要帮助用户解决他们使用MJPG-streamer和FRP内网穿透后公网帧数只有10帧的问题,而内网访问能达到30帧。首先,我应该回顾用户之前的对话,了解他们之前的问题和提供的建议。 用户之前询问了FRP内网穿透后的最高帧数,我详细解释了影响因素,包括硬件、编码、网络带宽和FRP配置,并给出了优化建议。现在用户的具体情况是使用MJPG-streamer推流,通过FRP穿透后公网帧数只有10帧,而内网正常是30帧。这说明问题可能出在FRP配置或网络带宽上,尤其是上行带宽不足、FRP传输效率低,或者是MJPG-streamer本身的配置问题。 首先,我应该分析可能的原因。内网30帧正常,说明摄像头和MJPG-streamer的配置没问题,问题可能出在FRP穿透后的网络传输上。可能的原因包括: 1. **上行带宽不足**:用户的上行带宽可能不足以支持MJPG-streamer的高码率,导致帧数下降。 2. **FRP配置不当**:比如使用TCP协议而不是UDP(KCP),没有启用压缩,或者FRP服务器的带宽限制。 3. **MJPG-streamer的编码效率**:MJPG使用MJPEG编码,相比H.264可能码率更高,占用更多带宽。 4. **网络延迟和丢包**:公网传输中的延迟或丢包导致客户端请求帧率降低。 5. **服务器性能问题**:FRP服务器或中转服务器的处理能力不足,导致转发速度慢。 接下来,我需要针对这些可能的原因,给出具体的检查和优化步骤。例如,建议用户检查上行带宽,使用KCP协议,调整MJPG-streamer的码率和分辨率,或者改用更高效的编码方式如H.264。同时,可能需要监控网络流量,查看带宽使用情况,调整FRP的压缩设置,以及测试不同的服务器配置。 还要考虑用户的技术水平,提供易于理解的步骤,比如使用命令行工具检查带宽,修改配置文件的具体示例,以及如何测试不同参数的影响。此外,可能需要比较MJPEG和H.264的优劣,建议用户如果可能的话切换编码方式,或者调整MJPG-streamer的参数来降低码率。 最后,总结问题,分步骤给出解决方案,确保用户能够逐步排查问题,找到瓶颈所在,并实施有效的优化措施。</think>你描述的 **公网帧率骤降(内网30fps → 公网10fps)** 是典型的内网穿透带宽或编码效率问题。以下是具体原因分析和优化方案: --- ### **一、核心问题定位** #### 1. **MJPG-streamer的编码特性** - **MJPEG编码**:MJPG-streamer默认使用 `MJPEG` 格式(逐帧JPEG压缩),**码率远高于H.264**。例如: - 720p@30fps的MJPEG流码率可能高达 **8~12Mbps**,而H.264仅需 **2~4Mbps**。 - **高带宽需求**:公网穿透时,若上行带宽不足,FRP会触发流控降帧,导致帧率暴跌。 #### 2. **FRP传输瓶颈** - **TCP协议延迟**:FRP默认使用TCP,其拥塞控制机制会限制突发流量(如视频关键帧),加剧卡顿。 - **未启用压缩**:MJPEG本身无压缩优化,若FRP未启用数据压缩,带宽占用翻倍。 #### 3. **网络性能验证** 使用以下命令测试实际可用带宽: ```bash # 从内网推流端到FRP服务器测速(需安装iperf3) iperf3 -c FRP服务器IP -p 5201 -R # -R表示测试上行带宽 ``` - 若测速结果低于MJPEG流码率(如 <10Mbps),公网帧率必然受限。 --- ### **二、优化方案:提升公网帧率** #### 1. **降低MJPEG码率(快速生效)** 修改MJPG-streamer启动参数,强制降低分辨率和帧率: ```bash mjpg_streamer -i "input_uvc.so -r 640x360 -f 15" \ -o "output_http.so -p 8080" ``` - `-r 640x360`:分辨率降至360p,减少单帧数据量。 - `-f 15`:限制帧率为15fps,缓解带宽压力。 - **效果**:码率可从12Mbps降至 **2~3Mbps**,公网帧率可能恢复至10~15fps。 #### 2. **启用FRP压缩与KCP协议** 修改 `frpc.ini` 配置,提升传输效率: ```ini [common] server_addr = FRP服务器IP protocol = kcp # 改用UDP协议,降低延迟 use_compression = true # 启用压缩(对MJPEG效果有限,但仍有帮助) [web] type = tcp local_port = 8080 remote_port = 8080 ``` - **KCP模式**:需确保FRP服务端已启用KCP支持(启动命令加 `-kcp_bind_port=UDP端口`)。 #### 3. **切换为H.264编码(终极方案)** **弃用MJPG-streamer,改用低码率H.264推流**(需摄像头支持H.264输出): ```bash # 安装FFmpeg并推流(示例:树莓派CSI摄像头) ffmpeg -f v4l2 -input_format h264 -video_size 1280x720 -framerate 30 -i /dev/video0 \ -c:v copy -f flv "rtmp://FRP服务器IP:1935/live/stream" ``` - **优势**:相同画质下,H.264码率仅为MJPEG的 **1/4~1/3**,公网帧率可稳定30fps。 --- ### **三、关键指标验证** 1. **MJPEG与H.264码率对比** | 编码格式 | 分辨率+帧率 | 典型码率 | 公网穿透适应性 | |----------|-------------|------------|----------------| | MJPEG | 720p@30fps | 8~12Mbps | 差(高带宽需求)| | H.264 | 720p@30fps | 2~4Mbps | 优(低带宽需求)| 2. **网络带宽需求计算** - 若上行带宽为 **5Mbps**: - MJPEG 720p@30fps:`8Mbps > 5Mbps` → 帧率被迫降至 `(5/8)*30 ≈ 18fps`。 - H.264 720p@30fps:`3Mbps < 5Mbps` → 帧率可保持30fps。 --- ### **四、故障排查命令** 1. **实时监控FRP带宽占用** ```bash # 在FRP服务器执行(需安装nload) nload -u M # 查看实时流量,确认是否达到带宽上限 ``` 2. **检查摄像头原始输出能力** ```bash v4l2-ctl --list-formats-ext # 查看支持的编码格式和分辨率/帧率 ``` --- ### **五、总结建议** - **短期方案**:降低MJPEG分辨率为 **640x360@15fps**,并启用FRP的KCP+压缩。 - **长期方案**:**切换为H.264编码**,可彻底解决带宽瓶颈,公网帧率恢复至30fps。 - **硬件升级**:若摄像头不支持H.264,建议更换为USB H.264摄像头(如海康威视DS-E11)。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值