码迷,mamicode.com
首页 > 其他好文 > 详细

手动实现如何从H264流中提取SPS/PPS信息

时间:2019-10-17 15:57:56      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:start   tin   lookup   data   pen   stat   from   代码   col   

1,代码比较简单,可以直接用了。流的第一个NALU一定是SPS

void get_sps_pps_nalu(uint8_t *data, int len, std::vector<uint8_t> &sps, std::vector<uint8_t> &pps)
{
    const uint8_t* pkt_bgn = data;
    const uint8_t* pkt_end = pkt_bgn + len;
    const uint8_t* pbgn = pkt_bgn;
    const uint8_t* pend = pkt_end;
    while (pbgn < pkt_end) {
        pbgn = find_next_nal(pbgn, pkt_end);
        if (pbgn == pkt_end) {
           continue;
        } else {
           while (*pbgn == 0) ++pbgn; //skip all 0x00
           ++pbgn; //skip 0x01
        }
        pend = find_next_nal(pbgn, pkt_end);

        if (((*pbgn) & 0x1F) == 0x07) {    //SPS NAL
            std::cout<<"find sps nal"<<std::endl;
            sps.assign(pbgn, pbgn + static_cast<int>(pend - pbgn));
        }
        if (((*pbgn) & 0x1F) == 0x08) {    //PPS NAL
            std::cout<<"find pps nal"<<std::endl;
            pps.assign(pbgn, pbgn + static_cast<int>(pend - pbgn));
       }
       pbgn = pend;
    }
}
const uint8_t* find_next_nal(const uint8_t* start, const uint8_t* end)
{
   const uint8_t *p = start;
   /* Simply lookup "0x000001" or "0x00000001" pattern */
   while (p <= end - 3) {
      if (p[0] == 0x00) {
         if (p[1] == 0x00) {
            if ((p[2] == 0x01) || (p[2] == 0x00 && p[3] == 0x01)) {
               return p;
            } else {
               p += 3;
            }
         } else {
            p += 2;
         }
      } else {
         ++p;
      }
   }
   return end;
}
int main()
    H264FramefromCam(data, &len);
    get_sps_pps_nalu((uint8_t *)data, len, pps, sps);
    return 0;
}

手动实现如何从H264流中提取SPS/PPS信息

标签:start   tin   lookup   data   pen   stat   from   代码   col   

原文地址:https://www.cnblogs.com/rayfloyd/p/11692231.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!