首页 > 解决方案 > 了解 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\nCRLF 在哪里)。但是\r\n消息正文之前的那条额外的白线(a)呢?这不是通过重复来解释的。

我想我解释错了。

标签: rtsprfcbnf

解决方案


这个解释是正确的:

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


推荐阅读