从NAL UNIT中对rbsp获取的原理如图所示,此为NAL UNIT解析的架构图

头文件

#ifndef __NAL_UNIT_H__
#define __NAL_UNIT_H__#include <stdio.h>typedef struct Nal_Unit_Fops {int  (*find_nal_unit_data)(FILE *file);int  (*find_nal_unit_head)(char (*QueueBuf)[],int *pos,char *character,FILE *file);void (*find_nal_unit_type)(char (*QueueBuf)[],int *pos,char *character,FILE *file);int  (*nal_unit_ebsp_to_rbsp)(char (*QueueBuf)[],int *pos);
} NAL_UNIT_OPS, *P_NAL_UNIT_OPS; typedef struct File_Fops {int (*open_file)(FILE **file,const char *file_path);int (*close_file)(FILE *file);
} FILE_OPS, *P_FILE_OPS;P_NAL_UNIT_OPS NalUnitOps = NULL;
P_FILE_OPS FileOps = NULL;#endif

主文件

#include "Nal_Unit.h"/* ebsp 转化为rbsp */
static int nal_unit_ebsp_to_rbsp(char (*QueueBuf)[],int *pos)
{int IsExtended = 0;/* 寻找ebsp流中是否存在00 00 03字符,如果存在则需要将其03去除,从而转化为rbsp */if(((*QueueBuf)[((*pos)+0)%3] == 0) && ((*QueueBuf)[((*pos)+1)%3] == 0) && ((*QueueBuf)[((*pos)+2)%3] == 3)) {IsExtended = 1;}return IsExtended;
}/* 寻找当前nal unit类型 */
static void find_nal_unit_type(char (*QueueBuf)[],int *pos,char *character,FILE *file)
{int Type = 0;fread(character,1,1,file);(*QueueBuf)[((*pos)++)%3] = *character;Type = *character & 0x1F; //printf("Type = %d\n",Type);
}/* 寻找nal unit头部信息*/
static int find_nal_unit_head(char (*QueueBuf)[],int *pos,char *character,FILE *file)
{fread(character,1,1,file);/* (1)给char buf先赋值 */(*QueueBuf)[((*pos)++)%3] = *character;if((*pos) < 3) {return -1;} else {if(((*QueueBuf)[((*pos)+0)%3] == 0) && ((*QueueBuf)[((*pos)+1)%3] == 0) && ((*QueueBuf)[((*pos)+2)%3] == 1)) {/* (2)寻找00 00 00 01形式的起始码 *///printf("find nal unit 001 pos = %d\n",pos);return 1;} else if(((*QueueBuf)[((*pos)+0)%3] == 0) && ((*QueueBuf)[((*pos)+1)%3] == 0) && ((*QueueBuf)[((*pos)+2)%3] == 0)) {/* (3)寻找 00 00 00 01形式的起始码 */fread(character,1,1,file);(*QueueBuf)[((*pos)++)%3] = *character;if(*character == 1) {//printf("find nal unit 0001 pos = %d\n",pos);return 2;}} else;}return 0;
}/* 寻找h264文本中的rbsp流 */
static int find_nal_unit_data(FILE *file)
{char QueueBuf[3] = {0};char character = 0;int pos = 0;int retVal = 0;while(!feof(file) && !ferror(file)) {/* 寻找nal unit head */retVal = NalUnitOps->find_nal_unit_head(&QueueBuf,&pos,&character,file);if(retVal == 1 || retVal == 2) {/* 判断nal unit type */NalUnitOps->find_nal_unit_type(&QueueBuf,&pos,&character,file);} else if(retVal == 0) {/* 将ebsp流转化为rbsp流,并且输出到终端上显示 */if(NalUnitOps->nal_unit_ebsp_to_rbsp(&QueueBuf,&pos));elseprintf("%c",character);} else;}return 0;
}static int open_file(FILE **file, const char *file_path)
{int Rval = 0;if(!(*file = fopen(file_path,"r"))) {printf("open file failure!\n");Rval = -1; }return Rval;
}static int close_file(FILE *file)
{int Rval = 0;if((Rval = (fclose(file))) != 0) {printf("close file failure!\n");Rval = -1;}return Rval;
}NAL_UNIT_OPS nal_unit_fops = {.find_nal_unit_data    = find_nal_unit_data,.find_nal_unit_head    = find_nal_unit_head,.find_nal_unit_type    = find_nal_unit_type,.nal_unit_ebsp_to_rbsp = nal_unit_ebsp_to_rbsp,
};FILE_OPS file_fops = {.open_file = open_file,.close_file = close_file,
};int main(int argc,char *argv[])
{if(argc != 2) {printf("pleasr input ./elf ./h264_file \n");return -1;}printf("find Nal Unit data\n");FILE *file = NULL;FileOps = &file_fops;NalUnitOps = &nal_unit_fops;FileOps->open_file(&file,argv[1]);/* 寻找nal unit 的rbsp数据流 */NalUnitOps->find_nal_unit_data(file);done:FileOps->close_file(file);return 0;
}

获取NAL_UNIT的RBSP数据相关推荐

  1. 管理员信息管理之获取管理员用户列表数据

    管理员信息管理 在系统管理中我们需要完成管理员表的增删改查,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 获取管理员用户列表数据 接口分析 请求方式: GET /meiduo ...

  2. 分组表管理之获取用户组表列表数据

    分组表管理 在系统管理中我们需要完成用户组表的增删改查,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 获取用户组表列表数据 接口分析 请求方式: GET /meiduo_ad ...

  3. 订单管理之获取订单表详情数据数据

    获取订单表详情数据数据 当点击订单详情时,我们需要获取订单详情数据 接口分析 请求方式: GET /meiduo_admin/orders/(?P<pk>\d+)/ 请求参数: 通过请求头 ...

  4. 订单管理之获取订单表表列表数据

    获取订单表表列表数据 [订单数据是不能删除的,只能修改订单信息的状态] 接口分析 请求方式: GET /meiduo_admin/orders/?keyword=<搜索内容>&pa ...

  5. SPU表管理之查询获取SPU表列表数据

    SPU表管理 在SPU表中我们需要对SKU表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 查询获取SPU表列表数据 在获取sku数据时,我们在请求中包含 ...

  6. SKU表管理之查询获取sku表列表数据

    SKU表管理 在sku表中我们需要对SKU表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 查询获取sku表列表数据 [商品的详细信息,要引入事务的管理, ...

  7. 规格表管理之查询获取规格表列表数据

    规格表管理 在规格表中我们需要对规格表数据进行增删改查操作,这时候我们可以借助于视图集中的ModelViewset来完成相应的操作 查询获取规格表列表数据 接口分析 请求方式: GET /meiduo ...

  8. 调用实现天气预报功能android,Android编程实现获取新浪天气预报数据的方法

    本文实例讲述了Android编程实现获取新浪天气预报数据的方法.分享给大家供大家参考,具体如下: 新浪天气预报地址: http://php.weather.sina.com.cn/xml.php?ci ...

  9. beego 获取字符串中的数据_MySQL中获取季度、年度等数据

    上一篇讲了如何获取天.周.月等数据,本篇介绍一下如何获取季度.年度数据,以及一些特殊的日期需求 1.本季度 QUARTER(CURDATE()) 示例: select * from tablename ...

最新文章

  1. 根据基因或者蛋白的id提取序列---extract_seq.exe
  2. 大文件分片上传前端框架_js实现大文件分片上传的方法
  3. 常用window cmd命令
  4. java 文件拷贝保留原来的属性,Java - 复制JPG,同时保留所有文件属性
  5. C++对于文件的相关操作 创建、读写、删除代码
  6. python为什么是蟒蛇_Python 为什么推荐蛇形命名法?
  7. 罗永浩欲直播带货,京东说可以帮忙联系
  8. 内存恶鬼drawRect - 谈画图功能的内存优化
  9. 对于新安装的MySQL如何提升MySQL的安全级别
  10. Quartz入门到精通
  11. 初二生态系统思维导图_鑫讲堂:初二年级十一月微讲座汇报(二)
  12. swfupload 实例 php,文件上传之SWFUpload插件(代码)_php实例
  13. DSDT/SSDT综合教程
  14. 【AD封装】TF(micro SD)卡座封装大全(带3D)
  15. ftp服务器限制文件大小,ftp服务器设置文件大小
  16. 三角函数π/2转化_分析最简单的正弦和余弦三角函数的图像
  17. 梦三国2英霸模式貂蝉攻略(玩大流)
  18. MySQL基础笔记(14)-使用Amoeba和Docker搭建MySQL读写分离架构
  19. 调度算法学习_MIN-MIN及MAX-MIN算法
  20. 2020年11月4日

热门文章

  1. 平方根法matlab,MATLAB數值分析之平方根法
  2. 一个或多个音频服务未运行怎么修复?
  3. ABT 平台开发两周年 初心愿景更聚焦
  4. Windows远程文件下载执行的15种姿势
  5. 基于ssm的民宿预订网站的设计与实现
  6. 还在为怎么写SCI投稿邮件发愁?给你收集7个阶段邮件模板
  7. ChatGPT原理解读
  8. ECharts是什么?
  9. vue.2.4.0.js_YouZan的Vue.js 2.0移动用户界面
  10. 陕西省郁金香 鲜花展览盛会