H.264视频码流解析


原理

H.264原始码流(又称为“裸流”)是由一个一个的NALU组成的。他们的结构如下图所示。


其中每个NALU之间通过startcode(起始码)进行分隔,起始码分成两种:0x000001(3Byte)或者0x00000001(4Byte)。如果NALU对应的Slice为一帧的开始就用0x00000001,否则就用0x000001。

H.264码流解析的步骤就是首先从码流中搜索0x000001和0x00000001,分离出NALU;然后再分析NALU的各个字段。本文的程序即实现了上述的两个步骤。


代码

整个程序位于simplest_h264_parser()函数中,如下所示。

  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. #include <string.h>  
  4.   
  5. typedef enum {  
  6.     NALU_TYPE_SLICE    = 1,  
  7.     NALU_TYPE_DPA      = 2,  
  8.     NALU_TYPE_DPB      = 3,  
  9.     NALU_TYPE_DPC      = 4,  
  10.     NALU_TYPE_IDR      = 5,  
  11.     NALU_TYPE_SEI      = 6,  
  12.     NALU_TYPE_SPS      = 7,  
  13.     NALU_TYPE_PPS      = 8,  
  14.     NALU_TYPE_AUD      = 9,  
  15.     NALU_TYPE_EOSEQ    = 10,  
  16.     NALU_TYPE_EOSTREAM = 11,  
  17.     NALU_TYPE_FILL     = 12,  
  18. } NaluType;  
  19.   
  20. typedef enum {  
  21.     NALU_PRIORITY_DISPOSABLE = 0,  
  22.     NALU_PRIRITY_LOW         = 1,  
  23.     NALU_PRIORITY_HIGH       = 2,  
  24.     NALU_PRIORITY_HIGHEST    = 3  
  25. } NaluPriority;  
  26.   
  27.   
  28. typedef struct  
  29. {  
  30.     int startcodeprefix_len;      //! 4 for parameter sets and first slice in picture, 3 for everything else (suggested)  
  31.     unsigned len;                 //! Length of the NAL unit (Excluding the start code, which does not belong to the NALU)  
  32.     unsigned max_size;            //! Nal Unit Buffer size  
  33.     int forbidden_bit;            //! should be always FALSE  
  34.     int nal_reference_idc;        //! NALU_PRIORITY_xxxx  
  35.     int nal_unit_type;            //! NALU_TYPE_xxxx      
  36.     char *buf;                    //! contains the first byte followed by the EBSP  
  37. } NALU_t;  
  38.   
  39. FILE *h264bitstream = NULL;                //!< the bit stream file  
  40.   
  41. int info2=0, info3=0;  
  42.   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值