数字视频基础知识

510 阅读10分钟

上一篇见 数字音频基础知识

基本参数

  • 分辨率 Resolution

    • 指视频每一帧图像所含的像素点数,表示为长边像素数x短边像素数,用于度量图像的数据量大小

    • 常见的为

      • 480p(SD 640x480 4:3)
      • 720p(HD 1280x720 16:9)
      • 1080p(FHD 1920x1080 16:9)
      • 2k 1440p(QHD 2560x1440 16:9)
      • 4k 2160p(UHD 3840x2160 16:9)
  • 帧率 Frame Rate

    • 指视频每秒所含的帧数,单位fps
    • 常见的为 15、24、25、30、60fps
  • 码率 Bit Rate

    • 同音频的比特率,只是称呼习惯不同,指每秒传输或处理的比特(bit)数,单位为bit/s或bps
    • 因视频基本参数(分辨率、帧率)、视频编码、视频内容差异,视频码率差异很大

视频采集

数字视频可以理解为对自然场景的时间采样和空间采样,其中空间采样的指标为分辨率,时间采样的指标为帧率

空间采样是指采集一帧帧的图像

时间采样是指每秒扫描多少次,如对于彩色电视,PAL制为25fps,NTSC制为30fps

空间采样通常有两种不同的方式:逐行扫描和隔行扫描

  • 逐行扫描

    • 一行接着一行,由左到右,从上到下进行扫描,每帧所有画面同时显示
    • 这种扫描方式所得画面更加的稳定清晰,目前的数字视频多为逐行扫描
  • 隔行扫描

    • 隔行扫描将一帧分为两场,每场由若干行组成,先扫描奇数行得到顶场,隔一段时间再扫描偶数行得到底场,两个场都显示才为一帧的完整画面
    • 这种扫描方式是为带宽受限的电视开发的技术,两个场采集时间不同,画面更不稳定,现在数字视频很少使用

视频的裸数据通常使用 YUV 数据格式表示

YUV 是一种颜色编码方式,其中Y为明亮度,UV(CbCr)为色度分量,可通过公式与RGB格式相互转换

YUV实际上有多个变种,如Y'UV,YUV,YCbCr,YPbPr,通常我们说的YUV都是指YCbCr这种变种

  • Y 亮度,也就是灰度值
  • Cb 是蓝色通道和亮度的差值
  • Cr 是红色通道和亮度的差值

人眼对于亮度比色度更敏感,YUV将亮度与色度分离,在取样和编码时可以适当减少色度的带宽,显著提高压缩比,但不过度影响观感

同时,YUV产生于黑白电视和彩色电视的过渡时期,分量Y表示亮度值,可以兼容黑白电视

YUV常用的采样格式有

  • 4:4:4 表示完全取样
  • 4:2:2 表示2:1的水平取样,垂直完全采样
  • 4:2:0 表示2:1的水平取样,垂直2:1取样,隔行取样U和V,如该行取样U,下一行取样V
  • 4:1:1 表示4:1的水平取样,垂直完全采样

其中最常用的采样格式为4:2:0

这些采样格式的意义在于,每个像素都有Y亮度值,多个像素共用一个色度值,显著降低带宽

由于有多种采样格式,YUV还有多种不同的数据排列方式,将Y、U、V三个分量按不同顺序储存,大体有三类

  • planar YUV三个分量分开存放
  • semi-plannar Y分量单独存放,UV分量交错存放
  • packed YUV三个分量交错存放

如最常见的 I420(属于YUV 420 Planar)格式排列方式如下,先存放所有的Y分量,再存放U分量和V分量

至于色深,一般为8bit或10bit

计算视频裸数据的码率,若视频格式为 1920x1080 8bit/420 24fps ,则码率为

1920108081.524=597.1968Mbps1920*1080*8*1.5*24=597.1968Mbps

这个码率是网络传输不能接受的,所以对于视频也要进行编码处理

视频编码

与音频编码相似,视频压缩也是通过去除冗余信息来完成的,相较于音频数据,视频数据有着极强的相关性,包含大量冗余信息,包括空间冗余、时间冗余、视觉冗余等

  • 帧内编码 去除空间上的冗余信息,对单幅图像进行编码

  • 帧间编码 去除时间上的冗余信息

    • 运动补偿:通过先前的局部图像来预测、补偿当前的局部图像

    • 运动表示:不同区域的图像使用不同的运动矢量来描述运动信息

    • 运动估计:从视频序列中抽取运动信息

如H.264/AVC简单的编码过程:预测(帧内预测、帧间预测) -> DCT变换和量化 -> 比特流编码

在视频压缩编码中通常使用IPB三种类型的帧

  • I帧 帧内编码帧,自带全部信息的独立帧,可独立解码,为关键帧
  • P帧 帧间预测编码帧,需要参考前面的I帧或P帧才能进行解码,表示当前帧和前一帧的差别,压缩率高
  • B帧 双向预测编码帧,需要参考前面的I帧或P帧和后面的P帧才能进行解码,解码困难,压缩率极高

由于先到来的B帧无法立即解码,需要等待依赖的I帧、P帧解码完,这就导致了解码和显示的不一致

为了解决类似的同步问题,引入DTS、PTS,指导播放时的行为,并在编码时生成

  • DTS(Decoding Time Stamp) 解码时间戳,告诉播放器何时解码这一帧的数据
  • PTS(Presentation Time Stamp) 显示时间戳,告诉播放器何时显示这一帧的数据

当视频流中没有B帧时,通常DTS和PTS是一致的

当视频流中有B帧时,比如视频帧的显示顺序为 I B B P,但视频流中的顺序为I P B B,是按照解码的顺序来排序的

Stream: I P B B
   DTS: 1 2 3 4
   PTS: 1 4 2 3

视频编码时,编码器将多张图像编码后生成一组组GOP(Group of Pictures),解码器在解码时则是读取一组组GOP进行解码后读取画面渲染显示

GOP 是一组连续的画面,由一个I帧和多个P帧、B帧组成,是视频编解码的基本单位

通常为编码器设置参数时,需要设置gop_size,这个参数代表的是两个I帧之间的帧数目,即每组GOP所含帧数目

常见视频编码

常见的视频编码可分为几个系列

ISO-MPEG和ITU-T合作开发的系列,均需专利授权:H.264/AVC、H.265/HEVC、H.266/VVC

Google及后面成立的AOM开发的系列,均为免费格式:VP8、VP9、AV1

AVS工作组开发的系列,中国具有自主知识产权,为广电标准:AVS、AVS2、AVS3

最常见的几种视频编码的压缩比大致如下

H.264/AVC < H.265/HEVC ≈ VP9 < AV1

目前最流行的编码为H.264,软件和硬件支持都非常好

H.265由于专利费用原因没有非常普及,硬件基本支持硬解H.265

AV1有更高的压缩率且免费,但硬件支持还不普及,软解对CPU占用率过高

容器(封装)格式

相比音频容器,视频容器的功能更丰富,提供流封装(一个或多个视频流、音频流)、同步(提供音视频同步的时间戳)、存储元数据(视频流和音频流的各类参数、字幕、视频本身的各种信息)等功能

常见的容器格式有以下几种

  • AVI(.avi) 不支持流媒体,功能较弱
  • MPEG2-TS(.ts) 专为流媒体设计,任意片段可独立解码,常用于HLS协议中(m3u8、ts)
  • Flash Video(.flv) flash时代流行的容器格式,每个片段自带时间戳,常用于HTTP-FLV协议中
  • QuickTime File Format(.mov) 常用于苹果设备和软件中
  • MP4(.mp4) 最流行、最泛用的格式,有更适用于流媒体的变种fMP4,常用于DASH协议中(mpd、mp4、m4s)
  • Matroska(.mkv) 开放格式,支持流媒体,功能强大(多音轨、多字幕、支持多种编码),常用于高清视频
  • WebM(.webm) 开放格式,支持流媒体,基于MKV开发,仅支持开放的编码格式(VP8、VP9、AV1、Opus)

参数实例

通过 ffprobe 输出文件基本参数

MP4

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '4f009fb8c7ba0013dec16d634252eac1.MP4':
  Metadata:
    major_brand     : mp42
    minor_version   : 0
    compatible_brands: mp42mp41
    creation_time   : 2018-11-11T17:17:18.000000Z
  Duration: 00:01:33.88, start: 0.000000, bitrate: 9846 kb/s
  Stream #0:0[0x1](eng): Video: h264 (Main) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 1920x1080, 9519 kb/s, 25 fps, 25 tbr, 25k tbn (default)
    Metadata:
      creation_time   : 2018-11-11T17:17:18.000000Z
      handler_name    : ?Mainconcept Video Media Handler
      vendor_id       : [0][0][0][0]
      encoder         : AVC Coding
  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 317 kb/s (default)
    Metadata:
      creation_time   : 2018-11-11T17:17:18.000000Z
      handler_name    : #Mainconcept MP4 Sound Media Handler
      vendor_id       : [0][0][0][0]

浏览器支持

目前浏览器支持的视频编码共有6种,根据 caniuse.com

  • H.264/AVC 97%完全支持

  • H.265/HEVC 19%完全支持,实际支持比例大于此

  • AV1 78% 完全支持

    • Chrome70版本(2018.10)后支持
    • Edge121版本(2024.1)后支持
    • Safari17版本(2023.9)后支持硬件解码
  • WebM(VP8、VP9) 88%完全支持

    • Safari16版本(2022.9)后完全支持
  • Theora/Ogg 10%完全支持,很少使用的格式

浏览器内支持最良好的还是H.264/AVC

拓展阅读

视频压缩与编解码的基本原理

【从零开始】理解视频编解码技术

YUV 格式详解-史上最全 - 掘金

H.264帧编码原理简述 - 帧内编码和帧间编码

音视频中的DTS、PTS - 掘金

Video coding format

视频文件格式

H.264/H.265/H.266音视频编码基础 - 掘金

高级视频编码器性能对比(H265、VP9、AV1)_音视频_轻口味_InfoQ写作社区

多媒体容器格式变迁史

The Definitive Guide to Container File Formats

网页视频编码指南

视频网站的“蓝光”是怎么骗你的?——视频画质全解析【柴知道】_哔哩哔哩_bilibili

【科普】“视频”是怎么来的?H.264、码率这些词又是什么意思?_哔哩哔哩_bilibili

422,420,10bit,8bit?这些究竟是什么_哔哩哔哩_bilibili

【硬核科普】奇妙的帧率增加了!_哔哩哔哩_bilibili

网络上视频是如何显示一帧的——浅谈H.264编码原理