【问题标题】:How to depacketize the fragmented frames in RTP data (over UDP) for H265/HEVC?如何为 H265/HEVC 解包 RTP 数据(通过 UDP)中的碎片帧?
【发布时间】:2019-12-12 19:58:04
【问题描述】:

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

这是我的工作:

  1. 当payload header类型为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://datatracker.ietf.org/doc/html/draft-ietf-payload-rtp-h265-15.

【问题讨论】:

    标签: video-streaming rtp hevc video-codecs h.265


    【解决方案1】:

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

    简单的步骤:

    1. 去掉12字节的RTP头和3字节的FU头。
    2. 组合所有 FU 数据包,直到找到/接收到来自视频编码帧的结束数据包。
    3. 将所有数据包(如果多个数据包形成一个帧)组合成视频帧,可以将其馈送到解码器。

    【讨论】:

    • 感谢您的意见。我已经过了那个阶段。我已经合并了所有的 FU 数据包并将它们写入一个 H265 文件。但是当我在 ffplay 上查看这个文件时,它会说:“cu_qp_delta -57 超出了有效范围”。这看起来像是对 PPS 参数中 QP 范围的引用。但是,如果我使用 ffplay 直接从流中保存文件并将我的文件与使用 ffplay 录制的文件进行比较,它们的 VPS、SPS 和 PPS 看起来相同。但由于某种原因,我的视频无法使用相同的 ffplay 正常播放。这让我觉得我没有正确处理 FU 信息。
    • 确保您的编码器输出和解码器输入转储是相同的。您可以将它们转储到文件并进行二进制比较 - 验证相同。
    • 我解决了这个问题。问题是,在分段单元的中间和最终切片中,我应该删除前三个字节,然后附加它们。但是,我删除了前 2 个字节,然后添加了它们。这很奇怪,因为 ffplay 一直在抱怨 cu_qp_delta 这让我偏离了轨道。感谢@mail2subhajit 的帮助
    猜你喜欢
    • 2017-07-19
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多