• GB28181学习(八)——历史视音频的回放


    要求

    • 采用SIP协议实现会话;
    • 采用SIP扩展协议INFO方法的消息体携带视音频回放控制命令;
    • 采用RTP/RTCP实现媒体传输;
    • 媒体回放控制命令引用MANSRTSP协议中的PLAY、PAUSE、TEARDOWN的请求消息和应答消息;
    • 媒体流接收者可为SIP客户端、SIP设备(如视频解码器),媒体流发送者可为SIP设备、网关、媒体服务器;
    • 应符合媒体流保活机制;

    流程

    在这里插入图片描述

    录像回放的流程与实时点播类似,主要区别为INVITE请求时xml格式有差异:

    • 实时点播

    关于实时点播可查看:

    实时点播(信令处理):https://blog.csdn.net/www_dong/article/details/132950064
    实时点播(数据处理):https://blog.csdn.net/www_dong/article/details/133581370

    注意:

    • “t=0 0”中开始时间和结束时间均为0表示实时点播
    • "s=Play“
    static std::string CreateRealStreamSDP(const GB28181MediaContext& mediaContext)
    {
        char str[500] = { 0 };
        pj_ansi_snprintf(str, 500,
                         "v=0\n"
                         "o=%s 0 0 IN IP4 %s\n"
                         "s=Play\n"
                         "c=IN IP4 %s\n"
                         "t=0 0\n"
                         "m=video %d RTP/AVP 96 98 97\n"
                         "a=recvonly\n"
                         "a=rtpmap:96 PS/90000\n"
                         "a=rtpmap:98 H264/90000\n"
                         "a=rtpmap:97 MPEG4/90000\n"
                         "y=001\n",
                         mediaContext.GetDeviceId().c_str(),
                         mediaContext.GetRecvAddress().c_str(),
                         mediaContext.GetRecvAddress().c_str(),
                         mediaContext.GetRecvPort()
                        );
        return str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 录像回放

    注意:

    • “t=%lld %lld”中开始时间和结束时间为点播的开始时间和结束时间
    • “s=Playback”
    static std::string CreatePlayBackSDP(const GB28181MediaContext& mediaContext)
    {
        char str[500] = { 0 };
        pj_ansi_snprintf(str, 500,
                         "v=0\n"
                         "o=%s 0 0 IN IP4 %s\n"
                         "s=Playback\n"
                         "c=IN IP4 %s\n"
                         "t=%lld %lld\n"
                         "m=video %d RTP/AVP 96 98 97\n"
                         "a=recvonly\n"
                         "a=rtpmap:96 PS/90000\n"
                         "a=rtpmap:98 H264/90000\n"
                         "a=rtpmap:97 MPEG4/90000\n"
                         "y=001\n",
                         mediaContext.GetDeviceId().c_str(),
                         mediaContext.GetRecvAddress().c_str(),
                         mediaContext.GetRecvAddress().c_str(),
                         mediaContext.GetPBStartTime(),
                         mediaContext.GetPBEndTime(),
                         mediaContext.GetRecvPort()
                        );
        return str;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    抓包

    在这里插入图片描述

    查看历史文件成功后,选中某一条记录,开始录像回放。

    • 发送INVITE请求(107—>111)
    INVITE sip:xxx@192.168.0.111:5060 SIP/2.0
    Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=xxx
    Max-Forwards: 70
    From: sip:xxx@192.168.0.107;tag=xx
    To: sip:xxx@192.168.0.111
    Contact: <sip:xxx@192.168.0.107:5060>
    Call-ID: xxx
    CSeq: xx INVITE
    Allow: INVITE, ACK, BYE, CANCEL, UPDATE, PRACK  # 支持的方法
    Supported: 100rel
    Subject: xxx:xx,xxx:xx
    Content-Type: application/sdp
    Content-Length:   233
    
    v=0
    o=xxx 0 0 IN IP4 192.168.0.107
    s=Playback                  # 请求方法 
    c=IN IP4 192.168.0.107
    t=1697264152 1697266715     # 请求的开始时间和结束时间
    m=video 36000 RTP/AVP 96 98 97
    a=recvonly
    a=rtpmap:96 PS/90000
    a=rtpmap:98 H264/90000
    a=rtpmap:97 MPEG4/90000
    y=0100000001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 接收INVITE请求响应(111—>107)
    SIP/2.0 100 Trying
    Via: SIP/2.0/UDP 192.168.0.107:5060;rport=5060;branch=xxx
    From: <sip:xxx@192.168.0.107>;tag=xxx
    To: <sip:xxx@192.168.0.111>
    Call-ID: xxx
    CSeq: 26500 INVITE
    User-Agent: IP Camera
    Content-Length: 0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 接收INVITE响应(111—>107)
    # 忽略头信息
    ...
    
    v=0
    o=xxx 1080 1080 IN IP4 192.168.0.111
    s=Playback
    c=IN IP4 192.168.0.111
    t=0 0
    m=video 15060 RTP/AVP 96
    a=sendonly
    a=rtpmap:96 PS/90000   # 为PS流
    a=filesize:0
    y=0100000001
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • INVITE响应返回(107—>111)
    ACK sip:xxx@192.168.0.111:5060 SIP/2.0
    Via: SIP/2.0/UDP 192.168.0.107:5060;rport;branch=xxx
    Max-Forwards: 70
    From: sip:xxx@192.168.0.107;tag=xxx
    To: sip:xxx@192.168.0.111;tag=xx
    Call-ID: xx
    CSeq: 26500 ACK
    Content-Length:  0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 接收数据(111—>107)

    设备端以RTP协议方式发送数据,数据的封装格式为PS。

    在这里插入图片描述

    界面展示

    历史视音频文件查询成功后,选中一条记录,右键选择录像回放,即可弹窗显示录像数据。
    在这里插入图片描述

  • 相关阅读:
    线性表的基本操作
    辉芒微IO单片机FT60F010A-URT
    日期相关整理
    MyBatis-Plus 字段为Null时不更新解决方案,MyBatis-Plus 更新空字段
    计算机毕业论文微信小程序毕业设计SSM校园生活小助手+后台管理系统|前后分离VUE校园网站[包运行成功]
    k8s部署python3项目
    Nginx 平滑升级
    【yocto】
    manacher 算法详细介绍和证明
    短视频被替代的趋势-今抖云创
  • 原文地址:https://blog.csdn.net/www_dong/article/details/133826739