我正在尝试对原始 RTP H265 流进行解包并重建它,以便解码器可以读取它。
我已经能够通过识别 NAL 和 FU 详细信息从 RTP 缓冲区中提取单个和碎片单元。但是,我无法找到有关处理放置在碎片单元缓冲区前面的 NAL 的精确细节。
这是我所做的:
-
当有效负载头类型为49时,我知道它是一个碎片单元。
-
然后,我查找第三个字节,其尾随 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 https://datatracker.ietf.org/doc/html/draft-ietf-payload-rtp-h265-15.
RFC 规范rfc 7798 https://www.rfc-editor.org/rfc/rfc7798有这一切的细节。
简单的步骤如下:
- 删除 12 字节 RTP 标头和 3 字节 FU 标头。
- 组合所有 FU 数据包,直到从视频编码帧找到/接收到结束数据包。
- 组合所有数据包(如果多个数据包形成一个帧)以形成视频帧,可以将其馈送到解码器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)