SVC编码
视频SVC编码,即Scalable Video Coding(可适性视讯编码或可分级视频编码),是H.264/MPEG-4 AVC编码的一种扩展,它提供了更大的编码弹性,并且具有时间可适性(Temporal Scalability)、空间可适性(Spatial Scalability)及讯杂比(质量)可适性(SNR Scalability)三大特性。这种编码方式允许视频序列被分割成不同的部分,并根据实际环境选择解码的层级,从而适应不同的网络带宽和解码能力。
SVC技术的目标是标准化编码的高品质视频码流,使其能够独立拆分成一个或多个子比特流进行解码,每个子比特流可以代表不同空间或时间分辨率较低或品质较差的视频信号。SVC技术可以广泛应用于监控、视频会议、流媒体IPTV等领域,特别是在网络丢包环境下,通过丢弃部分时域层级实现网络适应性。
SVC技术的优势在于其灵活性和网络适应性,它可以一次编码产生多个不同质量的视频流,减少了服务器的编解码负担。然而,SVC的解码复杂度比单层编码高,且在相同条件下,分级码流的压缩效率比单层码流低约10%。此外,由于SVC较晚成为正式标准,其兼容性和通用性不如AVC,实际应用不如AVC广泛。
SVC对H.264的语法也进行了扩展,例如对NAL(Network Adaptive Layer)头进行了扩展,以描述码流的分级信息,并使用保留的NAL类型14、20编码增强层码流。
AV1
AV1是一种开源、免版税的视频编码格式,由开放媒体联盟(AOMedia)开发,旨在提供比现有标准更高的视频压缩效率。AV1是基于VP9的继任者,结合了多种技术,提供了更多的编码选项,以适应不同类型的输入视频内容。
AV1的主要目标是在现有编解码器的基础上获得显著的压缩率提升,同时确保解码的复杂性和硬件的实际可行性。它提供了以下关键编码技术:
-
帧间预测运动补偿:AV1允许更复杂的参考帧和运动矢量池,扩展了参考帧的数量,并使用高自适应加权算法和源,增强了复合预测。
-
动态空间与时间运动矢量参考:AV1通过搜索空间和时间候选,获得更好的运动矢量参考,并通过运动场估计过程,生成时间候选。
-
重叠块运动补偿(OBMC):通过平滑地组合从邻近运动矢量创建的预测,减少块边缘附近的预测误差。
-
变换块分区和扩展的转换内核:AV1支持多种大小的变换单元,以及更丰富的转换内核集,包括DCT、ADST、flipADST和IDTX等。
-
熵编码:AV1使用多符号熵编码和电平图系数编码,提高压缩效率并简化编码器设计。
AV1编码器在FFmpeg中得到支持,包括libaom(libaom-av1)、SVT-AV1(libsvtav1) 和 rav1e(librav1e) 等编码器。AV1编码器提供了不同的码率控制模式,如恒定质量(CRF)、限制质量等,以适应不同的编码需求。
NVIDIA GeForce RTX 30系列GPU支持AV1解码,这标志着视频内容新纪元的开启。AV1编码效率相比H.264最高提升50%,支持10-bit编码和HDR视频,为用户提供了更高的分辨率和帧率体验。
总的来说,AV1作为一种新兴的开源视频编码格式,以其高效的压缩性能和灵活的编码选项,有望在视频传输和流媒体服务中发挥重要作用。
AV1是默认支持SVC的第一个编解码器,这使得它在公共互联网上的应用具有显著优势。例如,在WebRTC(Web Real-Time Communications)应用中,AV1的SVC特性可以提供更好的网络适应性和弹性,同时支持更高的视频质量和更低的带宽需求。
此外,AV1的SVC实现还包括了对屏幕内容编码的优化,这是会议和视频通话中的一个重要用例。AV1的屏幕编码工具作为基本功能集成在编解码器中,而不是作为扩展,这为屏幕共享提供了更高的编码效率。
libaom实验SVC 编码
- 代码下载:
git clone https://aomedia.googlesource.com/aom
- 安装依赖软件:CMake、Git、编译器(gcc 6+, clang 7+, Microsoft Visual Studio 2019+ or the latest version of MinGW-w64 (clang64 or ucrt toolchains))、Perl、yasm/nasm、doxygen、EMSDK
- 编译:参考
README.md
,利用 CMake 进行编译。
$ cmake path/to/aom
$ make
- 查看编译后文件:在 build 目录下,有对应的库文件和可执行程序,其中在 examples 目录里有对应的 libaom 使用例子:
.
├── aom_cx_set_ref
├── decode_to_md5
├── decode_with_drops
├── lightfield_bitstream_parsing
├── lightfield_decoder
├── lightfield_encoder
├── lightfield_tile_list_decoder
├── lossless_encoder
├── noise_model
├── photon_noise_table
├── scalable_decoder
├── scalable_encoder
├── set_maps
├── simple_decoder
├── simple_encoder
├── svc_encoder_rtc
├── twopass_encoder
- 终端实验
svc_encoder_rtc
可执行程序:./svc_encoder_rtc
Usage: ./svc_encoder_rtc <options> input_filename -o output_filename
Options:
-f <arg>, --frames=<arg> Number of frames to encode
-o <arg>, --output=<arg> Output filename
-w <arg>, --width=<arg> Source width
-h <arg>, --height=<arg> Source height
-t <arg>, --timebase=<arg> Timebase (num/den)
-b <arg>, --target-bitrate=<arg> Encoding bitrate, in kilobits per second
-sl <arg>, --spatial-layers=<arg> Number of spatial SVC layers
-k <arg>, --kf-dist=<arg> Number of frames between keyframes
-r <arg>, --scale-factors=<arg> Scale factors (lowest to highest layer)
--min-q=<arg> Minimum quantizer
--max-q=<arg> Maximum quantizer
-tl <arg>, --temporal-layers=<arg> Number of temporal SVC layers
-lm <arg>, --layering-mode=<arg> Temporal layering scheme.
-th <arg>, --threads=<arg> Number of threads to use
-aq <arg>, --aqmode=<arg> AQ mode off/on
-d <arg>, --bit-depth=<arg> Bit depth for codec 8 or 10.
8, 10
-sp <arg>, --speed=<arg> Speed configuration
-bl <arg>, --bitrates=<arg> Bitrates[spatial_layer * num_temporal_layer + temporal_layer]
--drop-frame=<arg> Temporal resampling threshold (buf %)
--error-resilient=<arg> Error resilient flag
--output-obu=<arg> Write OBUs when set to 1. Otherwise write IVF files.
--test-decode=<arg> Attempt to test decoding the output when set to 1. Default is 1.
--tune-content=<arg> Tune content type
default, screen, film
--psnr=<arg> Show PSNR in status line.
- 命令行输入空域 3 层 SVC 编码:
./svc_encoder_rtc -w 1280 -h 720 -k 30 -sl 3 -lm 6 -b 1000 --bitrates=200,300,500 vidyo4_720p_60.yuv -o o.ivf
- 注意:分层数要与分层模式相匹配。
Codec AOMedia Project AV1 Encoder v3.8.3
layers: 3
width 1280, height: 720
num: 1, den: 30, bitrate: 1000
gop size: 30
Total number of processed frames: 600
Rate control layer stats for 1 layer(s):
For layer#: 0 0
Bitrate (target vs actual): 200 202.397200
Average frame size (target vs actual): 6666.666667 6357.117241
Average rate_mismatch: 38.170552
Number of input frames, encoded (non-key) frames, and perc dropped frames: 600 580 3.166667
For layer#: 1 0
Bitrate (target vs actual): 300 302.790800
Average frame size (target vs actual): 10000.000000 10441.062069
Average rate_mismatch: 59.582759
Number of input frames, encoded (non-key) frames, and perc dropped frames: 600 580 3.166667
For layer#: 2 0
Bitrate (target vs actual): 500 505.510000
Average frame size (target vs actual): 16666.666667 17431.379310
Average rate_mismatch: 58.197545
Number of input frames, encoded (non-key) frames, and perc dropped frames: 600 580 3.166667
Short-time stats, for window of 15 frames:
Average, rms-variance, and percent-fluct: 512.739200 184.254718 35.935368
Per layer encoding time/FPS stats for encoder: 0 0 601 1.340471 746.006507
Per layer encoding time/FPS stats for encoder: 1 0 601 2.559216 390.744619
Per layer encoding time/FPS stats for encoder: 2 0 601 7.417110 134.823405
Frame cnt and encoding time/FPS stats for encoding: 601 11.316797 88.364225
-
查看编码出来的视频流:可以看到在文件目录里生成四个 ivf 格式视频流,分别对应 0、1、2 层空域视频流,其中
o.ivf
和 2 层一样。
-
播放 SVC 视频流:利用 ffplay 分别播放视频,0、1、2 层分辨率分别为 360x180、640x360、1280x720。
-
用流工具 elecard 查看流信息: 可以看到 AV1 的流格式为 IVF Start Header | IVF Frame Header | OBU Header |OBU Sequence Header | OUB Frame |…
参考
- 关于 AV1 语法可参考:AV1 Bitstream & Decoding Process Specification