多媒体直播技术 | 青训营笔记

175 阅读4分钟

这是我参与「第四届青训营 」笔记创作活动的第5天。

以下是第五堂课的笔记和总结

探究多媒体直播技术

视频基本元素

  • 像素

    一般使用RGB三原色表示,R、G、B分别从0~255,共256个等级。

  • 分辨率

    纵横方向的像素数量,一般用宽*高或长*宽表示,如720*1080、1920*1080。

  • 码率/比特率

    单位时间播放连续媒体如压缩后的音视频的bit数量,也称为码流,高码率需要更高的带宽支持,低码率可能会导致画面过度压缩,模糊不清。

  • 帧率

    每秒传输帧数,帧数越多,所显示动作就会越流畅,FPS可以理解为刷新率,当刷新率过低时会看起来像PPT。

视频数据的封装

每一部视频都是对编码好的视频轨和音频轨一起进行封装,主要的视频容器有:MPG、VOB、MP4、3GP、ASF、RMVB、WMV、MOV、Divx、MKV、FLV、TS/PS等。

轨道/流

交错排列,便于传输下载时音画同步。

  • 视频流
  • 音频流
  • 字幕流
  • ...

视频压缩

颜色空间

使用YUV方式数字化表示颜色,而不是RGB(不利于压缩),Y表示亮度,U和V表示色度。

  • YUV444
  • YUV422
  • YUV411
  • YUV420
压缩

利用视频相关性减少数据量

  • 帧内压缩/空间压缩

    压缩时只考虑本帧内的数据,与静态图像压缩类似。

  • 帧间压缩/时间压缩

    基于视频或动画前后两帧具有很大相关性的特点实现,视频压缩比较常用。

    • 帧的编码类型

      • I-frame

        帧内编码帧,只进行帧内预测,压缩率小。

      • P-frame

        前向编码帧,可以帧间预测和帧内预测,参考前面已编码的I帧和P帧,压缩率高。

      • B-frame

        双向编码帧,可以帧间预测和帧内预测,参考前后已编码的I帧和P帧,压缩率最高。

      视频点播:节省带宽,高压缩率,使用B帧。

      直播:低延迟,不使用B帧。

      视频编辑:提高相应,个别使用全I帧。

视频编码格式
  • H264:AVC
  • H265:HEVC
  • H266:VVC

直播推拉流协议

封装格式
  • MP4

    Moov文件:储存metadata,位于mp4文件开头

    mvhd文件:mp4文件整体信息,创建时间、文件时长等

    trak:轨道,视频和音频轨道等

    Stbl:媒体数据的索引以及时间信息

  • FLV

    由文件头和多个tag组成。

    FLV header

    tag:audio、video、script(音频流、视频流、脚本流)

    Not seekable(不支持拖拽)

名词解释
  • 点播:视频播放
  • 直播:观看直播
  • 推流:主播将数据发送到CDN网络
  • 拉流:观众从CDN拉取直播数据
推拉流协议
  • RTMP:Real-Time Messaging Protocol

    推流协议,技术成熟,基于tcp协议,低延迟。

  • HTTP-FLV:HTTP+FLV

    拉流协议,协议友好,格式简单,延迟较低。

  • HLS:HTTP Live Streaming

    拉流协议,苹果公司提出的,每次分成一个个基于HTTP文件下载,形成一个m3u8播放列表文件,寻找可用媒体流播放(TS),延时高。

客户端工作总结

开播过程
  1. 图像采集
    • 摄像头
    • 屏幕
    • 图像采集卡
  2. 图像处理(可选)
    • 美颜
    • 绿幕
    • 头饰
    • ...
  3. 编码+封装
  4. 推流
看播过程
  1. 拉流
  2. 解封装+解码
    • 硬件解码
    • 软件解码
  3. 图像处理
    • 超分辨率
    • 美图
  4. 渲染
    • OpenGL
    • VULKAN
    • Native window
音画同步

使用视频对齐音频

总结

通过本节课程,我了解到了直播是如何一步步实现的。先是学习了视频的基本概念与组成元素,了解了常用的视频封装格式如MP4,FLV等,为方便视频压缩,引入了YUV颜色编码方式,并通过不同的帧间编码方式对视频进行压缩。接着是学习直播相关的推拉流协议,了解到了直播开播和看播的过程。虽然这节课的内容比较偏向于特定的知识点,在Android日常开发上用到的比较少,但是对知识面的拓展、技术面的提升有很大的用处。