#rtsp #streaming #protocols #networking #multimedia #parser-serializer

rtsp-types

RTSP (RFC 7826) 类型,解析器和序列化器

9个版本

0.1.2 2024年6月13日
0.1.1 2024年2月14日
0.1.0 2023年6月30日
0.0.5 2023年2月2日
0.0.0 2019年6月30日

#158网络编程

Download history 1823/week @ 2024-04-28 1496/week @ 2024-05-05 2001/week @ 2024-05-12 2071/week @ 2024-05-19 2213/week @ 2024-05-26 1332/week @ 2024-06-02 1506/week @ 2024-06-09 1882/week @ 2024-06-16 1527/week @ 2024-06-23 1567/week @ 2024-06-30 1457/week @ 2024-07-07 1445/week @ 2024-07-14 1512/week @ 2024-07-21 1281/week @ 2024-07-28 1278/week @ 2024-08-04 1755/week @ 2024-08-11

5,916 每月下载量
用于 5 个Crate(3个直接使用)

MIT 许可证

260KB
6.5K SLoC

rtsp-types crates.io Actions状态 docs.rs

用于处理RTSP(RFC 7826)消息的Crate,包括解析器和序列化器以及支持解析和生成常用头部。

请参阅文档以获取详细信息。

许可证

rtsp-types遵循MIT许可证(LICENSEhttp://opensource.org/licenses/MIT)。

贡献

欢迎以pull request的形式提供任何类型的贡献。

除非你明确说明,否则你提交给rtsp-types的任何有意贡献都应按照上述MIT许可证进行许可,不附加任何额外条款或条件。


lib.rs:

用于处理RTSP(RFC 7826)消息的Crate,包括解析器和序列化器以及支持解析和生成常用头部。

创建一个OPTIONS请求

let request = rtsp_types::Request::builder(
        rtsp_types::Method::Options,
        rtsp_types::Version::V2_0
    )
    .header(rtsp_types::headers::CSEQ, "1")
    .empty();

此请求包含一个空体。

创建一个带有请求体的SET_PARAMETER请求

let request = rtsp_types::Request::builder(
        rtsp_types::Method::SetParameter,
        rtsp_types::Version::V2_0
    )
    .request_uri(rtsp_types::Url::parse("rtsp://example.com/test").expect("Invalid URI"))
    .header(rtsp_types::headers::CSEQ, "2")
    .header(rtsp_types::headers::CONTENT_TYPE, "text/parameters")
    .build(Vec::from(&b"barparam: barstuff"[..]));

体传递给build()函数,并在请求头中自动插入一个Content-Length头。

创建一个OK响应

let response = rtsp_types::Response::builder(
        rtsp_types::Version::V2_0,
        rtsp_types::StatusCode::Ok,
    )
    .header(rtsp_types::headers::CSEQ, "1")
    .empty();

此响应包含一个空体。可以通过与请求相同的方式添加非空体。

创建数据消息

let data = rtsp_types::Data::new(0, vec![0, 1, 2, 3, 4]);

这将为通道ID 0创建一个新的数据消息,其中包含给定的 Vec<u8>

解析RTSP消息

let data = b"OPTIONS * RTSP/2.0\r\n\
             CSeq: 1\r\n\
             Supported: play.basic, play.scale\r\n\
             User-Agent: PhonyClient/1.2\r\n\
             \r\n";

let (message, consumed): (rtsp_types::Message<Vec<u8>>, _) =
    rtsp_types::Message::parse(data).expect("Failed to parse data");

assert_eq!(consumed, data.len());
match message {
    rtsp_types::Message::Request(ref request) => {
        assert_eq!(request.method(), rtsp_types::Method::Options);
    },
    _ => unreachable!(),
}

可以从任何 AsRef<[u8]> 解析消息,并将其解析为任何实现了 From<&[u8]> 的借用或所有权的主体类型。

有关解析的更多详细信息,请参阅 Message::parse

序列化RTSP消息

let request = rtsp_types::Request::builder(
        rtsp_types::Method::SetParameter,
        rtsp_types::Version::V2_0
    )
    .request_uri(rtsp_types::Url::parse("rtsp://example.com/test").expect("Invalid URI"))
    .header(rtsp_types::headers::CSEQ, "2")
    .header(rtsp_types::headers::CONTENT_TYPE, "text/parameters")
    .build(Vec::from(&b"barparam: barstuff"[..]));

 let mut data = Vec::new();
 request.write(&mut data).expect("Failed to serialize request");

 assert_eq!(
    data,
    b"SET_PARAMETER rtsp://example.com/test RTSP/2.0\r\n\
      Content-Length: 18\r\n\
      Content-Type: text/parameters\r\n\
      CSeq: 2\r\n\
      \r\n\
      barparam: barstuff",
 );

序列化可以针对任何实现了 std::io::Write 的类型进行。

有关序列化的更多详细信息,请参阅 Message::write

依赖关系

~2.5MB
~68K SLoC