参考链接: 1. HEVC码流解析 https://blog.csdn.net/CrystalShaw/article/details/80624804
      2. HEVC编码结构:序列参数集SPS、图像参数集PPS、视频参数集VPS https://blog.csdn.net/lin453701006/article/details/52797104
      3. H265码流结构分析 https://blog.csdn.net/u011003120/article/details/83411445#11_H265_4

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h> #define TAB44 " "
#define PRINTF_DEBUG #define PRTNTF_STR_LEN 10 typedef enum e_hevc_nalu_type {
HEVC_NAL_TRAIL_N = ,
HEVC_NAL_TRAIL_R = ,
HEVC_NAL_TSA_N = ,
HEVC_NAL_TSA_R = ,
HEVC_NAL_STSA_N = ,
HEVC_NAL_STSA_R = ,
HEVC_NAL_RADL_N = ,
HEVC_NAL_RADL_R = ,
HEVC_NAL_RASL_N = ,
HEVC_NAL_RASL_R = ,
HEVC_NAL_VCL_N10 = ,
HEVC_NAL_VCL_R11 = ,
HEVC_NAL_VCL_N12 = ,
HEVC_NAL_VCL_R13 = ,
HEVC_NAL_VCL_N14 = ,
HEVC_NAL_VCL_R15 = ,
HEVC_NAL_BLA_W_LP = ,
HEVC_NAL_BLA_W_RADL = ,
HEVC_NAL_BLA_N_LP = ,
HEVC_NAL_IDR_W_RADL = ,
HEVC_NAL_IDR_N_LP = ,
HEVC_NAL_CRA_NUT = ,
HEVC_NAL_IRAP_VCL22 = ,
HEVC_NAL_IRAP_VCL23 = ,
HEVC_NAL_RSV_VCL24 = ,
HEVC_NAL_RSV_VCL25 = ,
HEVC_NAL_RSV_VCL26 = ,
HEVC_NAL_RSV_VCL27 = ,
HEVC_NAL_RSV_VCL28 = ,
HEVC_NAL_RSV_VCL29 = ,
HEVC_NAL_RSV_VCL30 = ,
HEVC_NAL_RSV_VCL31 = ,
HEVC_NAL_VPS = ,
HEVC_NAL_SPS = ,
HEVC_NAL_PPS = ,
HEVC_NAL_AUD = ,
HEVC_NAL_EOS_NUT = ,
HEVC_NAL_EOB_NUT = ,
HEVC_NAL_FD_NUT = ,
HEVC_NAL_SEI_PREFIX = ,
HEVC_NAL_SEI_SUFFIX =
} E_HEVC_NALU_TYPE; /********************************************************************************
typedef struct t_h264_nalu_header
{
unsigned char forbidden_bit:1, nal_reference_idc:2, nal_unit_type:5;
} T_H264_NALU_HEADER; (1个字节, hevc header为2个字节)
*********************************************************************************/
typedef struct t_h265_nalu_header
{
unsigned short forbidden_zero_bit:, nal_unit_type:, nuh_layer_id:, nuh_temporal_id_plus1:;
} T_H265_NALU_HEADER; typedef struct t_h265_nalu
{
int startCodeLen; T_H265_NALU_HEADER h265NaluHeader; unsigned int bodyLen; unsigned char *bodyData;
} T_H265_NALU; /**********************************************************************************
1. h265的起始码: 0x000001(3 Bytes)或0x00000001(4 Bytes);
2. 文件流中用起始码来区分NALU;
3. 如果NALU类型为vps, sps, pps, 或者解码顺序为第一个AU的第一个NALU, 起始码前面再加一个0x00
视频流的首个NALU的起始码前加入0x00(4 Bytes的由来).
***********************************************************************************/
static int FindStartCode3Bytes(unsigned char *scData)
{
int isFind = ; if ((==scData[]) && (==scData[]) && (==scData[]))
{
isFind = ;
} return isFind;
} static int FindStartCode4Bytes(unsigned char *scData)
{
int isFind = ; if ((==scData[]) && (==scData[]) && (==scData[]) && ( == scData[]))
{
isFind = ;
} return isFind;
} static int GetNaluDataLen(int startPos, int h265BitsSize, unsigned char *h265Bits)
{
int parsePos = ; parsePos = startPos; while (parsePos < h265BitsSize)
{
if (FindStartCode3Bytes(&h265Bits[parsePos]))
{
return parsePos - startPos;
}
else if (FindStartCode4Bytes(&h265Bits[parsePos]))
{
return parsePos - startPos;
}
else
{
parsePos++;
}
} return parsePos - startPos; // if file is end
} static void ParseNaluData(const unsigned int naluLen, unsigned char* const nuluData)
{
static int naluNum = ; unsigned char *data = NULL;
unsigned char typeStr[PRTNTF_STR_LEN+] = {}; T_H265_NALU_HEADER h265NaluHeader = {}; data = nuluData; memset(&h265NaluHeader, 0x0, sizeof(T_H265_NALU_HEADER)); h265NaluHeader.nal_unit_type = ((data[]>>) & 0x3f); naluNum++; #ifdef PRINTF_DEBUG
switch (h265NaluHeader.nal_unit_type)
{
case HEVC_NAL_TRAIL_N:
sprintf(typeStr, "B SLICE");
break; case HEVC_NAL_TRAIL_R:
sprintf(typeStr, "P SLICE");
break; case HEVC_NAL_IDR_W_RADL:
sprintf(typeStr, "IDR");
break; case HEVC_NAL_VPS:
sprintf(typeStr, "VPS");
break; case HEVC_NAL_SPS:
sprintf(typeStr, "SPS");
break; case HEVC_NAL_PPS:
sprintf(typeStr, "PPS");
break; case HEVC_NAL_SEI_PREFIX:
sprintf(typeStr, "SEI");
break; default:
sprintf(typeStr, "NTYPE(%d)", h265NaluHeader.nal_unit_type);
break;
} printf("%5d| %7s| %8d|\n", naluNum, typeStr, naluLen);
#endif
} int main(int argc, char *argv[])
{
int fileLen = ;
int naluLen = ;
int h265BitsPos = ; /* h265, hevc; h264, avc系列, Advanced Video Coding */ unsigned char *h265Bits = NULL;
unsigned char *naluData = NULL; FILE *fp = NULL; if ( != argc)
{
printf("Usage: flvparse **.flv\n"); return -;
} fp = fopen(argv[], "rb");
if (!fp)
{
printf("open file[%s] error!\n", argv[]); return -;
} fseek(fp, , SEEK_END); fileLen = ftell(fp); fseek(fp, , SEEK_SET); h265Bits = (unsigned char*)malloc(fileLen);
if (!h265Bits)
{
printf("maybe file is too long, or memery is not enough!\n"); fclose(fp); return -;
} memset(h265Bits, 0x0, fileLen); if (fread(h265Bits, , fileLen, fp) < )
{
printf("read file data to h265Bits error!\n"); fclose(fp);
free(h265Bits); h265Bits = NULL; return -;
} fclose(fp); printf("-----+--- NALU Table --+\n");
printf(" NUM | TYPE | LEN |\n");
printf("-----+-------+---------+\n"); while (h265BitsPos < (fileLen-))
{
if (FindStartCode3Bytes(&h265Bits[h265BitsPos]))
{
naluLen = GetNaluDataLen(h265BitsPos+, fileLen, h265Bits); naluData = (unsigned char*)malloc(naluLen);
if (naluData)
{
memset(naluData, 0x0, naluLen); memcpy(naluData, h265Bits+h265BitsPos+, naluLen); ParseNaluData(naluLen, naluData); free(naluData);
naluData = NULL;
} h265BitsPos += (naluLen+);
}
else if (FindStartCode4Bytes(&h265Bits[h265BitsPos]))
{
naluLen = GetNaluDataLen(h265BitsPos+, fileLen, h265Bits); naluData = (unsigned char*)malloc(naluLen);
if (naluData)
{
memset(naluData, 0x0, naluLen); memcpy(naluData, h265Bits+h265BitsPos+, naluLen); ParseNaluData(naluLen, naluData); free(naluData);
naluData = NULL;
} h265BitsPos += (naluLen+);
}
else
{
h265BitsPos++;
}
} return ;
}

  最后如果您觉得本篇对您有帮助,可以打赏下,谢谢!!!

h265文件分析(纯c解析代码)的更多相关文章

  1. h264文件分析(纯c解析代码)

    参考链接:1. 解析H264的SPS信息 https://blog.csdn.net/lizhijian21/article/details/80982403               2. h.2 ...

  2. mpeg4文件分析(纯c解析代码)

    参考链接: 1. MPEG4码流的帧率计算 https://blog.csdn.net/littlebee90/article/details/68924690                2. M ...

  3. ts文件分析(纯c解析代码)

    参考链接: 1. MPEG-2 TS码流分析 https://blog.csdn.net/zhubin215130/article/details/8958567 TS Header PAT PMT ...

  4. mpeg2文件分析(纯c解析代码)

    参考链接: 1. MPEG-2码流结构分析 https://www.cnblogs.com/CoderTian/p/9246225.html(本文语法采用这里的截图,代码原创) 1. mpeg2的码流 ...

  5. flv文件解析(纯c解析代码)

    参考链接: 1. FLV科普12 FLV脚本数据解析-Metadata Tag解析 https://blog.csdn.net/cabbage2008/article/details/50500021 ...

  6. mp4文件解析(纯c解析代码)

     参考链接:1. mp4文件格式解析 https://www.cnblogs.com/ranson7zop/p/7889272.html   2. MP4文件格式分析及分割实现(附源码) https: ...

  7. ps文件解析(纯c解析代码)

    参考链接:1. PS流的格式和解析总结 http://www.cnblogs.com/lihaiping/p/4181607.html  2. TS科普5 PES包解析 https://blog.cs ...

  8. linux内核中链表代码分析---list.h头文件分析(一)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...

  9. linux内核中链表代码分析---list.h头文件分析(二)【转】

    转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...

随机推荐

  1. JS(JavaScript)的进一步了解7(更新中···)

    1.Js操作css样式 div.style.width=”100px”.在div标签内我们添加了一个style属性,并设定 了width值.这种写法会给标签带来大量的style属性,跟实际项目是不符. ...

  2. [524.A]2019-05-02(星期四)登顶梧桐山邀请

    *** 看房活动召集 ***五一期间天气炎热, 除了登山活动, 还将组织看房活动.拥有一套自己的住房是很多深圳人的梦想.政府十三五期间计划供应人才住房和保障性住房35万套, 与需求相比仍很少, 排队的 ...

  3. Linux常用命令——软件包管理

    Linux常用命令--软件包管理 Linux 模块依赖查询网址http://www.rpmfind.net/ ISO挂载 将所需ISO文件添加到虚拟机 建立挂载文件夹mkdir /mnt/cdrom ...

  4. 基于SVD的图像压缩

    算法简介 算法实现 我只是简单处理了一下图像的灰度值,如果要处理RGB值的话,就需要分别进行SVD分解,最后再合起来即可. import numpy as np from PIL import Ima ...

  5. Go-常见的面试题(一)

    文章转载地址:https://juejin.im/entry/5971bed66fb9a06bb21adf15 1.写出下面代码的输出 package main import "fmt&qu ...

  6. Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data may have been modified or deleted since entities were loaded

    asp.net  更新数据时报错:Database operation expected to affect 1 row(s) but actually affected 0 row(s). Data ...

  7. chat聊天系统项目

    项目名称:实现一个在线聊天系统? 一.需求 1. 海量用户在线聊天系统:2. 用户登录注册:3. 根据用户ID或者Nickname搜索并添加用户:4. 动态知道好友上下线:5. 可以创建群并添加好友到 ...

  8. 《c++ concurrency in action》读书笔记1

    1. 什么是并发通俗来说,并发指两个或者多个独立的事件(活动)同时发生.比如,一边走路一边说话,两个手同时做不同的事情.计算机系统的并发是指一个系统并行处理多个独立的事件(活动), 而不是按顺序或者一 ...

  9. JDK8下Object类源码理解

    JDK8中Object类提供的方法: package java.lang; /** * Class {@code Object} is the root of the class hierarchy. ...

  10. newcoder-最长树链-树/gcd

    https://ac.nowcoder.com/acm/problem/13233 链接:https://ac.nowcoder.com/acm/problem/13233来源:牛客网 题目描述 树链 ...