H.264的解析

实际上是一种流媒体 是由很多细小部分构成的

...NAL

header

RBSP

NAL

header

RBSP

NAL

herder

RBSP...

流媒体是近乎于无限可分的文件格式

NALU 使用 00 00 00 01 或者 00 00 01分隔开 

一个文件中有很短的数据是图片压缩时两张相差不多的图片第二张可以基于第一张 就不用多少数据

代码实现:

MideaFile::MideaFile()
	:m_file(NULL),m_type(-1)
{
}

MideaFile::~MideaFile()
{
	Close();
}

int MideaFile::Open(const ZBuffer& path, int nType)
{
	m_file = fopen(path, "rb");
	if (m_file == NULL) {
		//TODO 错误提示
		return -1;
	}
	m_type = nType;
	fseek(m_file, 0, SEEK_END);//移到尾部
	m_size = ftell(m_file);//获取尾部位置
	Reset();
	return 0;
}

ZBuffer MideaFile::ReadOneFrame()
{
	switch (m_type)
	{
	case 96:
		return ReadH264Frame();
		break;
	default:
		break;
	}
	return ZBuffer();
}

void MideaFile::Close()
{
	m_type = -1;
	if (m_file != NULL) {
		FILE* file = m_file;
		m_file = NULL;
		fclose(file);
	}
}

void MideaFile::Reset()
{
	if (m_file) {
		fseek(m_file, 0, SEEK_SET);
	}
}

long MideaFile::FindH264Head()
{
	while (!feof(m_file)) {
		char c = 0x7F;
		while (!feof(m_file)) {//是否到文件尾部
			c = fgetc(m_file);//一个字节一个字节移动
			if (c == 0)break;
		}
		if (!feof(m_file)) {
			c = fgetc(m_file);
			if (c == 0) {
				c = fgetc(m_file);
				if (c == 1) {//找到了一个头
					return ftell(m_file)-3;
				}
				else if (c == 0) {
					c = fgetc(m_file);
					if (c == 1) {//找到了一个头
						return ftell(m_file)-4;
					}
				}

			}
		}
	}
	return -1;
}

ZBuffer MideaFile::ReadH264Frame()
{
	if (m_file) {
		long off = FindH264Head();
		if (off == -1)return ZBuffer();
		fseek(m_file, off+3, SEEK_SET);
		long tail = FindH264Head();
		if (tail == -1) tail = m_size;
		long size = m_size - off;
		fseek(m_file, off + 3, SEEK_SET);
		ZBuffer result(size);
		fread(result, 1, size, m_file);
		return result;
	}
	return ZBuffer();
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

#A#

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值