如何为H265 / HEVC对RTP数据中的分段帧(通过UDP进行解包?

问题描述 投票:0回答:1

我正在尝试对原始RTP H265流进行解包并对其进行重构,以便可以由解码器读取。通过识别NAL和FU详细信息,我已经能够从RTP缓冲区中提取单个单元和分段单元。但是,我找不到有关将NAL放在分段单元缓冲区前面的确切细节。

这是我的工作:

  1. 当有效载荷头类型为49时,我知道它是一个分段单元。

  2. 然后寻找第三个字节,其后6个字节为您提供FU类型/ NAL类型,并且前两位指示帧的开始还是结束。这是我用于重构NAL的代码:

if(type == 49){

    unsigned char fu_header = (unsigned char) *(rtpPayloadPos+2);
    unsigned char fu_head_se = (fu_header & 0xC0) >> 6;
    nal_type = fu_header & 0x3F;

    switch(fu_head_se){

    case 0x02:         //nal start
    {
        payloadType = RTP_PAYLOAD_FU_START_H265_NAL;
        *h265DataPos = rtpPlayloadPos-3;
        *(*h265DataPos) = 0x00;
        *((*h265DataPos)+1) = 0x00;
        *((*h265DataPos)+2) = 0x00;
        *((*h265DataPos)+3) = 0x01;
        *((*h265DataPos)+4) = (fu_header << 1);
        *((*h265DataPos)+5) = 0x01;
        h265Len = len - headLen + 3; 
    }
    break;

    case 0x00:     //nal middle
    {
        *h265DataPos = rtpPlayloadPos+2;
        h265Len = len - headLen - 2;
        payloadType = RTP_PAYLOAD_FU_MIDDLE_H265_NAL;
    }
    break;

    case 0x01:     //nal end
    {
        *h265DataPos = rtpPlayloadPos+2;
        h265Len = len - headLen - 2;
        payloadType = RTP_PAYLOAD_FU_END_H265_NAL;
    }
    break;

    default:
        printf("Unknown fu head\n");
        return -1;

}

但是,我不确定重建NAL的方式是否正确。由于解码器抱怨很多,视频几乎是绿色且抖动的。有人可以告诉我如何正确重建FU帧吗?

我一直在参考ITU H265文件和此链接:https://tools.ietf.org/html/draft-ietf-payload-rtp-h265-15

video-streaming rtp hevc video-codecs h.265
1个回答
0
投票
,我已经能够从RTP缓冲区中提取单个单元和分段单元。

RFC规范rfc 7798具有所有详细信息。

简单的步骤:

  1. 删除12个字节的RTP标头。 (无扩展头)
  2. 合并所有数据包,直到找到/接收到最终数据包(rtp标记位)为止,直到来自视频编码帧。
  3. 组合视频帧(来自多个数据包)可用于解码。
© www.soinside.com 2019 - 2024. All rights reserved.