手动实现如何从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;
}

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

时间: 2024-09-28 22:09:14

手动实现如何从H264流中提取SPS/PPS信息的相关文章

c++之从标准流中提取文本数据

istream & istream :: get ( char * ,  int ,  char = '\n' ) ; istream & istream :: getline ( char * ,  int ,  char = '\n' ) ; 作用:从文本中提取指定个数的字符,并在串数组末添加一个空字符 其中,第一个参数指向接受字符数据的字符数组 第二个参数指定字符数组最多可容纳的字符个数 第三个参数用于指定一个终止符,缺省为换行符 操作遇到终止符或提取到规定个数字符时,提取终止 区别

python常用模块email----从原始邮件中提取邮件头信息

email.parser.Parser()的parsestr()和parse()方法都可以用来从原始邮件文件中提取邮件头信息.这两个方法的区别就parsestr处理的是字符串对象,parse处理的是文件对象.   让我们通过两个例子来了解这两个方法的使用.先来看一封邮件的原始信息的一部分: cat /tmp/email_test1.txt date: Wed, 16 Nov 2016 16:04:44 +0800 From: 3456789 <[email protected]> To: 12

(原)关于获取ffmpeg解析rtsp流sdp中带有sps,pps的情况

 转载请注明出处:http://www.cnblogs.com/lihaiping/p/6612511.html 今天同事准备在android下使用ffmpeg来获取rtsp流,问我如何获取获取sps和pps的情况?因为尽管使用ffmpeg做项目还算熟悉,但用ffmpeg作rtsp client我还真没用过,虽然知道ffmpeg支持rtsp,但一般rtsp client我还是选择自己实现.使用ffmpeg做rtsp client的在这种情况下,如果rtsp的pps,sps在sdp中带有的话,我们

H264中的SPS、PPS提取与作用

牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set 

H264中的SPS、PPS提取与作用&lt;转&gt;

牛逼的视频会议网站:http://wmnmtm.blog.163.com/blog/#m=0 ++++++++++++++++++++++++++++++++++++++++++++++++++++ http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTP传输H264的时候,需要用到sdp协议描述,其中有两项:Sequence Parameter Sets (SPS) 和Picture Parameter Set 

h264 流、帧结构

H264元素的分层结构 H.264编码器输出的Bit流中,每个Bit都隶属于某个句法元素.句法元素被组织成有层次的结构,分别描述各个层次的信息. 在H.264 中,句法元素共被组织成  序列.图像.片.宏块.子宏块五个层次.在这样的结构中,每一层的头部和它的数据部分形成管理与被管理的强依赖关系,头部的句法元素是该层数据的核心,而一旦头部丢失,数据部分的信息几乎不可能再被正确解码出来,尤其在序列层及图像层. 在 H.264 中,分层结构最大的不同是取消了序列层和图像层,并将原本属于序列和图像头部的

[转]【流媒體】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

[流媒體]H264—MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph Apr 1st 2012  Email:[email protected].com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的第12部分: ISO 基本媒体文件格式/Information technology Coding of a

流编辑器sed使用总结及利用sed从文本中提取字符串的方法

sed 是一个编辑器,但它与其它大多数编辑器不同.除了不面向屏幕之外,它还是非交互式的,我们常用的vim编辑器则是交互式的. 这意味着必须将要对数据执行的命令插入到命令行或要处 理的脚本中.sed 在一个文件(或文件集)中非交互式.并且不加询问地接收一系列的命令并执行它们.因而,它流经文本就如同水流经溪流一样,因而 sed 恰当地代表了流编辑器,可以对文件或者文件集批量的进行删除 替换 插入 追加等操作. 流编辑器非常适合于执行重复的编辑,这种重复编辑如果由人工完成将花费大量的时间. 其参数可能

H264码流中SPS PPS详解&lt;转&gt;

转载地址:https://zhuanlan.zhihu.com/p/27896239 1 SPS和PPS从何处而来? 2 SPS和PPS中的每个参数起什么作用? 3 如何解析SDP中包含的H.264的SPS和PPS串? 1 客户端抓包 在做客户端视频解码时,一般都会使用Wireshark抓包工具对接收的H264码流进行分析,如下所示: 在这里我们可以看到对解码视频起关键作用的SPS和PPS. 双击SPS内容如下: 双击PPS内容如下: 那么从上面的sps中我们知道图像的宽,高. 宽=(19+1