我们公司开发了一个摄像头监控软件,我们主要使用 RTSP 与设备进行通信(但我们支持所需的任何协议),我们开发了自己的 RTSP 客户端和解析器
今天我们正在研究一个新相机的集成,我们发现了一个有趣的场景,相机将动态有效负载 96 映射到音频和视频数据包,请参阅 SDP 描述:
RTSP/1.0 200 OK
CSeq: 2
Date: Sat, Jan 01 2000 19:39:38 GMT
Content-Base: rtsp://10.1.39.174:8557/PSIA/Streaming/channels/2?videoCodecType=H.264/
Content-Type: application/sdp
Content-Length: 830
v=0
o=- 946754247689123 1 IN IP4 10.1.39.174
s=RTSP/RTP stream from IPNC
i=2?videoCodecType=H.264
t=0 0
a=tool:LIVE555 Streaming Media v2010.07.29
a=type:broadcast
a=control:*
a=range:npt=0-
a=x-qt-text-nam:RTSP/RTP stream from IPNC
a=x-qt-text-inf:2?videoCodecType=H.264
m=video 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:4000
a=rtpmap:96 H264/90000
a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter- sets=Z2QAKK2EBUViuKxUdCAqKxXFYqOhAVFYrisVHQgKisVxWKjoQFRWK4rFR0ICorFcVio6ECSFITk8nyfk/k/J8nm5s00IEkKQnJ5Pk/J/J+T5PNzZprQCgC3YCqQAAAMABAAAAwJZgQAB6EgAAiVQve+F4RCNQAAAAAE=,aO48sA==
a=control:track1
m=audio 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:128
a=rtpmap:96 PCMU/16000
a=control:track2
m=application 0 RTP/AVP 96
c=IN IP4 0.0.0.0
b=AS:64
a=rtpmap:96 vnd.onvif.metadata/90000
a=control:track3
如你看到的:
m=video 0 RTP/AVP 96
m=audio 0 RTP/AVP 96
问题是我们使用这个映射来识别接收到的 RTP 数据包的压缩。我一直认为每种媒体都会有不同的映射,比如视频 96 和音频 97(甚至静态映射,比如 PCMU 的 0),但是这个设备对所有媒体使用相同的映射,所以,我们的解析器不会工作,因为它将使用有效负载 96 接收的音频数据包识别为视频数据包,并将它们直接发送到视频解码器,当然它不会工作......
我已经检查过 VLC 工作正常,但我坚信 VLC 不使用此映射来拆分数据包,而是使用通道标识(在 TCP 中)或不同的 UDP 端口来识别哪些数据包属于哪个媒体......但是我们已经构建了我们的架构来根据负载类型拆分数据包
所以我问......将音频和视频都映射到相同的动态有效载荷编号(96)是否正确?
这是我第一次遇到这个问题,我需要知道我们是否必须更改整个 RTSP 客户端以使用通道而不是 Payload 格式来识别媒体,或者相机端是否存在实现错误他们应该将其他有效载荷编号链接到每个不同的媒体(96 个视频、97 个音频、98 个应用程序......)
有谁知道这种做法(对所有媒体使用相同的有效载荷编号)是否有效???
我们已经使用 RFC 规范实现了 RTSP 客户端和 SDP 解析器,但我没有发现任何与对所有媒体使用相同有效载荷编号相关的内容,在所有示例中,它们总是为每个媒体分配不同的有效载荷编号......