RTMP


GOP (通常是 2倍的帧率, 2s左右)

GOP说白了就是两个I帧之间的间隔.比较说GOP为120,如果是720p60的话,那就是2s一次I帧.


IDR帧是I帧,但I帧不一定是IDR帧,比如在编码的时候设置GOP为30,那么就是说30帧图像有一个I帧,这样60帧就有2个I帧,但是60帧只有1个IDR帧。

宏块


一个NAL单元就是一个Slice(片),而一帧不一定就是一个NAL单元,一帧里面可能会有多个NAL单元(多个片)。

  • GOP:一段时间内图像变化不大的图像集我们就可以称之为一个序列,这里的图像又在H264里面称为帧,所以就是一组视频帧,其中第一个我们称为是IDR帧。
  • 帧:一副图像编码后的视频数据也叫做一帧,其中有I帧、B帧、P帧
  • 片:一帧图像又可以划分为很多片,由一个片或者多个片组成(这里视频帧被划分为一个片或者多个片,片数据主要就是通过NLAU进行传输);
  • 宏块:视频编码的最小处理单元,承载了视频的具体YUV信息,一片由一个或者多个宏块组成;

所以视频流分析的对象可以用下面的图片描述:

  1. 将图像分割成若干个16*16个像素(不一定, 可能是 16 * 8, 可能是 8 * 8)的块, 每个块就叫做宏块

  2. 每个宏块的压缩(记录第一行像素的颜色和第一列像素的颜色, 然后记录渐变色的角度, 渐变重点的颜色, 帧内压缩).

  3. 帧预测(2 , 2 , 2 , 7 , 2 , 2 , 2 , 2 , 2 , 13. 我们也可以用下面的方式来表示:prediction = 2;Difference = { (5, 3), (11, 9) };(都是2, 低三个和第9个不同, 差值是5和11)

  4. 宏块越大, 最终压缩后生成的视频就越小(h.265的宏块比h.264的宏块大, 但是画面细腻的地方, 宏块更小).

  5. 视频的播放本质就是宏块的运动 (宏块运动的方向形成了运动矢量). 视频播放时候(下一帧会删除重复的宏块, 用运动矢量代替, 差异信息用宏块编码)

  6. h.264编码: 当与I帧的相似程度 > 95%, 编码成B帧, 相似程度 > 70%, 编码成P帧,

    第四帧图像相似程度 > 70%, 编码成P帧.

此时, 在码流中, 第一帧是画面1, 第二帧是画面4, 第三帧是画面2, 第四帧是画面3.(第一帧一定是I帧, 第二帧一定是P帧, 一定是先编码I帧, 然后编码P这帧, 然后根据I帧和P帧, 编码B帧, DTS(解码顺序) : 画面1, 画面4, 画面2, 画面3, PTS:(播放顺序), 画面1, 画面2, 画面3, 画面4)

NALU

NALU结构分为两层,包含了视频编码层(VCL)和网络适配层(NAL):

  1. 视频编码层(VCL即Video Coding Layer):负责高效的视频内容表示,这是核心算法引擎,其中对宏块、片的处理都包含在这个层级上,它输出的数据是SODB;
  2. 网络适配层(NAL即Network Abstraction Layer):以网络所要求的恰当方式对数据进行打包和发送,比较简单,先报VCL吐出来的数据SODB进行字节对齐,形成RBSP,最后再RBSP数据前面加上NAL头则组成一个NALU单元。

分层目的:

  1. 这样做的目的:VCL只负责视频的信号处理,包含压缩,量化等处理,NAL解决编码后数据的网络传输,这样可以将VCL和NAL的处理放到不同平台来处理,可以减少因为网络环境不同对VCL的比特流进行重构和重编码;


其实NALU的承载数据真实并不是RBSP而是EBSP即(Extent Byte Sequence Payload),EBSP和RBSP的区别就是在 RBSP里面加入防伪起始码字节(0x03),因为H.264规范规定,编码器吐出来的数据需要在每个NALU添加起始码:0x00 00 01或者0x00 00 00 01,用来指示一个NALU的起始和终止位置,那么RBSP数据内部是有可能含有这种字节序列的,为了防止解析错误,所以在RBSP数据流里面碰到0x 00 00 00 01的0x01前面就会加上0x03,解码时将NALU的EBSP中的0x03去掉成为RBSP,称为脱壳操作。

case LFLiveVideoQuality_Low1:{configuration.sessionPreset = LFCaptureSessionPreset360x640;configuration.videoFrameRate = 15;configuration.videoMaxFrameRate = 15;configuration.videoMinFrameRate = 10;configuration.videoBitRate = 500 * 1000;configuration.videoMaxBitRate = 600 * 1000;configuration.videoMinBitRate = 400 * 1000;configuration.videoSize = CGSizeMake(360, 640);}break;case LFLiveVideoQuality_Low2:{configuration.sessionPreset = LFCaptureSessionPreset360x640;configuration.videoFrameRate = 24;configuration.videoMaxFrameRate = 24;configuration.videoMinFrameRate = 12;configuration.videoBitRate = 600 * 1000;configuration.videoMaxBitRate = 720 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(360, 640);}break;case LFLiveVideoQuality_Low3: {configuration.sessionPreset = LFCaptureSessionPreset360x640;configuration.videoFrameRate = 30;configuration.videoMaxFrameRate = 30;configuration.videoMinFrameRate = 15;configuration.videoBitRate = 800 * 1000;configuration.videoMaxBitRate = 960 * 1000;configuration.videoMinBitRate = 600 * 1000;configuration.videoSize = CGSizeMake(360, 640);}break;case LFLiveVideoQuality_Medium1:{configuration.sessionPreset = LFCaptureSessionPreset540x960;configuration.videoFrameRate = 15;configuration.videoMaxFrameRate = 15;configuration.videoMinFrameRate = 10;configuration.videoBitRate = 800 * 1000;configuration.videoMaxBitRate = 960 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(540, 960);}break;case LFLiveVideoQuality_Medium2:{configuration.sessionPreset = LFCaptureSessionPreset540x960;configuration.videoFrameRate = 24;configuration.videoMaxFrameRate = 24;configuration.videoMinFrameRate = 12;configuration.videoBitRate = 800 * 1000;configuration.videoMaxBitRate = 960 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(540, 960);}break;case LFLiveVideoQuality_Medium3:{configuration.sessionPreset = LFCaptureSessionPreset540x960;configuration.videoFrameRate = 30;configuration.videoMaxFrameRate = 30;configuration.videoMinFrameRate = 15;configuration.videoBitRate = 1000 * 1000;configuration.videoMaxBitRate = 1200 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(540, 960);}break;case LFLiveVideoQuality_High1:{configuration.sessionPreset = LFCaptureSessionPreset720x1280;configuration.videoFrameRate = 15;configuration.videoMaxFrameRate = 15;configuration.videoMinFrameRate = 10;configuration.videoBitRate = 1000 * 1000;configuration.videoMaxBitRate = 1200 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(720, 1280);}break;case LFLiveVideoQuality_High2:{configuration.sessionPreset = LFCaptureSessionPreset720x1280;configuration.videoFrameRate = 24;configuration.videoMaxFrameRate = 24;configuration.videoMinFrameRate = 12;configuration.videoBitRate = 1200 * 1000;configuration.videoMaxBitRate = 1440 * 1000;configuration.videoMinBitRate = 800 * 1000;configuration.videoSize = CGSizeMake(720, 1280);}break;case LFLiveVideoQuality_High3:{configuration.sessionPreset = LFCaptureSessionPreset720x1280;configuration.videoFrameRate = 30;configuration.videoMaxFrameRate = 30;configuration.videoMinFrameRate = 15;configuration.videoBitRate = 1200 * 1000;configuration.videoMaxBitRate = 1440 * 1000;configuration.videoMinBitRate = 500 * 1000;configuration.videoSize = CGSizeMake(720, 1280);}case LFLiveAudioQuality_Low: {audioConfig.audioBitrate = audioConfig.numberOfChannels == 1 ? LFLiveAudioBitRate_32Kbps : LFLiveAudioBitRate_64Kbps;audioConfig.audioSampleRate = LFLiveAudioSampleRate_16000Hz;}break;case LFLiveAudioQuality_Medium: {audioConfig.audioBitrate = LFLiveAudioBitRate_96Kbps;audioConfig.audioSampleRate = LFLiveAudioSampleRate_44100Hz;}break;case LFLiveAudioQuality_High: {audioConfig.audioBitrate = LFLiveAudioBitRate_128Kbps;audioConfig.audioSampleRate = LFLiveAudioSampleRate_44100Hz;}break;case LFLiveAudioQuality_VeryHigh: {audioConfig.audioBitrate = LFLiveAudioBitRate_128Kbps;audioConfig.audioSampleRate = LFLiveAudioSampleRate_48000Hz;}
  1. 视频到放的原理(重新编码成新的视频, 从后往前, 每一个I帧与后边的帧正着解码, 然后生成的每个帧倒着编码)

采样频率

  • 每秒进行多少次取样

位深

  • 用多少位去表示每个采样的结果的数值

SPS PPS

  • SPS又称作序列参数集。SPS中保存了一组编码视频序列的全局参数。包含了profile、level、宽高和颜色空间等信息。
  • PPS是图像参数集。每一帧的编码后数据所依赖的参数保存于图像参数集中。
  • P帧以前的一个I帧或P帧为参考帧,
  • B帧以前面的I或P帧和后面的P帧为参考帧,
  • 一个序列的第一个图像叫做 IDR 图像(立即刷新图像),IDR 图像都是 I 帧图像。H.264 引入 IDR 图像是为了解码的重同步,当解码器解码到 IDR 图像时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现重大错误,在这里可以获得重新同步的机会。IDR图像之后的图像永远不会使用IDR之前的图像的数据来解码。一个序列就是一段内容差异不太大的图像编码后生成的一串数据流。当运动变化比较少时,一个序列可以很长,因为运动变化少就代表图像画面的内容变动很小,所以就可以编一个I帧,然后一直P帧、B帧了。当运动变化多时,可能一个序列就比较短了,比如就包含一个I帧和3、4个P帧。

RTMP FLV H.264 NALU GOP相关推荐

  1. h.264 NALU详细分析2

    承接上集 h.264 NALU详细分析1_杀神李的博客-CSDN博客 上集我们已经讲到了帧是由一个或者多个NALU组成 并且NALU除了存储帧的信息外 还会存储一些其他的信息 比如 SEI SPS P ...

  2. H.264 NALU分隔Annex B和avcC

    文章目录 分隔格式 Annex B avcC 编解码器的输入输出分隔符类型 分隔格式 H.264常用的分隔方式有Annex B和avcC Annex B 这种分隔符通常用于视频会议还有文件存储例如TS ...

  3. RTMP推流H.264

    t通过对以下内容的学习完成H.264的推流 1.H.264格式分析 https://time.geekbang.org/column/article/461658 2.FLV格式分析 https:// ...

  4. H.264视频RTP负载格式/NALU的类型

    1. 网络抽象层单元类型(NALU) NALU 头由一个字节组成, 它的语法如下:       +===============+       |0|1|2|3|4|5|6|7|       +=+= ...

  5. H.264的NALU,RTP封包说明(转自牛人)

    H.264 RTP payload 格式 H.264 视频 RTP 负载格式 1. 网络抽象层单元类型 (NALU) NALU 头由一个字节组成, 它的语法如下: +---------------+ ...

  6. H.264基础知识及视频码流解析

    H.264基础知识及视频码流解析 目录 H.264概述 H264相关概念 H264压缩方式 H264分层结构 H264码流结构 H264的NAL单元 H.264视频码流解析及代码实现 1. H.264 ...

  7. 音视频编解码技术(一):MPEG-4/H.264 AVC 编解码标准

    一.H264 概述 H.264,通常也被称之为H.264/AVC(或者H.264/MPEG-4 AVC或MPEG-4/H.264 AVC) 1. H.264视频编解码的意义 H.264的出现就是为了创 ...

  8. 音视频系列2:ffmpeg将H.264解码为RGB

    音视频系列2:ffmpeg将H.264解码为RGB 前言 源码 前言 喜大普奔,终于更新啦,上期说到,如何使用ffmpeg+rtmp进行拉流,不熟悉的小伙伴们,可以先看上一期.今天我们要实现的是使用f ...

  9. H.264和H.265

    一.H.264 1.H.264简介 H.264是MPEG-4第十部分(高级视频编码AVC(Advanced Video Coding)),是一个高度压缩数字视频编解码器标准.. H264标准各主要部分 ...

最新文章

  1. jquery学习——选择器
  2. 废粉盒在哪里_很想知道打印机废粉盒中的那些废碳粉应该怎么处理?
  3. Android onLoadFinished与onLoaderReset
  4. 平方变换法提取载波MATLAB,毕业设计(论文)MPSK信号的载波同步算法研究与仿真.doc...
  5. 具体描述GGI和API技术的特点并比较它们优劣势
  6. HDOJ---3790 最短路径问题[Dijkstra算法||SPFA]
  7. Redis详细安装教程与启动redis
  8. [转]coolfire黑客入门教程系列之(四)
  9. Java SE Java EE和Java ME的区别
  10. 公司发展历程企业项目进度大事记时间轴PPT模板
  11. 黄河中下游地区精化似大地水准面研究与实施
  12. 揭开人创造思维之谜:浴缸和床最易引发灵感
  13. 英文状态下输入字母,字母之间的间隔较大怎么解决?
  14. 在C语言二级考试中编程题编译,二级C语言上机编程题
  15. 定时自动关闭程序、打开网页和隐藏任务计划
  16. Ix Chariot测试路由器流程
  17. 第四章 权限提升分析及防御
  18. 四、微信小程序之简单计算器(学习记录)
  19. shade学习过程2——shader和渲染管线
  20. 影视剪辑,视频剪辑流程,如何进行混剪

热门文章

  1. 7.18洪资内参(更新中)
  2. 4.2 路由系列:软路由物理机安装openwrt 小白教程(esir高大全)
  3. linux输入命令怎么显示时间戳,linux时间戳查看:stat命令
  4. 简单音乐铃声(接口版)
  5. destoon框架合成图片文字生成准考证-php--有用请拿走~~~
  6. go每日新闻(2021-06-03)——Go 重构和转换工具
  7. 两种方式对boss直聘招聘岗位的爬取
  8. CGAL WLOP(加权局部最优投影)简化算法
  9. 私网地址与Internet地址
  10. 微信小程序的页面隐藏