zoukankan      html  css  js  c++  java
  • 从H264码流中获取视频宽高 (SPS帧) 升级篇

    之前写过 《从H264码流中获取视频宽高 (SPS帧)》 。 

    但发现很多局限性,而且有时解出来是错误的. 

    所以重新去研究了. 用了 官方提供的代码库来解析.

    花了点时间,从代码库里单独把解析SPS的代码提取出来,写成函数.

    《最权威的从H264码流中,解析出最全的SPS信息. 包括宽高等》 

    欢迎大家下载,指导查看.

    使用说明:

    使用说明:
    1. 在使用的CPP中包含ProcessSPS.h
    2. 参考使用代码
    DataPartition *dp = AllocPartition(1);
    seq_parameter_set_rbsp_t *sps = AllocSPS();
    memcpy (dp->bitstream->streamBuffer, &pData[5], nDataLen - 5);

    //pData 是以 0x00 0x00 0x00 0x01 0x67 开头的数据,跳过这五个字节 nDataLen 是这个数据的长度
    dp->bitstream->code_len = dp->bitstream->bitstream_length = RBSPtoSODB (dp->bitstream->streamBuffer, nDataLen - 5);
    dp->bitstream->ei_flag = 0;
    dp->bitstream->read_len = dp->bitstream->frame_bitoffset = 0;
    InterpretSPS(dp,sps);
    FreePartition (dp, 1);
    FreeSPS (sps);
    3. 在Free之前. 把需要的信息从sps中取出

    例如: 取出宽和高
    int nWidth = (sps->pic_width_in_mbs_minus1 + 1) * 16;
    int nHeight = (sps->pic_height_in_map_units_minus1) * 16;
    但以上是针对宽高是16的整数倍的情况,当不是16整数倍时,frame_cropping_flag值为1,frame_mbs_only_flag为1,公式如下:
    (也可以认为统一使用下面的公式)
    int nWidth = ((sps->pic_width_in_mbs_minus1 +1)*16) - sps->frame_crop_left_offset*2 - sps->frame_crop_right_offset*2;
    int nHeight = ((2 - sps->frame_mbs_only_flag)* (sps->pic_height_in_map_units_minus1 +1) * 16) -
    (sps->frame_crop_top_offset * 2) - (sps->frame_crop_bottom_offset * 2);

    seq_parameter_set_rbsp_t 结构体包含所有SPS的信息.

  • 相关阅读:
    5 粘包现象与解决方案
    4 Socket代码实例
    协程与多路io复用epool关系
    基于selector的socket并发
    基于select类型多路IO复用,实现简单socket并发
    协程实现多并发socket,跟NGINX一样
    利用协程实现简单爬虫
    协程
    进程池pool
    进程锁 Lock
  • 原文地址:https://www.cnblogs.com/SamRichard/p/6121937.html
Copyright © 2011-2022 走看看