C++ 解析H264文件


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
“ 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  ParseH264Debugsintel.h264

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

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

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

     文件       1729  2016-12-21 13:42  ParseH264ParseH264ReadMe.txt

     文件        296  2016-12-21 13:42  ParseH264ParseH264stdafx.cpp

     文件        320  2016-12-21 13:42  ParseH264ParseH264stdafx.h

     文件        314  2016-12-21 13:42  ParseH264ParseH264 argetver.h

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

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

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

     目录          0  2016-12-21 15:01  ParseH264ParseH264

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

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

              2299524                    13


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

发表评论

评论列表(条)