• ios 视频知识补充---分解LFLiveKit


    视频:泛指将一系列的静态影像以电信号的方式捕捉、记录、处理、储存、传送、重现的各种技术。连续的静态图像变化每秒超过24帧(frame)以上时,由于视觉残留,人眼无法识别单独的静态图片,此时看上去就是平滑且连续的效果,这种连续的影像画面可以称之为视频。

    帧:视频是由一帧一帧的静态图片连续播放形成的,故一帧就是视频中一个静态的画面。(可以理解为由一张一张的图片,在视频范畴称为“帧”,图片称为“静态画面”)

    关键帧:也称之为 I 帧,是帧间压缩编码的最重要的帧。视频的编码是按照“组”进行的,每一个组叫"GOP(Group Of Picture,图像组)",而GOP与GOP之间没有联系,编码的关系只在一个GOP之间处理,关键帧是一幅完整的画面,GOP之间的帧都是不完整的,需要关键帧、前面帧、后面帧等一起运算得到。关键帧的间隔条件会影响到GOP的长度,继而影响到读取GOP的速度,如果关键帧间隔设置过大,在必须用到关键帧的场景就可能需要B/P帧来代替,这样会降低画面质量。关键帧是帧间压缩的基础,典型的GOP结构是 IBBPBBPBBPBBPBBPBB

    前后参考帧:也称之为 B 帧,参考前面、后面两帧的数据加上本帧的变化得到本帧的数据

    向前参考帧:也称之为 P 帧,如果 I 帧损坏,整个GOP就损坏了。即IBBPBBPBBPBBPBBPBB这么多帧一起坏掉,设置再长的时间间隔,编码出的数据也不稳定。

    拓展:

    I 帧是帧内压缩  而P、B帧是帧间压缩,以I帧为基础,预测P帧,以I、P帧为基础预测B帧,最后将I帧数据和预测的差值存储和传输。

    帧率:一秒内传输图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。

    FPS越高对显卡的性能要求越高,电脑中显示的图片都是有显卡输出的,屏幕上每个像素点的填充都是有显卡进行计算并输出的。假定一个图片分辨率1024x768,页面帧率设置24fps,那么显卡一秒内要处理的像素点为1024x768x24个。显卡处理能力=分辨率x帧率

    一般平均来说,I的压缩率是7(跟JPG差不多),P是20,B可以达到50,可见使用B帧能节省大量空间,节省出来的空间可以用来保存多一些I帧,这样在相同码率下,可以提供更好的画质。

     I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

    在H.264视频编码标准中,系统框架分为两个层面:VCL( 视频编码层面) 和 NAL(网络抽象层),前者表示视频数据内容,后者负责格式化数据并提供头信息,以保证数据适合在各种信道和存储介质上传输。每帧数据就是一个NAL单元(SPS和PPS除外),在实际的H264数据帧中,往往帧前面带有00 00 00 01 或 00 00 01分隔符,一般来说编码器编出的首帧数据为SPS与PPS,接着为I帧……

    NALU: 全称Network Abstract Layer Unit (网络抽象层单元),包含一个字节的头信息和一系列来自VCL称为原始字节序列的字节流(RBSP),H264在网络上传输的是NALU,NALU的结构:NAL头+RBSP

    SPS: H.264码流第一个 NALU是 SPS(序列参数集Sequence Parameter Set)

    SPS中保存了一组编码视频序列(Coded video sequence)的全局参数。所谓的编码视频序列即原始视频的一帧一帧的像素数据经过编码之后的结构组成的序列。而每一帧的编码后数据所依赖的参数保存于图像参数集中。一般情况SPS和PPS的NAL Unit通常位于整个码流的起始位置。但在某些特殊情况下,在码流中间也可能出现这两种结构,主要原因可能为:

    • 解码器需要在码流中间开始解码;
    • 编码器在编码的过程中改变了码流的参数(如图像分辨率等);

    在做视频播放器时,为了让后续的解码过程可以使用SPS中包含的参数,必须对其中的数据进行解析。

    PPS: H.264码流第二个 NALU是 PPS(图像参数集Picture Parameter Set)

    通常情况下,PPS类似于SPS,在H.264的裸码流中单独保存在一个NAL Unit中,只是PPS NAL Unit的nal_unit_type值为8;而在封装格式中,PPS通常与SPS一起,保存在视频文件的文件头中。

    IDR:  H.264码流第三个 NALU 是 IDR(即时解码器刷新)

    H2.64中I帧和IDR帧的区别
    I和IDR帧都是使用帧内预测的。它们都是同一个东西而已,在编码和解码中为了方便,要首个I帧和其他I帧区别开,所以才把第一个首个I帧叫IDR,这样就方便控制编码和解码流程。IDR帧的作用是立刻刷新,使错误不致传播,从IDR帧开始,重新算一个新的序列开始编码。而I帧不具有随机访问的能力,这个功能是由IDR承担,IDR会导致DPB(参考帧列表——这是关键所在)清空,而I不会。IDR图像一定是I图像,但I图像不一定是IDR图像。一个序列中可以有很多的I图像,I图像之后的图象可以引用I图像之间的图像做运动参考。对于IDR帧来说,在IDR帧之后的所有帧都不能引用任何IDR帧之前的帧的内容,与此相反,对于普通的I-帧来说,位于其之后的B-和P-帧可以引用位于普通I-帧之前的I-帧。从随机存取的视频流中,播放器永远可以从一个IDR帧播放,因为在它之后没有任何帧引用之前的帧。但是,不能在一个没有IDR帧的视频中从任意点开始播放,因为后面的帧总是会引用前面的帧。 (http://blog.csdn.net/leixiaohua1020/article/details/11800877)
     

    以上信息,各种百度。。。。。。

  • 相关阅读:
    PHP数组的升序降序函数
    overflow样式修改插件——jscrollpane
    li标签之间的空隙问题(转)
    纯CSS制作三角(转)
    图片放大插件——elevatezoom
    git常用命令笔记
    求数组子序列和最大值
    Vim快速入门
    C++求两个整数的最大公约数和最小公倍数
    实验楼-4-Linux文件权限
  • 原文地址:https://www.cnblogs.com/madaha/p/9713170.html
Copyright © 2020-2023  润新知