预览网络摄像头的画面时,经常出现雪花屏的问题。原因是网络摄像头默认使用RTSP协议,RTSP下层默认使用UDP传输,而UDP传输是不可靠的,会丢包,所以导致雪花屏。
问题解决网络摄像头支持RTSP使用TCP或者UDP传输,使用TCP还是UDP取决于客户端的SETUP请求。SETUP请求中的Transport是TCP就使用TCP传输,Transport是UDP就使用UDP传输。
TCP提供可靠的传输,所以决定将网络摄像头传输协议由UDP改为TCP。使用ffmpeg采集网络摄像头的视频流存为mp4,默认UDP传输,以海康摄像头为例,命令行如下:
使用TCP传输:
ffmpeg -i -f rtsp -rtsp_transport tcp rtsp://admin:123456@192.168.2.4:554/h264/ch33/main/av_stream mycamera.mp4如果使用代码采集视频,则需加上以下代码:
AVDictionary *ifmtdict; av_dict_set(&ifmtdict, "rtsp_transport", "tcp", 0); ... avformat_open_input (..., &ifmtdict);命令行和代码原理上是一样的。我试验过,两种方式都可行。抓包验证,如图所示: