首页 > 其他分享 >libaom 编码器实验 AV1 标准 SVC 分层编码

libaom 编码器实验 AV1 标准 SVC 分层编码

时间:2024-07-08 15:29:30浏览次数:9  
标签:编码 编码器 libaom -- AV1 SVC frames encoder

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的主要目标是在现有编解码器的基础上获得显著的压缩率提升,同时确保解码的复杂性和硬件的实际可行性。它提供了以下关键编码技术:

  1. 帧间预测运动补偿:AV1允许更复杂的参考帧和运动矢量池,扩展了参考帧的数量,并使用高自适应加权算法和源,增强了复合预测。

  2. 动态空间与时间运动矢量参考:AV1通过搜索空间和时间候选,获得更好的运动矢量参考,并通过运动场估计过程,生成时间候选。

  3. 重叠块运动补偿(OBMC):通过平滑地组合从邻近运动矢量创建的预测,减少块边缘附近的预测误差。

  4. 变换块分区和扩展的转换内核:AV1支持多种大小的变换单元,以及更丰富的转换内核集,包括DCT、ADST、flipADST和IDTX等。

  5. 熵编码: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 编码

  1. 代码下载git clone https://aomedia.googlesource.com/aom
  2. 安装依赖软件: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
  3. 编译:参考 README.md,利用 CMake 进行编译。
    $ cmake path/to/aom
    $ make

  1. 查看编译后文件:在 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
  1. 终端实验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.
  1. 命令行输入空域 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.av1
    • 注意:分层数要与分层模式相匹配。
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
  1. 查看编码出来的视频流:可以看到在文件目录里生成四个 av1 格式视频流,分别对应 0、1、2 层空域视频流,其中 o.av1 和 2 层一样。
    在这里插入图片描述
  2. 播放 SVC 视频流:利用 ffplay 分别播放视频,0、1、2 层分辨率分别为 360x180、640x360、1280x720。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  3. 用流工具 elecard 查看流信息: 可以看到 AV1 的流格式为 IVF Start Header | IVF Frame Header | OBU Header |OBU Sequence Header | OUB Frame |…
    在这里插入图片描述

参考

标签:编码,编码器,libaom,--,AV1,SVC,frames,encoder
From: https://blog.csdn.net/yanceyxin/article/details/140266601

相关文章

  • (三)变分自动编码器
    过去虽然没有细看,但印象里一直觉得变分自编码器(VariationalAuto-Encoder,VAE)是个好东西。于是趁着最近看概率图模型的三分钟热度,我决定也争取把VAE搞懂。于是乎照样翻了网上很多资料,无一例外发现都很含糊,主要的感觉是公式写了一大通,还是迷迷糊糊的,最后好不容易觉得看懂了,再去看看......
  • (一)变分推断与变分自编码器
     本文主要介绍变分自编码器(VariationalAuto-Encoder,VAE)及其推导过程,但变分自编码器涉及一些概率统计的基础知识,因此为了更好地理解变分自编码器,首先介绍变分推断(VariationalInference)与期望最大化(Expectation-Maximization,EM)算法,进而介绍变分自编码器,并给出另一种理......
  • Arduino 驱动360度旋转传感器(如旋转编码器)
    以下是使用ArduinoUnoR3驱动一个360度旋转传感器(如旋转编码器)的详细说明、接线图和代码示例,其中传感器引脚为CLK、DT、SW、+、GND。所需材料ArduinoUnoR3360度旋转传感器(旋转编码器)面包板和连接线接线步骤连接旋转传感器:将旋转编码器的CLK引脚连接到ArduinoUno的......
  • ros2 - slam - 直流电机-编码器脉冲测量与校准
    这一节我们编写代码来尝试下是否能够读取到电机上编码器的脉冲数,并通过实验测试出小车的输出轴转速和编码器脉冲的比值。一、新建工程并导入开源库新建example25_encoder添加依赖[env:featheresp32];这是一个环境配置标签,指定了代码将运行的硬件平台和框架platform=esp......
  • ros2 - slam - 使用编码器测量轮子最大速度
    新建example26_max_speed_measurement 添加依赖[env:featheresp32];这是一个环境配置标签,指定了代码将运行的硬件平台和框架platform=espressif32;指定了使用的平台为Espressif32board=featheresp32;指定使用的硬件板为FeatherESP32framework=arduino;......
  • ros2 - slam - 编码器测速原理
    上节做完小车,遥控时小车前进时你应该会发现,小车很难走一条直线,但明明我们给到两个电机的PWM占空比都是相同的,原因在于每一个电机的硬件参数并不能完全的保证一致,所以当我们采用开环控制时,即使我们给到每个电机相同的电压,也不能让两个电机保持相同的转速。要解决这个问题我们就要......
  • x264 编码器x264.h文件中结构体详细介绍
    x264_picture_t定义:在x264.h文件中定义typedefstructx264_picture_t{/*In:forcepicturetype(ifnotauto)*Ifx264encodingparametersareviolatedintheforcingofpicturetypes,*x264willcorrecttheinputpicture......
  • 机器翻译及实践 初级版:含注意力机制的编码器—解码器模型
    机器翻译及实践初级版:含注意力机制的编码器—解码器模型前言一、什么是机器翻译?二、所需要的前置知识(一).Seq2Seq1.什么是Seq2Seq2.机器翻译为什么要用Seq2Seq3.如何使用Seq2Seq3.1编码器的实现3.2解码器的实现3.3训练模型(二).注意力机制1.什么是注意力机制2.机器翻译为......
  • 编码器的稀疏注意力块(ProbSparse Self-Attention Block)
    编码器的稀疏注意力块(ProbSparseSelf-AttentionBlock)详细解释1.概述稀疏注意力块是Informer模型的核心组件之一,旨在高效处理长时间序列数据。它通过稀疏自注意力机制(ProbSparseSelf-Attention)显著降低计算复杂度,同时保持较高的性能。2.主要组件稀疏注意力块由以下......
  • 编码器的蒸馏(Distilling)详细解释
    编码器的蒸馏(Distilling)详细解释概述蒸馏(Distilling)步骤是在稀疏注意力块之后,用于进一步压缩和提炼特征表示。这个步骤的主要目的是减少序列长度,使得模型能够更有效地处理长时间序列数据,同时保持重要的特征信息。主要步骤1x3卷积层(Conv1d)ELU激活函数最大池化(MaxPooli......