关于FFmpeg VMAF 的一些记录

一、FFmpeg的一些介绍

具体可参照FFmpeg的百度百科、FFmpeg官网

多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能、视频格式转换、视频抓图、给视频加水印等。

它包含可以由应用程序使用的libavcodec,libavutil,libavformat,libavfilter,libavdevice,libswscale和libswresample。与ffmpeg,ffplay和ffprobe一样,最终用户也可以使用它们进行转码和播放。

FFmpeg工程主要包括三个exe文件:

ffmpeg.exe 进行格式转换

ffplay.exe 当作播放器用,能播放各种格式的音视频

ffprobe.exe 查看音视频文件格式详细信息

二、图像质量评估

图像质量评估:利用计算机程序将目标图像和参考图像进行对比,得出的对目标图像压缩与处理系统优劣客观的、自动的评价。

关于图像质量评估的一些评价方法,主要有PSNR、SSIM、VMAF三种方法

扫描二维码关注公众号,回复: 15893055 查看本文章

客观评价指标分为三类:基于误差的评价指标、基于感知模型与图像结构信息的评价指标以及基于机器学习的评价指标。

基于误差评价指标是将压缩图像和原始图像进行对比,计算两个图像之间的差异(称为噪声或误差),代表指标是均方误差(Mean square error, MSE)、峰值信噪比(Peak signal noise ratio, PSNR)。

基于感知模型与图像结构评价指标通过引入人类视觉系统模型(Human Visual System, HVS)将图像质量下降转化为感知结构信息的变化和一些感知现象(亮度、对比度、观看距离)的变化,对人类如何感知这些误差进行数学建模,代表指标是结构相似度(Structure similarity Index, SSIM)、恰可识别阈值(Just Noticeable Difference, JND)。

基于机器学习的评价指标一般用来度量长时间视频,从某个可训练的模型开始,将基于误差评价指标或基于感知评价指标结果与主观MOS分数进行比较,并对模型进行微调以使其随时间推移而改善,或是多种评价指标体系的融合,这些多种指标包括度量图像质量的指标和度量时间质量的指标,基于机器学习的评价指标有代表性的指标是视频多评估方法融合(Visual Multimethod Assessment Fusion, VMAF)。

关于图像质量评估,详细的介绍可参考该知乎分享:视频/图像质量评价综述

具体的一些区别简单整理如下图:

三、下载FFmpeg

可以从官网直接进行下载FFmpeg官网,下载后解压,配置好环境变量就可以直接用了。

不过我并没有特意去配置环境变量,是直接在static\bin的目录下运行cmd命令提示符窗口,运行命令的时候直接输入对应的exe文件就可以了。比如使用ffplay播放视频,他的命令格式是

ffplay [options] [input_url]

我使用的时候就输入ffplay.exe [options] [input_url]就可以了。(就是写明使用的exe文件就好了)

四、FFmpeg的使用

存在问题:VMAF主要问题是其结果非绝对指标,不同视频、不同分辨率的VMAF得分不能直接比较。

ffmpeg是一个非常快速的视频和音频转换器,也可以从实时音频/视频源中获取。它还可以在任意采样率之间转换,并使用高质量的多相滤波器即时调整视频大小。

FFmpeg的命令语句格式

ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

(如果没有配置环境变量,记得需要在static\bin目录下进入cmd窗口哦,再将ffmepg写明成ffmpeg.exe)

关于ffmpeg的一些命令说明:

ffmpeg从该选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)中读取-i,并写入任意数量的由以下选项指定 的输出“文件”一个普通的输出网址。在命令行上找到的所有不能解释为选项的内容都被视为输出URL。

通常,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后,将每次出现都应用于下一个输入或输出文件。此规则的例外是全局选项(例如,详细级别),应首先指定。

要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如,第一个输入文件为0,第二个输入文件为,1等等。类似地,文件中的流由它们的索引引用。例如,2:3引用第三输入文件中的第四流。

1、查看视频文件参数值

使用ffmpeg -i input_url 可以查看一下这个视频文件的一些参数值,如帧率、码率、编码格式、分辨率;但是ffmpeg也会提示你,At least one output file must be specified(必须至少指定一个输出文件),所以这种方式还是不推荐。

ffmpeg -i input_url
例如:
ffmpeg.exe -i demo\60fps_8M_h264.avi

命令输入结果如下:

2、转换音视频文件(缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。)

ffmpeg [options] -i input_url [options] output.url
例如:
ffmpeg.exe -i demo\60fps_8M_h264.avi demo\60fps_8M_h264.mp4 

上述的命令中,demo是一个目录名

由于ffmpeg是逐帧进行转换,所以需要的时间也比较长(转换期间占用的CPU也会比较高),耐心等待转换完成就好,然后你就可以在指定目录下看到转换好的文件了。(比如说我这个视频文件是3分钟的视频,60FPS的帧率,所以总共的帧数应该是在10800左右)

转换完成

3、ffmpeg的一些常用参数命令

-f 强制输入或输出文件格式。通常会自动为输入文件检测格式,并从输出文件的文件扩展名中猜测该格式,因此大多数情况下不需要此选项

-y 覆盖输出文件而无需询问

-n 不要覆盖输出文件,如果指定的输出文件已经存在,请立即退出

-b 设置比特率,缺省200kb/s

-s 设置帧大小,格式为WXH 缺省160*128

-bufsize 设置码率控制缓冲区大小

-r 设置帧率

-psnr 计算压缩帧的PSNR

关于FFmpeg详细的参数说明,可参考该篇博客:FFmpeg参数中文详细解释,或是可以直接从FFmpeg官网上查看

缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。如果想要进行码率的调整或是帧率的调整,可以通过以下命令语句来实现:

注:以下命令中input_url均指代输入文件,output_url均指代输出文件
 
覆盖输出文件且不提示:
ffmpeg -i input_url -y output_url
 
设置帧率为30:
ffmpeg –i input_url –r 30 output_url
 
设置音频码率为128k、视频码率为1500kbps:
ffmpeg -i input_url -b:a 128k -b:v 1500k output_url
(音频:-b:a 、视频:-b:v )
 
使用libx264编码所有视频流,并复制所有音频流:
ffmpeg -i input_url -map 0 -c:v libx264 -c:a copy output_url
 
使用265编码,并降低码率为2000kbps:
ffmpeg -i input_url -b:v 2000k -vcodec libx265 output_url
-bufsize 用于设置码率控制缓冲器的大小,设置的好处是,让整体的码率更趋近于希望的值,减少波动
ffmpeg -i input.url -b:v 2000k -bufsize 2000k output.url 
 
截取视频(从开始位置截取到30秒的视频)
ffmpeg  -i input_url  -vcodec copy -acodec copy -ss 00:00:00 -t 30 output_url
(其中,00:00:00是要截取视频的起始时间,30是要截取视频的持续时间长度)

这篇博客针对上述的具体参数也讲解得比较详细:FFmpeg使用基础、总结 视频质量评价技术零基础学习方法

4、使用ffmpeg VMAF 进行评分

关于VMAF的一些介绍:Netflix: VMAF 视频质量评价工具简介、Netflix VMAF 视频质量评估工具概述

简单的一个命令格式如下(个人常用)

ffmpeg.exe -i input1_url -i input2_url -lavfi libvmaf="model_path=vmaf_v0.6.1.pkl:log_path=VMAF.txt" -report -f null -

参数说明:

model_path、log_path的参数值都在static\bin目录下(即ffmpeg同级目录下),Model 中,vmaf_v0.6.1.pkl适用于1080P分辨率的视频,vmaf_4k_v0.6.1.pkl适用于4K分辨率的视频。

该条命令语句会在bin文件下生成日志文件,大概的明明格式和位置如下:

VMAF详细的使用说明:

具体的可参考FFmpeg使用libvmaf交叉评估笔记

Usage: vmafossexec fmt width height ref_path dis_path model_path [--log log_path] [--log-fmt log_fmt] [--thread n_thread] [--subsample n_subsample] [--disable-clip] [--disable-avx] [--psnr] [--ssim] [--ms-ssim] [--phone-model] [--ci] 
fmt: yuv420p yuv422p yuv444p yuv420p10le yuv422p10le yuv444p10le 
log_fmt: xml (default) json 
n_thread: maximum threads to use (default 0 - use all threads) 
n_subsample: n indicates computing on one of every n frames (default 1) 

还是刚刚那个avi格式的视频文件,我们将其转码成了mp4格式,评分命令在最下方已经写明了,前面写的是avi格式的,后面写的是mp4格式的,评分为38分左右。

说明:

1、交换前后两个输入文件,对评分会有一定影响

2、评分的时候依旧是逐帧进行比较的,所以耗费的时间长,占用的CPU也比较高

或许你会觉得转码过后啥也没干咋就评分这么低呢?

emmm,关于这一点,我也没有太弄懂,不过后面又尝试将avi格式转码成了mkv格式,再使用avi和mkv两个视频文件来进行评分,评分结果高达99。

(avi和mkv也评分过了,依旧只有38分的样子。目前还在找原因,莫不是因为他们读流的方式不一样,所以两个视频比较的帧数不同?如果有知道的同学,欢迎指出)

原文 关于FFmpeg VMAF 的一些记录

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

猜你喜欢

转载自blog.csdn.net/yinshipin007/article/details/131968501