从264文件中读取Nal,一般用于测试的时候H264输入源:

参考:https://blog.csdn.net/leixiaohua1020/article/details/17933821

分辨率较大的话需要修改 READH264_MAXFRAME_SIZE,

#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define PTR_NULL (void *)0#define _RET_OK         0
#define _RET_ERR        -1
#define _RET_MEM        -2
#define _RET_PARAM      -3
#define _RET_FILE       -4
#define _RET_SUPPFRAME  -5#define READH264_MAGIC          0x48323634
#define READH264_MAXFRAME_SIZE  1920*1080*3/2
#define READH264_CACHE_SIZE     (READH264_MAXFRAME_SIZE + 16)#define H264CHECK_RET(ret)   if(ret < 0) {return ret;}typedef struct stru_READHANDLE
{int iMagic;FILE *fp;int bFileEnd;int iNaluEndPos;int iCachePos;int iCacheSize;int iFrameSize;unsigned char *pucCache;unsigned char *pucFrame;
}ST_READHANDLE;static int FindStartCode(unsigned char *scData)
{if ((0==scData[0]) && (0==scData[1]) && (((0==scData[2]) && (1 == scData[3])) || (1==scData[2])) ){return 1;}return 0;
}static int GetNaluDataLen(int startPos, int h264BitsSize, unsigned char *h264Bits)
{int parsePos = 0;parsePos = startPos;while (parsePos < h264BitsSize){if (FindStartCode(&h264Bits[parsePos])){return parsePos - startPos;}else{parsePos++;}}return parsePos - startPos; // if file is end
}static int initReadHandle(ST_READHANDLE **pphandle)
{ST_READHANDLE *phandle = (ST_READHANDLE*)malloc(sizeof(ST_READHANDLE));if (NULL == phandle) return _RET_MEM;memset(phandle, 0, sizeof(ST_READHANDLE));phandle->iMagic = READH264_MAGIC;phandle->pucCache = malloc(READH264_CACHE_SIZE);if (NULL == phandle->pucCache){free(phandle);return _RET_MEM;}phandle->iCacheSize = READH264_CACHE_SIZE;phandle->pucFrame = malloc(READH264_MAXFRAME_SIZE);if (NULL == phandle->pucFrame){free(phandle->pucCache);free(phandle);return _RET_MEM;}phandle->iFrameSize = READH264_MAXFRAME_SIZE;*pphandle = phandle;printf("init ok %p\n",*pphandle);return _RET_OK;
}static int checkHandle(ST_READHANDLE **pphandle)
{if (NULL == pphandle)  return _RET_ERR;if (NULL == *pphandle)  H264CHECK_RET(initReadHandle(pphandle));if ((READH264_MAXFRAME_SIZE != (*pphandle)->iFrameSize))  return _RET_PARAM;return _RET_OK;
}static int read246File(ST_READHANDLE *phandle, unsigned char *pucfileName)
{int iReadLen = 0;if (phandle->bFileEnd)   return _RET_OK;if (NULL == phandle->fp){if ((NULL == pucfileName) || (strlen((const char *)pucfileName) <=0)) return _RET_PARAM;phandle->fp = fopen((const char *)pucfileName,"rb");if (NULL == phandle->fp)   return _RET_FILE;}iReadLen = fread(&phandle->pucCache[phandle->iCachePos], 1, (phandle->iCacheSize - phandle->iCachePos), phandle->fp);if (iReadLen != phandle->iCacheSize - phandle->iCachePos){fclose(phandle->fp);phandle->fp = NULL;phandle->bFileEnd = 1;if (iReadLen < 0)  iReadLen = 0;}phandle->iCachePos += iReadLen;return _RET_OK;
}static int getFrameLen(ST_READHANDLE *phandle)
{if (FindStartCode(phandle->pucCache))return GetNaluDataLen(3, phandle->iCachePos, phandle->pucCache) + 3;return _RET_ERR;
}static int Get246Frame(ST_READHANDLE *phandle, unsigned char **ppbuf, int *iLen)
{int iRet = 0;*iLen = 0;if (phandle->iCachePos <= 0){printf("read end CacheLen:%d\n", phandle->iCachePos);return 0;}iRet = getFrameLen(phandle);H264CHECK_RET(iRet);if (iRet > READH264_MAXFRAME_SIZE)return _RET_SUPPFRAME;memcpy(phandle->pucFrame, phandle->pucCache, iRet);if (phandle->iCachePos > iRet){memmove(phandle->pucCache, phandle->pucCache+iRet, phandle->iCachePos-iRet);phandle->iCachePos = phandle->iCachePos - iRet;}else{printf("read end CacheLen:%d FrameLen:%d\n",phandle->iCachePos, iRet);phandle->iCachePos = 0;}*ppbuf = phandle->pucFrame;*iLen = iRet;return iRet;
}int read264Nalu(void **pphandle, unsigned char *pucfileName,unsigned char **ppbuf, int *iLen)
{if ((NULL == ppbuf) || (NULL == iLen))return _RET_PARAM;H264CHECK_RET(checkHandle((ST_READHANDLE **)pphandle));//printf("check ok %p-%p \n",pphandle, *pphandle);H264CHECK_RET(read246File((ST_READHANDLE *)*pphandle, pucfileName));return Get246Frame(*pphandle, ppbuf, iLen);
}int releaseReadHanle(void **pphandle)
{ST_READHANDLE *phandle = NULL;if ((NULL == pphandle) && (NULL == *pphandle))return _RET_ERR;phandle = *pphandle;if (phandle->fp)fclose(phandle->fp);if (phandle->pucCache)free(phandle->pucCache);if (phandle->pucFrame)free(phandle->pucFrame);free(phandle);*pphandle = NULL;printf("releaseReadHanle\n");return _RET_OK;
}#if 0
int main(int argc, char *argv[])
{void *pReadHandle = NULL;unsigned char *pucReadFrame = NULL;int iFrameLen = 0;FILE *fp = fopen(argv[2], "wb");if (!fp){printf("open file[%s] error!\n", argv[2]);return -1;}while (read264Nalu(&pReadHandle,argv[1], &pucReadFrame, &iFrameLen) > 0){printf("Get FrameLen:%d \n",iFrameLen);fwrite(pucReadFrame, 1, iFrameLen, fp);}releaseReadHanle(&pReadHandle);fclose(fp);return 0;
}
#endif

read H264 Nal相关推荐

  1. H264 NAL单元简介

    目录 一.H264 NAL头部 二.H264参数集 2.1 H264 SPS 2.2 H264 PPS 三.H264 Slice 五.H264参考帧管理方法 Elecard StreamEye​​​​ ...

  2. H264(NAL简介与帧判断)

    转自(http://www.cnblogs.com/yjg2014/p/6144977.html) 参考:图像编码与 H264 基础知识 h264解码之自定义信息(SEI) 1.NAL全称Networ ...

  3. RTP H264 NAL

    H264 采用了多种错误恢复及适合网络传输的NAL特点来使用各种实时视频传输. (1)参数集:序列参数集和图像参数集 序列参数集包括一个图像序列的所有信息,即两个IDR图像间的所有图像信息 图像参数集 ...

  4. H264(NAL简介与I帧判断) 扩展H265

    原帖地址 1.NAL全称Network Abstract Layer, 即网络抽象层.          在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络 ...

  5. H264(NAL简介与I帧判断)

    http://blog.csdn.net/jefry_xdz/article/details/8461343 1.NAL全称Network Abstract Layer, 即网络抽象层.        ...

  6. H264 NAL 单元解析

    1.NAL全称Network Abstract Layer, 即网络抽象层.          在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(VCL)和网络抽象层面( ...

  7. h264 NAL 类型描述

    enum nal_unit_type_e { NAL_UNKNOWN = 0, // 未使用 NAL_SLICE = 1, // 不分区.非 IDR 图像的片(片的头信息和数据) NAL_SLICE_ ...

  8. ffmpeg h264+ts +udp传输

    http://bbs.csdn.net/topics/370246456 http://1229363.blog.163.com/blog/static/19743427201001244711137 ...

  9. RTP协议解析和H264码流提取

    一. h264基础概念 SODB: 数据比特串-->最原始的编码数据 RBSP: 原始字节序列载荷-->在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit&q ...

  10. [H264编解码参数] SPS

    #前言 RTP完整流程 已经 解释了协议 所以要涉及具体的log分析 分为: SPS \ PPS\I帧\非I帧\FU-A SPS 序列参数集合 SPS 属于 [RTP header] + 单一NAL单 ...

最新文章

  1. 一个复杂系统的拆分改造实践!
  2. 调用别的类中的变量(但是还是有问题)
  3. 产品经理——pm具备的五项技能
  4. 【Java】区分BigDecimal的toString()和toPlainString()
  5. C++/C--lambda表达式与函数对象【转载】
  6. 使用sshpass借助scp自动输入密码传输一个文件夹下的全部内容
  7. linux网卡握手速率模式,一种基于Linux平台下的网卡速率和双工模式测试的方法与流程...
  8. Pytorch Dataset、Dataloader的简单理解与使用
  9. Android运行时权限,设置帮助类BaseActivity;电话权限,短信权限,
  10. Linux网络编程|UDP编程实例
  11. *rock ,scissors ,paperpku 2339
  12. Python并发编程
  13. 弘辽科技:惊!原来吸引淘宝买家眼球的标题是这么写出来的!
  14. 非递归的归并排序(详细解析)
  15. 图形化mysql监控_mysql_monitor
  16. oracle如何实现自增?----用序列sequence的方法来实现
  17. htonl ntohl htons ntohs
  18. webservice 暴漏接口_解决java web 项目发布webservice接口
  19. 【爬虫】查看代理IP是否有效
  20. Shrio异常The security manager does not implement the WebSecurityManager interface.

热门文章

  1. MATLAB数学建模方法与实践(第3版)——读书笔记
  2. wallys/IPQ4019/IPQ4029/Access Point Wireless Module Dual band 11AC Wave2 Module
  3. 高等数学学习笔记——第十八讲——函数连续的概念
  4. Python2.7打包的exe文件反编译成py文件
  5. android交友php,android交友约会社交APP完整源码Dating App 3.7(服务端+客户端)
  6. 查看SQL执行计划的方法
  7. 利润表模板excel_让财务人看完心动的369个Excel财务分析图表,老板都忍不住点赞...
  8. Qt —— 海康SDK获取视频并OpenCv处理每帧图像进行显示
  9. 2019美赛M(一等/优异)奖,给想参加美赛的同学们的干货建议
  10. linux内核Device Drivers设备驱动程序