IP 摄像机的质量参差不齐,根据我的经验,有些表现不规律。处理他们的 RTSP 流需要一定的容错能力。
这似乎是 CCTV 行业低端行业对标准的快速和松散的副产品,RTSP和 ONVIF是最常被滥用的两个。幸运的是,您通常可以解决这些问题。除非您的 IP 摄像机和控制器都设计为可以很好地协同工作,否则只能使用 ONVIF 进行一次性发现和设置管理。
FFMPEG 在 RTSP 设置中不是很宽容
经过努力,我开始比较和之间的 RTSP/ SETUP消息。默认情况下已经输出了很多详细的诊断信息。openRTSP
ffmpeg
openRTSP
开放式RTSP
openRTSP
发送命令OPTIONS
,DESCRIBE
然后SETUP
. 设置消息是:
Sending request: SETUP rtsp://192.168.0.103:554/onvif1/track2 RTSP/1.0
CSeq: 6
Authorization: Digest username="admin", realm="HIipCamera", nonce="ddd21dbd0620b6fb4b1f9bcbb06340a0", uri="rtsp://192.168.0.103:554/onvif1", response="91d9c611aa004eeb1390b3fbb9373648"
User-Agent: ./openRTSP (LIVE555 Streaming Media v2021.02.11)
Transport: RTP/AVP/TCP;unicast;interleaved=2-3
Session: 3a4d2e6d
相机回应:
Received a complete SETUP response:
RTSP/1.0 200 OK
CSeq: 6
Transport: RTP/AVP;unicast;destination=192.168.0.100;source=192.168.0.103;interleaved=2-3
Session: 3a4d2e6d;timeout=60
FFMPEG
因为FFMPEG
您必须使用-v 9 and -loglevel 99
参数才能查看 RTSP 消息。它只发送了一个DESCRIBE
请求是:
DESCRIBE rtsp://192.168.0.103:554/onvif1 RTSP/1.0
Accept: application/sdp
CSeq: 2
User-Agent: Lavf58.67.100
相机回应:
Transport: RTP/AVP;unicast;destination=192.168.0.100;source=192.168.0.103;interleaved=0-1
Session: 37287775;timeout=60
RTSP 滥用和 FFMPEG hacking-解决方案
比较消息很明显,相机可以使用 RTSP/AVP/TCP 交错 TCP 连接。但是我们可以通过摄像头的回答看到,在“传输:”行中, “RTP/AVP”之后没有包含“TCP” ,因为它是请求的。喜欢:
Transport: RTP/AVP/('TCP' missing here);....
我分析了代码,发现ffmpeg/libavformat/rtsp.c
了以下直观的调用顺序:ff_rtsp_connect
、ff_rtsp_make_setup_request
、ff_rtsp_send_cmd
和。在最后一个里面我找到了下面的代码:ff_rtsp_read_reply
ff_rtsp_parse_line
rtsp_parse_transport
if (!av_strcasecmp(lower_transport, "TCP"))
th->lower_transport = RTSP_LOWER_TRANSPORT_TCP;
else
th->lower_transport = RTSP_LOWER_TRANSPORT_UDP;
lower_transport
'RTP/AVP;'
在我的情况下解析的文本是""
空字符字符串,因为相机服务器不包含它。
我插入|| !av_strcasecmp(lower_transport, "")
了代码。使它假设传输是RTSP_LOWER_TRANSPORT_TCP
何时lower_transport
被省略的。像下面这样:
if (!av_strcasecmp(lower_transport, "TCP") || !av_strcasecmp(lower_transport, ""))
th->lower_transport = RTSP_LOWER_TRANSPORT_TCP;
else
th->lower_transport = RTSP_LOWER_TRANSPORT_UDP;
ffmpeg 的这个小补丁 (git) 可在此处获得。git am < RTSP_lower_transport_TCP.patch
在 ffmpeg git repo 上应用。
重新编译后:FFMPEG 运行良好!
我破解了 FFMPEG,使其能够容忍相机服务器正在执行的 RTSP 滥用。由于我的 FFMPEG 版本只能在我未使用的 android 电视(作为 cctv/nvr 摄像机服务器)上运行,因此不会产生任何其他问题。
更好的解决方案是 FFMPEG ( Ticket ),还要考虑rtsp 服务器答案上缺少较低传输的情况。然后与客户端发送的请求进行比较,以定义是否省略了较低的传输。并尝试与之建立联系。
建议
如果您到达这里,您的网络摄像机可能会遭受一些 RTSP 滥用。我建议您先尝试使用openRTSP
,看看它是否能够连接。如果是这样,则尝试调试其 RTSP/设置消息。如果您修改(自担风险)ffmpeg/libavformat/rtsp.c
代码,则可能存在一些自定义或黑客解决方案。或者你可能/应该使用 live555 库、VLC 或 mplayer。