【AV1 编码器研究一】aomenc.exe命令行参数简析
持续更新中。
2020.04.05更新完目前版本的所有命令。
用编码器打印help信息
运行如下命令可以将aomenc.exe内置的一些帮助信息输出到help.txt中。下文主要以help.txt中的内容进行分析。目前还是基于其他编码标准的经验分析AV1的一些命令参数,可能会有一些理解错误,对于不确定的地方后续进行实验测试,如果有哪位大拿发现有错漏也请不吝指出。
aomenc.exe --help >help.txt
命令行参数归类
aomenc将命令行分成通用命令、编码器全局选项、码率控制选项、Twopass码率控制选项、关键帧设置选项、AV1 特定选项这六类。
对于一般用户来说,单纯的离线压缩任务只需指定下文中通用命令、编码器全局选项中相关的参数即可,如输入\输出文件名及格式、对编码侧重压缩速度还是压缩质量等相对宏观上层的命令。
对于稍偏专业的用户,如有实时压缩、传输的需求可进一步尝试调整码率控制选项、Twopass码率控制选项、关键帧设置选项中的一些参数配置,如指定码率、关键帧间隔等影响码率分布和实时性的参数。
最后一类AV1 特定选项则暴露了很多编码工具的开关选项,个人理解这些都是更偏向专业用户或者有算法研究兴趣的朋友。
命令行详细内容
通用命令
命令中有两种格式,后面带的意思是需要指定输入参数如-c,而不带参数()的命令类似开关或者切换模式,后面不需要带参数。
--help 打印帮助信息,上文的示例中有用到。
-c <arg>, --cfg=<arg> 指定使用的配置文件。有 -c <filename>和--cfg=<filename>两种形式,下同不再赘述。
-D, --debug 指定使用debug模式,这个命令的直接翻译是“使输出具有确定性”,不太明白是何意,个人理解成会输出一些编码信息,后续测试一下再更新。
-o <arg>, --output=<arg> 指定输出文件名。
--codec=<arg> 指定使用的编码器。(注:难道有多个编码器?)
-p <arg>, --passes=<arg> 指定编码的次数,允许1或2次。
--pass=<arg> 指定执行第1次或第2次编码。
--fpf=<arg> 指定第1次编码输出的统计信息。
--limit=<arg> 指定在编码N帧后停止,也就是指定编码的帧数。
--skip=<arg> 指定跳过序列的前N帧,也就是从第N+1帧开始编码。
--good 使用质量下限约束。(注:意思是保障质量不低于某个程度?)
--rt 使用实时编码的质量下限约束。(注:相比上一个命令加多了编码速度的约束?)
-q, --quiet 不输出编码进度信息。
-v, --verbose 显示编码器参数。
--psnr 显示PSNR。
--webm 输出WebM(启用WebM IO时的默认值)。(注:WebM是啥?)
--ivf 输出IVF。(注:IVF是裸码流封装好的格式)
--obu 输出OBU。(注:OBU是AV1的裸码流)
--q-hist=<arg> 显示量化器的直方图。(注:似乎是输出量化状态用于查看是否符合预期的工具。)
--rate-hist=<arg> 输出码率直方图。
--disable-warnings 不显示关于潜在不正确编码配置的警告信息。
-y, --disable-warning-prompt 显示警告,但不推荐用户继续编码。
--test-decode=<arg> 测试编解码匹配与否。三档可选<off, fatal, warn>
上述通用命令中有不少我不太懂得的名词,比如WebM,IVF等。后面看是否可以通过测试现象猜测,或者后续看代码的过程中明确其含义。
全局编码选项
--yv12 输入文件是YV12格式。(注:看似和NV12名字比较相近,不确定是同个含义)
--i420 输入文件是I420格式。 (默认格式,应该是YUV4:2:0)
--i422 输入文件是I422格式。(应该是YUV4:2:2)
--i444 输入文件是I444格式。(应该是YUV4:4:4)
-u <arg>, --usage=<arg> 指定profile number。
-t <arg>, --threads=<arg> 指定最大线程数。
--profile=<arg> 指定码流的profile。
-w <arg>, --width=<arg> 图像宽。
-h <arg>, --height=<arg> 图像高。
--forced_max_frame_width=<arg> 强制的最大图像宽度。(注:允许的最大图像宽度?)
--forced_max_frame_height=<arg> 强制的最大图像高度。(注:允许的最大图像高度?)
--stereo-mode=<arg> 指定立体声3D视频格式。可选<mono, left-right, bottom-top, top-bottom, right-left>。
--timebase=<arg> 指定时间戳的精度。输出中所需的时间戳精度,以小数秒表示。 默认值为1/1000。
--fps=<arg> 指定帧率。
--global-error-resilient=<arg> 启用全局错误恢复功能。
-b <arg>, --bit-depth=<arg> 指定源位深,版本小于等于1的只支持8-bit,版本2支持10\12-bit。(注:个人理解版本2也支持8-bit)
--lag-in-frames=<arg> 指定最大延迟帧数。
--large-scale-tile=<arg> 大范围tile编码(0:不使用,1:使用,仅在IVF输出时可用)。(注:又一个不太明白的命令,AV1也支持类似HEVC的tile划分吗?)
--monochrome 单色视频,只有亮度没有色度。
--full-still-picture-hdr 对静态图片使用完整header。(注:单帧图片可以省略一些header信息吗?)
码率控制选项
--drop-frame=<arg> 时域重采样门限,buffer的百分比。(注:个人理解为是buffer满溢达到一定门限时进行丢帧操作。)
--