zoukankan      html  css  js  c++  java
  • 手动实现如何从H264流中提取SPS/PPS信息

    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;
    }
  • 相关阅读:
    把ssl模块加入到已经编译好的apache中实现HTTPS
    六,集合
    一. 计算机语言基础知识:
    三, 字符串
    四,列表的使用方法
    hash()函数的用法
    五,字典用法总结
    十,编码
    七八九,条件和循环语句
    二.Python的基础语法知识
  • 原文地址:https://www.cnblogs.com/rayfloyd/p/11692231.html
Copyright © 2011-2022 走看看