从一段264码流循环获取一个nalu的函数。

从一段264码流中循环获取一个nalu的函数,先用fopen把码流读入buf,码流总长度复制给bufLen.

//获取一个nalu的长度
int getNalu(unsigned char *buf, int bufLen)
{
	int i = 0;
	if (bufLen < 5 || (buf[i] != 0x00 && buf[i + 1] != 0x00 && buf[i + 2] != 0x00 && buf[i + 3] != 0x01))
	{
		return 0;
	}
	for (i = 5; i < bufLen - 9; i++)
	{
		if (buf[i] == 0x00 && buf[i + 1] == 0x00 && buf[i + 2] == 0x00 && buf[i + 3] == 0x01)
		{
			return i;
		}
	}
	return bufLen;
}

参数 buf 是一段264码流的指针(sps pps i p i p ...),

参数 bufLen是这段码流的总长度

返回值 是每次获取到nalu的长度,

使用方法:循环执行以下代码,返回0说明码流结束。

naluLen = getNalu(h264buf, h264len);

h264buf += naluLen;指针移动到下一个nalu头

h264len -= naluLen;总长度每次减小

naluLen不等于0 的时候, h264buf就是一个nalu分片指针,naluLen就是这个分片的长度。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
获取H.264码流的slice type,需要先解析码流NALU(Network Abstraction Layer Unit),然后从NALU获取slice header,从slice header读取slice type。以下是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define NALU_TYPE_SLICE 1 typedef struct { unsigned char *data; int size; } NALU; int find_start_code(unsigned char *buf, int buflen) { if (buflen < 3) { return -1; } if (buf[0] != 0 || buf[1] != 0) { return -1; } if (buf[2] == 1) { return 3; } if (buflen < 4) { return -1; } if (buf[2] == 0 && buf[3] == 1) { return 4; } return -1; } NALU *read_nalu(FILE *fp) { NALU *nalu = NULL; int startcode_len = 0; int pos = 0; int readlen = 0; unsigned char *buf = (unsigned char*)malloc(1024 * 1024); while (1) { int ch = fgetc(fp); if (ch == EOF) { break; } buf[pos++] = ch; if (pos >= 4) { startcode_len = find_start_code(buf, pos); if (startcode_len != -1) { break; } } if (pos >= 1024 * 1024) { fprintf(stderr, "NALU too large\n"); exit(1); } } if (pos == 0) { free(buf); return NULL; } nalu = (NALU*)malloc(sizeof(NALU)); nalu->size = pos - startcode_len; nalu->data = (unsigned char*)malloc(nalu->size); memcpy(nalu->data, buf + startcode_len, nalu->size); free(buf); return nalu; } int get_slice_type(NALU *nalu) { int slice_type = -1; unsigned char *data = nalu->data; int size = nalu->size; int pos = 0; if (size < 4) { return slice_type; } if ((data[pos] & 0x1f) == NALU_TYPE_SLICE) { pos += 1; slice_type = (data[pos] >> 1) & 0x7; } return slice_type; } int main(int argc, char **argv) { FILE *fp = fopen(argv[1], "rb"); NALU *nalu = NULL; while ((nalu = read_nalu(fp)) != NULL) { int slice_type = get_slice_type(nalu); printf("slice_type=%d\n", slice_type); free(nalu->data); free(nalu); } fclose(fp); return 0; } ``` 该示例代码实现了从H.264码流读取NALU,并从NALU获取slice type。具体步骤如下: 1. 定义NALU结构体,存储NALU数据和大小。 2. 实现find_start_code函数,用于在码流查找start code(0x000001或0x00000001)。 3. 实现read_nalu函数,用于从文件读取NALU。 4. 实现get_slice_type函数,用于从NALU读取slice type。 5. 在main函数循环读取NALU,并输出slice type。 注意,该示例代码只能读取单个NALU,如果码流包含多个NALU,则需要在read_nalu函数做相应的修改。此外,该示例代码没有处理码流的完整性和正确性,实际使用时需要进行相应的检查和处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值