美文网首页
RTMP&&H264

RTMP&&H264

作者: RedHatMe | 来源:发表于2019-07-12 22:07 被阅读0次

    基础知识

    RTMP协议是一个互联网TCP/IP五层体系结构中应用层的协议。就是工作于传输层(TCP)之上的协议。

    和telnet,ftp之类的协议工作是类似的。

    因为是应用层协议。所以只是在包的解包和封包 之间不断的在做处理。

    举个例子,TCP是不断的通过各种机制 来保证丢包重传。拥塞控制等。

    那么RTMP 就是专门控制播放推流的手段。比如定义各种Message。定义各种Chunk。来保证传输视频场景的通用性要求。

    仅仅是定义协议嘛。

    并不包括H264编码|ACC编码等东西。这些都是额外的。 不是定义在RTMP的规范之内的。

    所以现在应该可以很好的理解下面这张图。

    image

    RTMP里面有几个重要的概念:

    1.Message

    2.Chunk

    message 与chunk 之间的关系如下。

    [图片上传失败...(image-7ebbb6-1562940425899)]

    Message 是rtmp里面具象的东西。比如客户端和服务端之间传的控制消息。音视频消息。

    Chunk 是Message可以打包放进去的地方。就是更底层了。

    比如一个大的Message拆成几个。放在小的Chunk传输。每个Message 有一个ID独立标志。

    而Chunk可以分成更小的Chunk去传输。每个Chunk 有一个Chunk ID去标志。所以分成更小的Chunk 也不影响。

    实际中message与trunk的关系

    在一条TCP 连接中,可以同时包含着几条Message Stream,绝大部分情况下是Control Msg Stream 和Media Msg Stream。而这些Msg Stream 由一段一段的Chunk Stream 组成,每个Chunk Stream 都带有一个Message Stream ID 以标识这个Chunk Stream 是属于哪一个Msg Stream。由于Chunk Stream 所包含的数据比较大,常常又被切分成更小的Chunk,每个Chunk 都带有一个Chunk Stream ID 以标识它属于哪一个Chunk Stream。

    message 内容

    上面说了message 是很具体的东西。如果是音视频数据的话。那么格式可能有多种。比如flv。比如mp4。这个是音视频的封装格式。这种封装又是在原始的IPB帧进行编码压缩之后。再封的。

    head 指的是flv 头而不是rtmp 头。如果非要解析这个数据包的话必须结合flv 头格式进行解析。还有注意一点,flv头中的时间戳都是绝对时间戳,和rtmp 流的时间戳不是一个体系的。

    H.264 编码

    H264编码 就是将原始的yuv像素点 通过编码 转换成IPB帧的形式。

    1帧 = n个片
    1片 = n个宏块
    1宏块 = 16x16yuv数据

    一个宏块 = 一个16*16的亮度像素 + 一个8×8Cb + 一个8×8Cr彩色像素块组成。(YCbCr 是属于 YUV 家族的一员,在YCbCr 中 Y 是指亮度分量,Cb 指蓝色色度分量,而 Cr 指红色色度分量)

    1.

    H.264编码框架分两层:

     VCL(Video Coding Layer):负责高效的视频内容表示;包括 帧内预测 和 帧间预测 以及量化。
    
     NAL(Network Abstraction Layer):负责以网络所要求的恰当的方式对数据进行打包和传送;
    
    image

    2.

    原始的一帧图片 经过H.264 编码以后会变成 切片Slice。这些切片会装载进一个叫NALU的单元进行网络传输。

    而片的主要作用是用作宏块(Macroblock)的载体。最多时每片包 整个图像的宏块。片都是单独传输的,单独进行片内偏见预测的。

    image image image image

    对于切片(Slice)来说。分为 I片。P片。B片等。

    I片:只包 I宏块,I 宏块利用从当前片中已解码的像素作为参考进行帧内预测(不能取其它片中的已解码像素作为参考进行帧内预测)。

    P片:可包 P和I宏块,P 宏块利用前面已编码图象作为参考图象进行帧内预测,一个帧内编码的宏块可进一步作宏块的分割:即 16×16、16×8、8×16 或 8×8 亮度像素块(以及附带的彩色像素);如果选了 8×8 的子宏块,则可再分成各种子宏块的分割,其尺寸为 8×8、8×4、4×8 或 4×4 亮度像素块(以及附带的彩色像素)。

    B片:可包 B和I宏块,B 宏块则利用双向的参考图象(当前和 来的已编码图象帧)进行帧内预测。

    SP片(切换P):用于不同编码流之间的切换,包含 P 和/或 I 宏块

    SI片:扩展档次中必须具有的切换,它包 了一种特殊类型的编码宏块,叫做 SI 宏块,SI 也是扩展档次中的必备功能。

    视频解码最主要的工作则是提供高效的方式 从码流中获得宏块中的像素阵列。

    3.

    官方给出的图如下:

    可以看出来。PCM类已经很底层了。。

    image

    4. 整个H264处理过程:

    • 摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中.
    • 编码器先要为每一幅图片划分宏块。H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。
    • 划分好宏块后,计算一幅图像中每个宏块的象素值。
    • 对H264编码器缓存中的所有图片进行分组。
      • H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。

      • 分组规则: 在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。

      • 在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP。

      • 压缩编码方式:

        • 时间上的数据冗余(进行帧间压缩),解决方式是 通过运动矢量进行补偿,然后叠加原始背景数据。

          • Motion Vector + Residual Picture = Origin Picture
        • 空间上的数据冗余(进行帧内预测)

          • 人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。

          • Predicted Mode Picture + Residual Picture = Origin Picture

        • 如果帧间压缩和帧内压缩都用了,那么如果还有冗余。

          • 首先 需要将残差数据进行整数离散余弦变换(DCT),去掉数据的相关性,进一步压缩数据。
          • 然后 也是 最后,我们进行CABAC无损压缩,进一步压缩。
          • 总之就是压缩压缩再压缩。

    相关文章

      网友评论

          本文标题:RTMP&&H264

          本文链接:https://www.haomeiwen.com/subject/fxdukctx.html