上一篇见 数字音频基础知识
基本参数
-
分辨率 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 ,则码率为
这个码率是网络传输不能接受的,所以对于视频也要进行编码处理
视频编码
与音频编码相似,视频压缩也是通过去除冗余信息来完成的,相较于音频数据,视频数据有着极强的相关性,包含大量冗余信息,包括空间冗余、时间冗余、视觉冗余等
-
帧内编码 去除空间上的冗余信息,对单幅图像进行编码
-
帧间编码 去除时间上的冗余信息
-
运动补偿:通过先前的局部图像来预测、补偿当前的局部图像
-
运动表示:不同区域的图像使用不同的运动矢量来描述运动信息
-
运动估计:从视频序列中抽取运动信息
-
如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%完全支持,实际支持比例大于此
-
Safari13(2019.10)之后能直接使用
-
Chrome107版本(2022.10)之后支持HEVC硬解
- 由来自字节的开源贡献者主导,见【专访】 Chrome HEVC 硬解背后的字节开源贡献者
-
Edge79-107版本需安装微软商店HEVC插件,107版本(2022.10)之后与Chrome相同支持HEVC硬解
-
-
AV1 78% 完全支持
- Chrome70版本(2018.10)后支持
- Edge121版本(2024.1)后支持
- Safari17版本(2023.9)后支持硬件解码
-
WebM(VP8、VP9) 88%完全支持
- Safari16版本(2022.9)后完全支持
-
Theora/Ogg 10%完全支持,很少使用的格式
浏览器内支持最良好的还是H.264/AVC
拓展阅读
高级视频编码器性能对比(H265、VP9、AV1)_音视频_轻口味_InfoQ写作社区
The Definitive Guide to Container File Formats
视频网站的“蓝光”是怎么骗你的?——视频画质全解析【柴知道】_哔哩哔哩_bilibili
【科普】“视频”是怎么来的?H.264、码率这些词又是什么意思?_哔哩哔哩_bilibili