C++ 解析H264文件

#include "stdafx.h"
#include <windows.h>

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, btData[i + 3]);
			j++;
			i += 3;
		}
		else if (btData[i] == 0x00 && btData[i + 1] == 0x00 && btData[i + 2] == 0x00 && btData[i + 3] == 0x01){
			int nLen = GetLen(i + 4, dwFileSize, btData);
			printfH264(j, i, nLen, btData[i + 4]);
			j++;
			i += 4;
		}
		else{
			i++;
		}
	}

	if (btData){
		delete[] btData;
	}
	return 0;
}
http://download.csdn.net/detail/sz76211822/9717609

                
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值