H264 RTP FU-A解包

unsigned char *packetBuf; 用来存储解码分片包
unsigned int packetLen; 记录已经存储的长度

每一个RTP包头长度RTP_HEADER_LEN为12,
RTP头后面就是H264数据,
对于RTP里的FU-A分片的H264数据需要重新组包后才能喂给解码器

定义:
unsigned char *data UDP接收数据
unsigned int len 接收UDP数据长度
PACKET_LEN = 1024 * 300
默认RTP的P=0(如果为1则在rtp包末尾减1的非有效荷载即可)

H264数据:

unsigned char *payload = data + RTP_HEADER_LEN;

fu_indicator:FU-A分片包定义头

unsigned char fu_indicator = *payload; 

fu_header: FU-A分片包定义头

unsigned char fu_header = *(payload + 1);

startBit == 1表示分片的起始包

unsigned char startBit = fu_header >> 7;

endBit == 1表示分片的结束包

unsigned char endBit = (fu_header & 0x40) >> 6;

payload_len H264的长度

unsigned int payload_len = len - RTP_HEADER_LEN;

futype: 判断当前接受到包的类型

uint8_t futype = fu_indicator & 0x1f;
:28即表示接收到的FU-A包 拼包只拼此类型的包其他为完整的h264包
:7 sps
:8 pps

nal_fua 用于在拼包时重写H264头 即fu_indicator的前3位和fu_header的后5位

uint8_t nal_fua = (fu_indicator & 0xe0) | (fu_header & 0x1f);

定义每个包的分割头,用于在组包时添加到每个包的包头

 uint8_t header[4] = {0x00, 0x00, 0x00, 0x01};

组包过程

  • PACKET_LEN实例化一块内存的长度,用来存储分片数据
  • block 即将数据传给解码器解码
if (futype == 28) {
        if (endBit == 1) {
            memcpy(packetBuf+packetLen, payload + 2, payload_len - 2);
            packetLen += (payload_len - 2);
            block(packetBuf, packetLen);
            packetLen = 0;
            memset(packetBuf, 0, PACKET_LEN);
        } else if (startBit == 1) {
            memcpy(packetBuf, header, sizeof(header));
            *(packetBuf + sizeof(header)) = nal_fua;
            memcpy(packetBuf + sizeof(header) + 1, payload + 2, payload_len-2);
            packetLen = payload_len - 2 + 4 + 1 ;
        } else {
            if (packetLen > 0) {
                memcpy(packetBuf + packetLen, payload + 2, payload_len - 2);
                packetLen += (payload_len - 2);
            }
        }
    }

单包

  • 比如futype==7 || futype==8
  • 不需组包,直接拼接header
  • PACKET_LEN实例化一块内存的长度,用来存储分片数据
  • block 即将数据传给解码器解码
unsigned int pl = payload_len + sizeof(header);
memcpy(packetBuf, header, sizeof(header));
memcpy(packetBuf + sizeof(header), payload, payload_len);
block(packetBuf, pl);
memset(packetBuf, 0, PACLET_LEN);

解RTP FU-A结束

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容