• 大小: 2.17MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-08-16
  • 语言: C/C++
  • 标签: C++  

资源简介

C++ 解析H264文件.vs2012

资源截图

代码片段和文件信息

#include “stdafx.h“
#include 

typedef enum {
NALU_TYPE_SLICE    = 1
NALU_TYPE_DPA      = 2
NALU_TYPE_DPB      = 3
NALU_TYPE_DPC      = 4
NALU_TYPE_IDR      = 5
NALU_TYPE_SEI      = 6
NALU_TYPE_SPS      = 7
NALU_TYPE_PPS      = 8
NALU_TYPE_AUD      = 9
NALU_TYPE_EOSEQ    = 10
NALU_TYPE_EOSTREAM = 11
NALU_TYPE_FILL     = 12
} NaluType;

typedef enum {
NALU_PRIORITY_DISPOSABLE = 0
NALU_PRIRITY_LOW         = 1
NALU_PRIORITY_HIGH       = 2
NALU_PRIORITY_HIGHEST    = 3
} NaluPriority;

void printfH264(int j int i int nLen int nframeType)
{
printf(“%d  %d“ j i);
int nForbiddenBit = (nframeType>>7) & 0x1;//第1位禁止位,值为1表示语法出错
int nReference_idc = (nframeType>>5) & 0x03;//第2~3位为参考级别
int nType = nframeType & 0x1f;//第4~8为是nal单元类型


printf(“  “);
switch(nReference_idc){
case NALU_PRIORITY_DISPOSABLE:
printf(“DISPOS“);
break;
case NALU_PRIRITY_LOW:
printf(“LOW“);
break;
case NALU_PRIORITY_HIGH:
printf(“HIGH“);
break;
case NALU_PRIORITY_HIGHEST:
printf(“HIGHEST“);
break;
}

printf(“  “);
switch(nType){
case NALU_TYPE_SLICE:
printf(“SLICE“);
break;
case NALU_TYPE_DPA:
printf(“DPA“);
break;
case NALU_TYPE_DPB:
printf(“DPB“);
break;
case NALU_TYPE_DPC:
printf(“DPC“);
break;
case NALU_TYPE_IDR:
printf(“IDR“);
break;
case NALU_TYPE_SEI:
printf(“SEI“);
break;
case NALU_TYPE_SPS:
printf(“SPS“);
break;
case NALU_TYPE_PPS:
printf(“PPS“);
break;
case NALU_TYPE_AUD:
printf(“AUD“);
break;
case NALU_TYPE_EOSEQ:
printf(“EOSEQ“);
break;
case NALU_TYPE_EOSTREAM:
printf(“EOSTREAM“);
break;
case NALU_TYPE_FILL:
printf(“FILL“);
break;
}

printf(“  %d\r\n“ nLen);
}

int GetLen(int nPos int nTotalSize BYTE* btData)
{
int nStart = nPos;
while (nStart < nTotalSize){
if (btData[nStart] == 0x00 && btData[nStart + 1] == 0x00 && btData[nStart + 2] == 0x01){
return nStart - nPos;
}
else if (btData[nStart] == 0x00 && btData[nStart + 1] == 0x00 && btData[nStart + 2] == 0x00 && btData[nStart + 3] == 0x01){
return nStart - nPos;
}
else{
nStart++;
}
}
return nTotalSize - nPos;//最后一帧。
}

int _tmain(int argc _TCHAR* argv[])
{
BYTE *btData = NULL;
DWORD dwFileSize = 0;
HANDLE hFile = CreateFile(L“E:\\video\\sintel.h264“ GENERIC_READ | GENERIC_WRITE 0 NULL OPEN_EXISTING FILE_ATTRIBUTE_NORMAL NULL);
if (hFile != INVALID_HANDLE_VALUE){
dwFileSize = GetFileSize(hFile NULL);
btData = new BYTE[dwFileSize];
memset(btData 0 dwFileSize);
  
DWORD dwRead = 0;
ReadFile(hFile btData dwFileSize &dwRead NULL);
CloseHandle(hFile);
}

int j = 0;//多少帧
int i = 0;//偏移量
while (i < dwFileSize - 4){
if (btData[i] == 0x00 && btData[i + 1] == 0x00 && btData[i + 2] == 0x01){
int nLen = GetLen(i + 3 dwFileSize btData);
printfH264(j i nLen 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件    2263679  2016-01-12 21:38  ParseH264\Debug\sintel.h264

     文件       3393  2016-12-21 15:17  ParseH264\ParseH264\ParseH264.cpp

     文件       4526  2016-12-21 13:42  ParseH264\ParseH264\ParseH264.vcxproj

     文件       1333  2016-12-21 13:42  ParseH264\ParseH264\ParseH264.vcxproj.filters

     文件       1729  2016-12-21 13:42  ParseH264\ParseH264\ReadMe.txt

     文件        296  2016-12-21 13:42  ParseH264\ParseH264\stdafx.cpp

     文件        320  2016-12-21 13:42  ParseH264\ParseH264\stdafx.h

     文件        314  2016-12-21 13:42  ParseH264\ParseH264\targetver.h

     文件        894  2016-12-21 13:42  ParseH264\ParseH264.sln

    ..A..H.     23040  2016-12-21 15:19  ParseH264\ParseH264.v11.suo

     目录          0  2016-12-21 15:19  ParseH264\Debug

     目录          0  2016-12-21 15:01  ParseH264\ParseH264

     目录          0  2016-12-21 15:19  ParseH264

----------- ---------  ---------- -----  ----

              2299524                    13


评论

共有 条评论