GB28181 PS打包纯音频

GB28181音视频这块基本都需要PS,PS的打包和解析非常重要,GB28181文档只给出了打包纯视频或音视频一起打包的的说明,没有给出单独打包纯音频的说明,在实际场景中,特别是语音广播,语音对讲, PS打包纯音频很常见. 有些pts的clock frequency 也不是90000,我遇到过8000的,1000的都有.

GB28181给出的PS打包方式如下:

包头

系统头

PSM

PESV

PESA

但GB28181标准没给出纯音频的PS打包方式,由于没有说明,实现方式多种多样,下面给出一种比较容易解析的实现方式:

包头

系统头

PSM

PESA

包头(pack header),系统头( system header ), PSM, PES详细描述请参考ISO/IEC 13818-1 .

在PS流中,包头,系统头,PSM, PES包前三个字节都是0x00, 0x00, 0x01。pack header(包头)的start code是0x00, 0x00, 0x01, 0xBA; system header (系统头)的start code是0x00, 0x00, 0x01, 0xBA;PSM(Program Stream map )的start code是0x00, 0x00, 0x01, 0xBC; PES packet的start code是0x00, 0x00, 0x01, 八位的流ID(GB28181中规定视频的流ID是0xE0, 音频的流ID是0xC0)。

另外用PS打包纯音频,SDP描述中"m"字段的"media"项:audio.

rtp payload type 还是96.

rtp时钟频率标准是90hHz, 实际环境中也有其他值,比如1kHz.

下面是一个rtp over udp PS传输纯音频SDP例子:


v=0
s=Play
c=IN IP4 192.168.0.173
t=0 0
m=audio 27360 RTP/AVP 96
a=rtpmap:96 PS/90000
a=sendonly

我的代码对外提供的PS解析接口如下:


    // Copyright (C) 1130758427@qq.com
   
    /**
     *设置 RTP Receiver Payload 相关信息
     *
     * @param rtp_receiver_handle, CreateRTPReceiver
     *
     * @param payload_type, 请参考 RFC 3551
     *
     * @param encoding_name, 编码名, 请参考 RFC 3551, 如果payload_type不是动态的, 传null就好
     *
     * @param media_type, 媒体类型, 请参考 RFC 3551, 1 是视频, 2是音频
     *
     * @param clock_rate, 请参考 RFC 3551
     *
     * @return {0} if successful
     */
    public native int SetRTPReceiverPayloadType(long rtp_receiver_handle, int payload_type, String encoding_name, int media_type, int clock_rate);

    /**
     *设置RTP Receiver PS的pts和dts clock frequency
     *
     * @param rtp_receiver_handle, CreateRTPReceiver
     *
     * @param ps_clock_frequency, 默认是90000, 用于一些PS流不是用90000打包的时间戳
     *
     * @return {0} if successful
     */
    public native int SetRTPReceiverPSClockFrequency(long rtp_receiver_handle, int payload_type, int ps_clock_frequency);

    /**
     *清除RTP Receiver PS解析器配置的PSM, PSM具体清参考PS协议
     *
     * @param rtp_receiver_handle, CreateRTPReceiver
     *
     * @return {0} if successful
     */
    public native int ClearRTPReceiverPSMap(long rtp_receiver_handle, int payload_type);

    
    /**
     *设置RTP Receiver PS解析器的PSM, 有些PS流解析时需要设置, PSM具体清参考PS协议
     *
     * @param rtp_receiver_handle, CreateRTPReceiver
     *
     * @param stream_type, 流类型
     *
     * @param elementary_stream_id, 流id
     *
     * @return {0} if successful
     */
    public native int SetRTPReceiverPSMap(long rtp_receiver_handle, int payload_type, int stream_type, int elementary_stream_id);

实际中遇到PS打包纯音频,如果只是求打包成PS,不会太麻烦的按基本规则来就好,解析会比较麻烦了,各种形式都有,解析代码实现上成本高些。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
GB28181是一种视频监控领域常用的协议,其支持拉取RTSP和RTP两种类型的数据流。其中,RTP数据流就是一系列以UDP协议进行传输的视频数据包,其负责视频信息及其时间信息的传输。而PS流作为RTP数据流的一种,其优点在于可以同时传输音频和视频数据,并且在网络不流畅的情况下稳定性更高。 下面是GB28181PS流分析: 1. PS流格式 PS流是一种由包含多个包的MPEG-2传输流构成的流格式,其中每个包的大小为188字节。其包含了一个称为PES(Packetized Elementary Stream)的数据单元,同时还包括了一些元数据信息,例如视频码率、帧率、分辨率等。 2. PS流构成 一个PS流由多个PES包组成,其中每个PES包代表一个时间片段的音频或视频数据。在整个时间切片中,所有的数据包会按照时间顺序进行排列。其中,音频和视频的PES包可以通过PID值进行区分。 3. PS流解析 在解析PS流时,需要先解出MPEG2-TS首部,然后解析TS流中的PMT、PAT表,最后才能解析得到视频和音频数据。其中每个TS包分别由188个字节组成,最后4个字节为CRC校验码。其他字节代表位同步字节和不同PID的封装数据,其中每个PID对应着一种视频或音频的数据流。 综上所述,GB28181PS流分析需要解析MPEG2-TS首部,PMT和PAT表以及PID封装数据来获取音视频数据信息。同时,对于PS流的使用还需要考虑网络环境质量和视频质量问题,以保证视频监控系统的正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值