rtsp - 了解 RTSP 请求的 BNF 表示法
问题描述
根据 RTSP 文档第 21 页https://www.rfc-editor.org/rfc/rfc2326,RTSP 响应为:
Request = Request-Line ; Section 6.1
*( general-header ; Section 5
| request-header ; Section 6.2
| entity-header ) ; Section 8.1
CRLF
[ message-body ] ; Section 4.3
据*
我所知,根据https://www.w3.org/Notation.html, 的意思是“它之后的一个或多个东西”。所以我将上面的事情解释为
*(general-header|request-header|entity-header)CRLF
这将在下面解释此示例,其中标头的类型为general-header \r\n
,如下所示Cseq: 2\r\nContent-Base: rtsp://example.com/media.mp4\r\nContent-Type: application/sdp\r\nContent-Length: 360\r\n
::
S->C: RTSP/1.0 200 OK
CSeq: 2
Content-Base: rtsp://example.com/media.mp4
Content-Type: application/sdp
Content-Length: 460
m=video 0 RTP/AVP 96
a=control:streamid=0
a=range:npt=0-7.741000
a=length:npt=7.741000
a=rtpmap:96 MP4V-ES/5544
a=mimetype:string;"video/MP4V-ES"
a=AvgBitRate:integer;304018
a=StreamName:string;"hinted video track"
m=audio 0 RTP/AVP 97
a=control:streamid=1
a=range:npt=0-7.712000
a=length:npt=7.712000
a=rtpmap:97 mpeg4-generic/32000/2
a=mimetype:string;"audio/mpeg4-generic"
a=AvgBitRate:integer;65790
a=StreamName:string;"hinted audio track"
标题采用格式general-header \r\n
(\r\n
CRLF 在哪里)。但是\r\n
消息正文之前的那条额外的白线(a)呢?这不是通过重复来解释的。
我想我解释错了。
解决方案
这个解释是正确的:
Request = Request-Line *(general-header|request-header|entity-header) CRLF [message-body]
尽管给出的示例是一个响应,但它具有类似的语法:
Response = Status-Line *(general-header|response-header|entity-header) CRLF [message-body]
message-body
在任何一种情况下,标题集都由 CRLF ( ) 与 CRLF ( )分隔,该CRLF ( ) 不再\r\n
重复。在示例中:
RTSP/1.0 200 OK # This is the Status-Line
CSeq: 2 # general-header (see Section 12)
Content-Base: rtsp://example.com/media.mp4 # entity-header (see Section 8.1, 12.11)
Content-Type: application/sdp # entity-header (see Section 8.1, 12.16)
Content-Length: 460 # entity-header (see Section 8.1, 12.14)
# the CRLF marking the end of headers
m=video 0 RTP/AVP 96 # the message body follows
...
“”后面的东西*
是括号块,没有CRLF。每个标头都以 CRLF 结尾,因为消息标头的语法包括了它。请参阅第 4.2 节,它指的是 RFC 2068 的第 4.2 节:
message-header = field-name ":" [ field-value ] CRLF
推荐阅读
- python-3.x - return 在这个函数中做了什么
- node.js - SOCKET.IO IN express whit EC2 AWS 抛出“WebSocket 在连接建立之前已关闭”。
- javascript - 如何“放松”包括 Sequelize 的结果?
- python - 使用不存在的日期扩展数据框
- c# - 没有价值的 XML 序列化
- python - 比较最近点的坐标集
- java - 每 X 分钟运行一次任务的 CRON 日历表达式
- regex - Google 表格中的范围公式
- python - 如何利用 werkzeug.security 的 check_password_hash 函数根据现有的加盐 sha1 密码哈希验证正确的密码
- mysql - 怎么可能知道 MySQL 5.7 上日志文件的大小