问题现象: 视频出现大量花屏,无法观看
- 日志中出现大量的丢包输出
- 排查ZLMediaKit 的解决方案
https://github.com/ZLMediaKit/ZLMediaKit/issues/1221
已尝试的方案
- try1 服务器调优
增加服务器的缓存接收大小, 减少UDP的丢包,尝试无效
1.下面的代码添加到/etc/sysctl.conf的末尾,然后保存
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_default = 8388608
net.core.wmem_max = 16777216
2.运行sysctl -p使设置生效
3.再次查看缓存大小
cat /proc/sys/net/core/rmem_max
- try2 程序调优
修改ZLMediaKit源码,调整RtpReceiver.h 接收大小调整,无效
cd ZLMediakits
mkdir build
cd build
cmake .. -DENABLE_WEBRTC=true -DOPENSSL_ROOT_DIR=/usr/local/openssl -DOPENSSL_LIBRARIES=/usr/local/openssl/lib
cmake --build . --target MediaServer
修改文件截图
继续搜索视频花屏问题的答案 ,只剩下源头调整 和FFMPEG 调整2个方案
预览网络摄像头的画面时,经常出现雪花屏的问题。原因是网络摄像头默认使用RTSP协议,RTSP下层默认使用UDP传输,而UDP传输是不可靠的,会丢包,所以导致雪花屏。
- Ans1: ( 从源头修改)
网络摄像头支持RTSP使用TCP或者UDP传输,使用TCP还是UDP取决于客户端的SETUP请求。SETUP请求中的Transport是TCP就使用TCP传输,Transport是UDP就使用UDP传输。
TCP提供可靠的传输,可以将网络摄像头传输协议由UDP改为TCP - Ans2: (从FFMPEG源码修改)
UDP 缓冲区大小不足会导致多个高分辨率视频流的流中断 ,需要重建 ffmpeg/libav 更改 udp.c 源文件中的 UDP_MAX_PKT_SIZE.
方案1: 因为我们是上级平台,无法从源头修改
try3 FFMPEG调优
调整UDP接收的缓存大小
1.修改文件: /ffmpeg-4.1/libavformat/udp.c
修改文件截图
2.重新编译ffmpeg
cd ffmpeg-4.1
sudo ./configure --prefix=/usr/local/ffmpeg
sudo make & make install
export PATH=/usr/local/ffmpeg/bin:${PATH}