您当前的位置: 首页 > 

qianbo_insist

暂无认证

  • 0浏览

    0关注

    399博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

RTP 发送 和接收 h265

qianbo_insist 发布时间:2022-07-28 23:08:02 ,浏览量:0

h265 发送RTP

首先RTP头部不变,其次,h265 头部为三字节,假定最大传输单元MTU为1400字节,并且包含头部12字节

/*F type
layerId TID
SE futype
*/
void send_rtp_h265(uint8_t *buf, int len, int last_packet_of_frame, uint32_t ts)
{
	//RTPMuxContext *rtp_ctx = ctx->priv_data;
	int rtp_payload_size = 1400 - 12;
	int nal_type = (buf[0] >> 1) & 0x3F;

	/* send it as one single NAL unit? */
	if (len max_payload_size) {
            flush_buffered(s1, 0);
            buffered_size = 0;
        }
        // If we aren't using mode 0, and the NAL unit fits including the
        // framing (2 bytes length, plus 1/2 bytes for the STAP-A/AP marker),
        // write the unit to the buffer as a STAP-A/AP packet, otherwise flush
        // and send as single NAL.
        if (buffered_size + 2 + header_size + size max_payload_size &&
            !skip_aggregate) {
            if (buffered_size == 0) { //发送第一个数据包
                if (codec == AV_CODEC_ID_H264) {
                    *s->buf_ptr++ = 24;
                } else {
                    *s->buf_ptr++ = 48 buf_ptr, size);
            s->buf_ptr += 2; //数据包长度(两个字节表示)
            memcpy(s->buf_ptr, buf, size);
            s->buf_ptr += size;
            s->buffered_nals++;
        } else {
            flush_buffered(s1, 0);
            ff_rtp_send_data(s1, buf, size, last);
        }
    } else {
        int flag_byte, header_size;
        flush_buffered(s1, 0);
        if (codec == AV_CODEC_ID_H264 && (s->flags & FF_RTP_FLAG_H264_MODE0)) {
            av_log(s1, AV_LOG_ERROR,
                   "NAL size %d > %d, try -slice-max-size %d\n", size,
                   s->max_payload_size, s->max_payload_size);
            return;
        }
        av_log(s1, AV_LOG_DEBUG, "NAL size %d > %d\n", size, s->max_payload_size);
        if (codec == AV_CODEC_ID_H264) {    //视频类型为H264
            uint8_t type = buf[0] & 0x1F;
            uint8_t nri = buf[0] & 0x60;

            s->buf[0] = 28;        /* FU Indicator; Type = 28 ---> FU-A */
            s->buf[0] |= nri;
            s->buf[1] = type;
            s->buf[1] |= 1  1) & 0x3F;  // For hevc 
            /*
             * create the HEVC payload header and transmit the buffer as fragmentation units (FU)
             *
             *    0                   1
             *    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
             *   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
             *   |F|   Type    |  LayerId  | TID |
             *   +-------------+-----------------+
             *
             *      F       = 0
             *      Type    = 49 (fragmentation unit (FU))
             *      LayerId = 0
             *      TID     = 1
             */
            s->buf[0] = 49 buf[2]  = nal_type; //该字节才表示真正意义上的数据类型
            /* set the S bit: mark as start fragment */
            s->buf[2] |= 1 max_payload_size) {
      //中间数据包分片
            memcpy(&s->buf[header_size], buf, s->max_payload_size - header_size);
            ff_rtp_send_data(s1, s->buf, s->max_payload_size, 0);
            buf  += s->max_payload_size - header_size;
            size -= s->max_payload_size - header_size;
            s->buf[flag_byte] &= ~(1             
关注
打赏
1663161521
查看更多评论
0.0404s