Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >关于264中的startcode

关于264中的startcode

作者头像
lcyw
发布于 2022-06-10 11:37:26
发布于 2022-06-10 11:37:26
39800
代码可运行
举报
文章被收录于专栏:machh的专栏machh的专栏
运行总次数:0
代码可运行

startcode的两种形式

3字节的0x000001和4字节的0x00000001

引用一段H264标准(Annex B)的说明:

x264 uses 3 byte start codes where the spec says those start codes can be used. 4 byte start codes must be used at the start of SPS, PPS, and in the first NAL of a frame.

leading_zero_8bits is a byte equal to 0x00.

NOTE – The leading_zero_8bits syntax element can only be present in the first byte stream NAL unit of the bitstream, because(as shown in the syntax diagram of subclause B.1.1) any bytes equal to 0x00 that follow a NAL unit syntax structure and precede the four-byte sequence 0x00000001 (which is to be interpreted as a zero_byte followed by a start_code_prefix_one_3bytes) will be considered to be trailing_zero_8bits syntax elements that are part of the preceding byte stream NAL unit.

为什么需要startcode

主要是为了将相邻两个NALU划分开,让他们有一个界线,方便解码,比如将h264的数据存储在一个文件当中,解码器无法从数据流中分别每个NALU的起始位置。

在编码时,每个NALU前面添加startcode(占4字节0x00000001或者3字节0x000001),这里有人会想到万一中间出现0x000001怎么办呢,h264有个防止竞争的机制,在编码完一个NAL时,如果出现有连续两个0x00字节,就在后面插入一个0x03(解码的时候这个0x03会被丢弃)。

起始部分占4字节还是3字节?

实际上startcode只占3字节,4字节的起始部分 = zero_byte + start_code_prefix_one_3bytes,就是说无论啥时候其实startcode都是3字节,关键就在于zero_byte。

  1. 包含sps,pps的NALU前面要加zero_byte(4字节)。
  2. 当一帧被分为多个slice时,首个NALU前面要加zero_byte(4字节)参见7.4.1.2.3。也就是,当一个完整的帧被编为多个slice的时候,除掉第一个NALU,剩下的都用3字节的,其余的都是4字节。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
      SPS4字节头)
      PPS4字节头)
      SEI4字节头)
      I0(slice0)4字节头)
      I0(slice1)3字节头)
      P1(slice0)4字节头)
      P1(slice1)3字节头)
      P2(slice0)4字节头)
      P2(slice1)3字节头)

I0(slice0)是序列第一帧(I帧)的第一个slice,是当前Access Unit的首个nalu,所以是4字节头。

而I0(slice1)表示第一帧的第二个slice,所以是3字节头。

P1(slice0) 、P1(slice1)同理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 音视频开发训练营 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
音视频八股文(8)-- h264 AnnexB
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
福大大架构师每日一题
2023/06/09
6360
音视频八股文(8)-- h264 AnnexB
H264和H265的nalu介绍
本篇介绍下H264和H264的编码格式,包括avcc,annexb,以及转换方法。annexb 用于实时流的场景,avcc用于多媒体文件,如mp4,mkv等场景。
一只小虾米
2022/10/25
2.8K0
H264和H265的nalu介绍
AVCC/HVCC 与 Annexb 码流格式相互转换丨音视频工业实战
H.264 的码流中用于解码的关键信息包括 SPS、PPS,H.265 码流中则包括 VPS、SPS 和 PPS。H.264 码流有 AVCC 和 AnnexB 两种格式,H.265 码流则对应的有 HVCC 和 AnnexB 两种格式。通常工程实践中对 MP4 进行解码时默认是使用 AVCC、HVCC 码流格式,但由于 Android 平台的解码器通常仅支持 AnnexB 格式,这时候就需要对码流格式做一下转换。我们这篇文章里就来介绍一下如何用代码实现 AVCC/HVCC 与 AnnexB 码流格式的相互转换。
关键帧
2023/10/22
2K0
AVCC/HVCC 与 Annexb 码流格式相互转换丨音视频工业实战
音视频基础(3):h264码流结构
H.264,同时也是MPEG-4第十部分,是由ITU-T视频编码专家组(VCEG)和ISO/IEC动态图像专家组(MPEG)联合组成的联合视频组(JVT,Joint Video Team)提出的高度压缩数字视频编解码器标准。这个标准通常被称之为H.264/AVC(或者AVC/H.264或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC)而明确的说明它两方面的开发者。
用户6280468
2022/11/28
1.1K0
音视频基础(3):h264码流结构
H.264编码格式简单分析
  H.264的重要性不再提了。本文主要记录一下H.264的编码格式。H.264官方文档:https://github.com/jiayayao/DataSheet/tree/master/encode-decode/h264。
望天
2019/07/11
2K0
H.264编码格式简单分析
H264之NALU解析
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称 为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC:
用户6280468
2022/03/21
2.3K0
H264之NALU解析
h264解码器基础学习(1)
相信很多人和我一样,刚开始的时候都会很好奇,为什么h264可以实现这么强大的压缩比,要知道,1张1080p的YUV420就是3MB,想实现1秒钟30帧,千兆网就基本跑满了,这也太可怕了,基本上只有条件很好的局域网才能达到这个水平。但是h264的出现把这个数据量降到了百分之一,2个数量级,这实在太可怕了,技术的发展真的是强大。
用户6280468
2023/09/12
6950
h264解码器基础学习(1)
嵌入式音视频开发面试过程遇到的问题!
开启一个线程进行解封装操作 , 这包括:读取音频、视频的压缩数据,并进行区分。若视频数据则插入视频队列,音频数据则插入音频队列。
用户6280468
2023/08/31
2640
嵌入式音视频开发面试过程遇到的问题!
H264码流分析导读
H.264的功能分为两层:视频编码层(VCL, Video Coding Layer)和网络提取层(NAL, Network Abstraction Layer) VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。在VCL数据传输或存储之前,这些编码的VCL数据,先被映射或封装进NAL单元中。每个NAL单元包括一个原始字节序列负荷(RBSP, Raw Byte Sequence Payload)、一组对应于视频编码的NAL头信息。RBSP的基本结构是:在原始编码数据的后面填加了结尾比特。一个bit“1”若干比特“0”,以便字节对齐。
deep_sadness
2018/08/30
2.1K0
H264码流分析导读
H.264中NALU、RBSP、SODB的关系
SODB: 数据比特串-->最原始的编码数据( 长度不一定是8的倍数,故需要补齐)
lcyw
2022/06/10
1.1K0
音视频基础:H264 各种概念
温故而知新,然后发现H264好多流程以前还是不太熟悉。后续会用对比的方式学习H265。
字节流动
2021/12/20
2K0
音视频基础:H264 各种概念
音视频八股文(8)-- h264 AnnexB
H.264从1999年开始,到2003年形成草案,最后在2007年定稿有待核实。在ITU的标准⾥称为H.264,在MPEG的标准⾥是MPEG-4的⼀个组成部分–MPEG-4 Part 10,⼜叫Advanced Video Codec,因此常常称为MPEG-4 AVC或直接叫AVC。
福大大架构师每日一题
2023/04/28
5500
H.264编码及AAC编码基础
本节重点讲解了 H.264 编码以及 AAC 编码,在对其进行讲解前先介绍了视频编码的实现原理。
Gnep@97
2023/09/10
1.2K0
H.264编码及AAC编码基础
H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
首先要理解的是没有标准的H.264基本流格式。文档中的确包含了一个Annex,特别是描述了一种可能的格式Annex B格式,但是这个并不是一个必须要求的格式。标准文档中指定了视频怎样编码成独立的包,但是这些包是怎样存储和传输的却是开放的。
用户6280468
2023/08/31
1.2K0
H.264流媒体协议格式中的Annex B格式和AVCC格式深度解析
从零实现一个h264解码器(一)
大家好,今天给大家分享一个系列文章,是关于h264解码器的,实战性比较多,文章里面就不会过多介绍关于h264的相关基础知识了。
用户6280468
2022/03/21
9880
从零实现一个h264解码器(一)
从0开始做播放器---编解码基础知识
注:参考自bilibili系列视频,从0开始做播放器-第6章-图像编码的基础概念(理论课)https://www.bilibili.com/video/BV1PK41157jz
瑶瑶
2020/06/03
1.3K0
音视频开发之旅(56) -H264/AVC基本结构
音视频编码的标准由标准发展组织制定,主要两大组织:ISO(国际标准化组织和国际电工委员会)和ITU-T(国际电信联盟的电信标准化部门)
音视频开发之旅
2021/09/04
1K0
H.264 媒体流 AnnexB 和 AVCC 格式分析 及 FFmpeg 解析mp4的H.264码流方法
来源:https://blog.csdn.net/shaosunrise/article/details/121548065
音视频开发进阶
2022/10/31
2.3K0
最近做RTSP流媒体的实时广播节目
//h264视频流打包代码 // NALDecoder.cpp : Defines the entry point for the console application. #include <stdio.h> #include <stdlib.h> #include <string.h> #include <memory.h> #include “h264.h” #include “initsock.h” CInitSock initSock;  // 初始化Winsock库 //为NALU_t结构体分配内存空间 NALU_t *AllocNALU(int buffersize) {  NALU_t *pNalu;  if ((pNalu = (NALU_t*)calloc (1, sizeof (NALU_t))) == NULL) {   printf(“AllocNALU: Nalu”);   exit(0);  }  pNalu->max_size=buffersize;  if ((pNalu->buf = (char*)calloc (buffersize, sizeof (char))) == NULL) {   free (pNalu);   printf (“AllocNALU: Nalu->buf”);   exit(0);  }  return pNalu; } //释放 void FreeNALU(NALU_t *pNalu) {  if (pNalu) {   if (pNalu->buf) {    free(pNalu->buf);    pNalu->buf=NULL;   }   free (pNalu);  } } static int FindStartCode2 (unsigned char *Buf) {  if(Buf[0]!=0 Buf[1]!=0 Buf[2] !=1) return 0; //推断是否为0x000001,假设是返回1  else return 1; } static int FindStartCode3 (unsigned char *Buf) {  if(Buf[0]!=0 Buf[1]!=0 Buf[2] !=0 Buf[3] !=1) return 0;//推断是否为0x00000001,假设是返回1  else return 1; } // 这个函数输入为一个NAL结构体。主要功能为得到一个完整的NALU并保存在NALU_t的buf中,获取他的长度。填充F,IDC,TYPE位。 // 而且返回两个開始字符之间间隔的字节数,即包括有前缀的NALU的长度 int GetAnnexbNALU (NALU_t *pNalu, FILE *bits) {  int info2=0, info3=0;  int pos = 0;  int StartCodeFound, rewind;  unsigned char *Buf;  if ((Buf = (unsigned char*)calloc (pNalu->max_size , sizeof(char))) == NULL)   printf (“GetAnnexbNALU: Could not allocate Buf memory\n”);  if (3 != fread (Buf, 1, 3, bits)) {  //从码流中读3个字节   free(Buf);   return -1;     }  if (Buf[0]!=0 Buf[1]!=0) {   free(Buf);   return -1;  }  if (Buf[2]==1) {   pNalu->startcodeprefix_len=3;   //初始化码流序列的開始字符为3个字节   pos =3;  }else {   if (1 != fread (Buf+3, 1, 1, bits)) {  //从码流中读1个字节    free(Buf);    return -1;   }   if (Buf[2]!=0 Buf[3]!=1) {    free(Buf);    return -1;   }   pos = 4;   pNalu->startcodeprefix_len = 4;  }  //查找下一个開始字符的标志位  StartCodeFound = 0;  info2 = 0;  info3 = 0;     while (!StartCodeFound)  {   if (feof (bits)) { //推断是否到了文件尾    break;   }   Buf[pos++] = fgetc (bits);//读一个字节到BUF中   info3 = FindStartCod
全栈程序员站长
2022/07/06
3890
【音视频】H264编码基础
视频是由一帧帧图像组成,视频为了不卡顿,一秒钟至少要16帧画面,但是图片内容太大,传输不现实。因此需要对他们编码。
后端码匠
2022/12/05
1.4K0
【音视频】H264编码基础
相关推荐
音视频八股文(8)-- h264 AnnexB
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档