H264数据结构

NAL  nal_unit_type中的

1(非IDR图像的编码条带)、

2(编码条带数据分割块A)、

3(编码条带数据分割块B)、

4(编码条带数据分割块C)、

5(IDR图像的编码条带)种类型
6(SEI)、

7(SPS)、

8(PPS)

Slice种的三种编码模式:I_slice、P_slice、B_slice

frame的3种类型:I frame、P frame、 B frame

一帧的数据可以分为多个slice(片)一个帧是可以分割成多个Slice来编码的,而一个Slice编码之后被打包进一个NAL单元,不过NAL单元除了容纳Slice编码的码流外,还可以容纳其他数据,比如序列参数集SPS:

       每个slice中的数据,在帧内预测只用到自己slice的数据, 与其他slice数据没有依赖关系。 
       NAL 是用来将编码的数据进行打包的。 比如,每一个slice 数据可以放在NAL 包中。
       I 帧是自己独立编码,不依赖于其他frame 数据。
       P frame 依赖 I frame 数据。 
       B frame 依赖 I frame, P frame 或其他 B frame 数据。

1、NAL、Slice与frame意思及相互关系 
NAL指网络提取层,里面放一些与网络相关的信息
Slice是片的意思,264中把图像分成一帧(frame)或两场(field),而帧又可以分成一个或几个片(Slilce);片由宏块(MB)组成。宏块是编码处理的基本单元。

2、VCL视频编码层不做解释。

3、NAL nal_unit_type为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)。表示后面的数据信息为序列参数集(SPS)、图像参数集(PPS)、增强信息(SEI)。

4、H.264的参数集又分为序列参数集(Sequence parameter set)和图像参数集(Pictureparameterset)。

        序列参数集:包括一个图像序列的所有信息,即两个IDR图像间的所有图像信息。

        图像参数集:包括一个图像的所有分片的所有相关信息,包括图像类型、序列号等,解码时某些序列号的丢 失可用来检验信息包的丢失与否。多个不同的序列和图像参数集存储在解码器中,编码器依据每个编码分片的头部的存储位置来选择适当的参数集,图像参数集本身也包括使用的序列参数集参考信息。  

总结:

NAL单元中首先会有一个H.264 NAL type,根据这个可以判断是啥信息。如果是
H264NT_SLICE_DPA,H264NT_SLICE_DPB,H264NT_SLICE_DPC,H264NT_SLICE_IDR视频数据相关的,里面还会有Slicehead头信息,根据这个头信息,可以判断属于I-Slice(P-Slice或B-Slice),之后对于每个宏块,都会有MB head信息,根据宏块头信息可以判断块模式。

时间: 2024-11-10 11:19:18

H264数据结构的相关文章

TS视频一

ts文件 ts文件为传输流文件,视频编码主要格式h264/mpeg4,音频为acc/MP3. ts文件分为三层:ts层Transport Stream.pes层 Packet Elemental Stream.es层 Elementary Stream. es层就是音视频数据,pes层是在音视频数据上加了时间戳等对数据帧的说明信息,ts层就是在pes层加入数据流的识别和传输必须的信息 (1)ts层     ts包大小固定为188字节,ts层分为三个部分:ts header.adaptation

iOS8系统H264视频硬件编解码说明

文章-原址 公司项目原因,接触了一下视频流H264的编解码知识,之前项目使用的是FFMpeg多媒体库,利用CPU做视频的编码和解码,俗称为软编软解.该方法比较通用,但是占用CPU资源,编解码效率不高.一般系统都会提供GPU或者专用处理器来对视频流进行编解码,也就是硬件编码和解码,简称为硬编解码.苹果在iOS 8.0系统之前,没有开放系统的硬件编码解码功能,不过Mac OS系统一直有,被称为Video ToolBox的框架来处理硬件的编码和解码,终于在iOS 8.0后,苹果将该框架引入iOS系统.

FFmpeg解码H264及swscale缩放详解

本文概要: 本文介绍著名开源音视频编解码库ffmpeg如何解码h264码流,比较详细阐述了其h264码流输入过程,解码原理,解码过程.同时,大部分应用环境下,以原始码流视频大小展示并不是最佳方式,因此,开发者不仅仅需要对视频流解码,并且需要缩放图像以展示于不同窗体下. 综上,本文除介绍ffmpeg解码h264,同时阐述如何使用swscale缩放视频流. 文章使用的开发环境Ubuntu12.04..交流邮箱:[email protected]. 转载请注明出处 CSDN--固本培元. ffmpeg

利用FFmpge进行视频压缩(从图像到H264视频流)

对于FFmpeg相信做视频或图像处理这一块的都不会陌生,在网上也能找到很多相关的代码,但由于版本不同等原因,往往找到的代码都是需要自行修改才可以用,为此本人希望能尽绵薄之力,将开发包和自行编写的代码都放出来,如果初学者想要可以直接运行的代码做参考的话,可以下载我放出的FFmpeg开发包进行配置(配置的教程地址如下:点击打开链接),然后参考我写的编解码代码来进行程序的开发. 下面贴出的是我自己封装的FFmpeg视频压缩代码,如有更好的建议请告诉我,转载请注明出处. 首先我们设计一个视频压缩相关的类

利用FFmpge进行视频解码(从H264视频流到图像)

同上面所写的两篇文章,本篇依然是介绍FFmpge的相关操作,前一篇讲的是视频压缩,本篇则相反的讲视频的解码.废话不多说,直接上代码吧. 同理于上篇,本篇先设计一个视频解码相关的类,定义如下: class Ffmpeg_Decoder { public: AVCodecParserContext *avParserContext; AVPacket avpkt; //数据包结构体 AVFrame *m_pRGBFrame; //帧对象 AVFrame *m_pYUVFrame; //帧对象 AVC

GB28181技术基础之2 - H264与PS封包

二. PS封包 PS 是 GB28181 规定的标准封包格式(也是存储格式),在讲 PS 之前,先介绍几种相关的 数据格式概念: 1)ES 基本流 (Elementary Streams)是直接从编码器出来的数据流,也成为净荷数据.ES是编码后的视频流(比如H.264),音频数据流(如AAC),和其他编码数据流的统称. ES是只包含一种内容的数据流(比如纯粹的视频或音频),每个ES都由若干个存取单元(AU)组成,每个视频AU或音频AU都是由头部和编码数据两部分组成,1个AU相当于编码的1幅视频图

iOS-VideoToolbox硬编码H264

前言 VideoToolBox是iOS8之后,苹果开发的用于硬解码编码H264/H265(iOS11以后支持)的API. 对于H264还不了解的童鞋一定要先看下这边的H264的简介. 编码流程 我们实现一个简单的Demo,从摄像头获取到视频数据,然后再编码成H264裸数据保存在沙盒中. 1. 创建初始化VideoToolBox 核心代码如下 - (void)initVideoToolBox { dispatch_sync(encodeQueue , ^{ frameNO = 0; int wid

【数据结构】之散列链表(Java语言描述)

散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为"散列链表"?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的是一个数组: transient Node<K,V>[] table; ,数组中的每个元素都是一个 Node 对象.这里的Node是HashMap的一个内部类,代码如下: static class Node<K,V> implements Map.Entry<

旧题新做:从idy的视角看数据结构

“今天你不写总结……!!!” 额…… 还是讲我的吧.这些考试都是idy出的题. 20170121:DFS序. ST表.线段树练习 这是第一次考数据结构. Problem 1. setsum 1 second 给你一个长度为N 的整数序列,支持两种操作: • modity l r val 将区间[l,r] 中的所有数修改为val • query l r 询问区间[l,r] 所有数的和 分析:最简单的线段树,区间更改区间求和.但注意是更改,不是添改,sum与flag需同时覆盖. Problem 2.