PS:在项目中运用到了硬件编码卡编H264 数据,由于解码需要sps和pps才能解除帧,那么就需要提取sps 和pps。

在使用x264 编码中 可以直接通过帧类型获取到。但是使用硬件编码则需要自己运算,下直接上代码。

软件编码x264 为例:

void encodeData(int8_t *data) {
//    long long int start =printtime();//编码pthread_mutex_lock(&mutex);memcpy(pic_in->img.plane[0], data, ySize);for (int i = 0; i < uvSize; ++i) {//间隔1个字节取一个数据//u数据*(pic_in->img.plane[1] + i) = *(data + ySize + i * 2 + 1);//v数据*(pic_in->img.plane[2] + i) = *(data + ySize + i * 2);}//编码出的数据x264_nal_t *pp_nal;//编码除了几个naluint pi_nal;x264_picture_t pic_out;//编码int ret = x264_encoder_encode(videoCodec, &pp_nal, &pi_nal, pic_in, &pic_out);if (ret < 0) {pthread_mutex_unlock(&mutex);return;}
//    long long int curr=printtime();
//    LOGI("--------------->使用编码时长:%lld",(curr-start));LOGI("--------------->编出的帧数:%d,编码的类型 %d", pi_nal);int sps_len, pps_len;uint8_t sps[100];uint8_t pps[100];for (int i = 0; i < pi_nal; ++i) {//数据类型if (pp_nal[i].i_type == NAL_SPS) {
//            LOGI("--------------->编出的帧数 NAL_SPS");//去掉00 00 00 01sps_len = pp_nal[i].i_payload - 4;memcpy(sps, pp_nal[i].p_payload + 4, sps_len);} else if(pp_nal[i].i_type == NAL_PPS){
//            LOGI("--------------->编出的帧数 NAL_PPS");pps_len = pp_nal[i].i_payload - 4;memcpy(pps, pp_nal[i].p_payload + 4, pps_len);sendSpsPps(sps, pps, sps_len, pps_len);}else {//类型5是关键帧 , 编码后的data 数据   ,长度sendFrame(pp_nal[i].i_type, pp_nal[i].p_payload, pp_nal[i].i_payload);}}pthread_mutex_unlock(&mutex);}

其中 pi_nal 为帧的个数,一般都是编一次出一个。

其中硬件编码:

void encodeData(int8_t *data) {lib_encode_inbuf_update(avc_en_t, reinterpret_cast<uint8_t *>(data), 0, 0, g_width, g_height,1);sem_wait_read(avc_en_t);
//   dump 出h264 数据 么问题
//    LOGI(" ------------>%p ,and ecvode lngth:%d ", data, avc_en_t->outlength);
//
//        int tmpFd = open("/sdcard/test.h264", O_WRONLY | O_APPEND);
//        if ( tmpFd < 0 ) {
//            LOGI("Creat AF dump file failed!");
//        } else {
//            write(tmpFd, avc_en_t->out_buf_enc ,  avc_en_t->outlength);
//            close(tmpFd);
//       }if (is_idr(avc_en_t->out_buf_enc)) {unsigned int sps_size, pps_size, sei_size;int nal_type = (avc_en_t->out_buf_enc)[4] & 0x1F;sps_size = h264_decode_get_frame_size(reinterpret_cast<char *>(avc_en_t->out_buf_enc),avc_en_t->outlength);//printf("sps_size = %d!\n",sps_size);pps_size = h264_decode_get_frame_size(reinterpret_cast<char *>(avc_en_t->out_buf_enc + sps_size),avc_en_t->outlength - sps_size);sendSpsPps(avc_en_t->out_buf_enc, avc_en_t->out_buf_enc + sps_size, sps_size, pps_size);//printf("pps_size = %d!\n",pps_size);sei_size = h264_decode_get_frame_size(reinterpret_cast<char *>(avc_en_t->out_buf_enc + sps_size + pps_size),avc_en_t->outlength - sps_size - pps_size);//printf("sei_size = %d!\n",sei_size);sendFrame(nal_type, avc_en_t->out_buf_enc + sps_size + pps_size + sei_size,avc_en_t->outlength - sps_size - pps_size - sei_size);} else {int nal_type = (avc_en_t->out_buf_enc)[4] & 0x1F;sendFrame(nal_type, avc_en_t->out_buf_enc, avc_en_t->outlength);LOGE("发送关键帧了");file->Write_file("success\n", "/keyframe.txt");}sem_post_read(avc_en_t);//Can't be omitted}/***
*** 此方法可以判断帧的类型
**/
int is_idr(uint8_t *encode_card_out) {int nal_type = (encode_card_out)[4] & 0x1F;if (nal_type != 5 && nal_type != 7 && nal_type != 8 && nal_type != 2) {return 0;}return 1;
}unsigned int h264_decode_get_frame_size(char *stream_buff, unsigned int len) {unsigned int i, sendlenth;unsigned int bFindStart = 0, bFindEnd = 0;unsigned int s32UsedBytes = 0;unsigned int s32ReadLen = 0;char *pu8Buf = stream_buff;for (i = 0; i < len / 2 - 4; i++) {//int tmp = pu8Buf[i+3] & 0x1F;if (pu8Buf[i] == 0 && pu8Buf[i + 1] == 0 && pu8Buf[i + 2] == 1) {bFindStart = 1;i += 4;break;}}for (; i < len / 2 - 4; i++) {//int tmp = pu8Buf[i+3] & 0x1F;if (pu8Buf[i] == 0 && pu8Buf[i + 1] == 0 && pu8Buf[i + 2] == 1) {bFindEnd = 1;break;}}if (i > 0)s32ReadLen = i - 1;if (bFindStart == 0) {//printf("SAMPLE_TEST: can not find start code!s32ReadLen %d, s32UsedBytes %d. \n", s32ReadLen, s32UsedBytes);} else if (bFindEnd == 0) {s32ReadLen = i + 8;}return s32ReadLen;}

H264 数据提取sps 和 pps 信息相关推荐

  1. 从MP4头信息中提取sps和pps数据

    转自:https://blog.csdn.net/tracydawn123/article/details/31773153 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC ...

  2. H264中的SPS、PPS提取与作用

    From: http://blog.csdn.net/sunnylgz/article/details/7680262 牛逼的视频会议网站:http://wmnmtm.blog.163.com/blo ...

  3. RTP传输H264时的sps和pps的获取

    From: http://wmnmtm.blog.163.com/blog/static/38245714201192491746701/ 使用RTSP传输H264的时候,需要用到sdp协议描述,其中 ...

  4. ffmpeg 推流 在H264中插入SPS、PPS 头

    1. SPS PPS头的重要性 SPS PPS 头在编解码H264时非常重要,里面不仅包含了许多关于视频流的相关信息:比如宽高等.还标志着一个视频流的开头. 一般视频流前开头第一帧是SPS 第二帧是P ...

  5. H264编解码SPS、PPS参数说明

    H264编解码参数说明 一.H264码流分层 1.NAL层 ①.如何判断帧类型(是图像参考帧还是I.P帧等)? ②. 帧格式 ③. [SPS格式解析代码分析 ParseAndRewriteSps方法 ...

  6. H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    SkySeraph Apr 1st 2012 Email:skyseraph00@163.com 一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装 ...

  7. 【流媒体】H264—MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象编码的 ...

  8. MP4格式及在MP4文件中提取H264的SPS、PPS及码流

    一.MP4格式基本概念 MP4格式对应标准MPEG-4标准(ISO/IEC14496) 二.MP4封装格式核心概念 1  MP4封装格式对应标准为 ISO/IEC 14496-12(信息技术 视听对象 ...

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

    原文地址为: [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 [流媒體]H264-MP4格式及在MP4文件中提取H264的SPS.PPS及码流 SkySeraph A ...

最新文章

  1. 数字广告领域的若干专业词汇汇总
  2. 550 黑苹果_HFP虾青素原液 | 多年黑黄皮,熬夜肌都能轻松变白!
  3. 电气与计算机学院院长论坛报告,自动化学院分论坛第十、十一次专家报告会圆满成功...
  4. RedHat系统安装nextcloud
  5. 程序员如何更好地获取用户信息?
  6. B站(IT速成之JAVA速成班 300分钟算法面试)跟做笔记
  7. 蓝牙 AVRCP 剖析
  8. 【学习笔记】C51 keil v4 流水灯简单代码的编写
  9. java 双三次线性插值_三种常见的图像处理双三次插值算法
  10. 桥接模式 和 中继模式
  11. 在Linux如何搭建Oracle11g Data Guard
  12. html5开发制作,漂亮html5模板欣赏,H5网站建设
  13. Nao机器人运行B-human代码之开始篇 2
  14. 缓冲区溢出基础实践(二)——ROP 与 hijack GOT
  15. [游戏记录]滚动的天空
  16. 服务器性能参数:QPS、PV、IP
  17. navicat数据库对比 教程
  18. 周鸿袆给创业者的建议
  19. 关于10G/40G/100G数据中心光纤布线知识
  20. wiki中文语料的word2vec模型构建

热门文章

  1. 微软推出的Prompt高级玩法,包括小样本和任务分解等,简直不要太详细:Azure OpenAI 的提示工程技术
  2. C++:char数组、自定义copy数组
  3. python的各种运算
  4. jsdelivr cdn大陆挂了不能访问替代方案
  5. 软件设计:勿以善小而不为,勿以恶小而为之
  6. 【JS】Axios取消未完成请求解决Tab频繁切换数据问题
  7. 动态获取手机屏幕宽高及动态设置控件宽高
  8. Sream流、方法引用
  9. java 贪吃蛇碰撞检测_温习数据算法—贪吃蛇
  10. ubuntu系统修改用户权限