音视频测试 [vmaf] 视频质量评估工具试用

黑水 · 2018年02月04日 · 最后由 黑水 回复于 2020年11月10日 · 6511 次阅读

看到 @zhangzhao_lenovo这里推荐了 Netflix 开源的视频质量评估工具,试用下做个记录,项目地址
在 Mac 上安装,基本照着 README 做就行了:

# 系统版本 MacOS 10.13.2
brew install gcc freetype pkg-config homebrew/science/hdf5 python
# 替换 MacOS 自带的 Python
echo "export PATH=/usr/local/opt/python/libexec/bin:$PATH" >> ~/.bash_profile
source ~/.bash_profile
brew install numpy scipy
# 和 README 不一样的是用了 pip2 命令
pip2 install matplotlib notebook pandas sympy nose scikit-learn h5py
# 安装 vmaf
git clone https://github.com/Netflix/vmaf.git
cd vmaf
git submodule update --init --recursive
make
echo export PYTHONPATH="$(pwd)/python/src:$(pwd)/sureal/python/src:$PYTHONPATH" >> ~/.bash_profile
source ~/.bash_profile

vmaf 源码里带了一些用于测试的视频,验证一下有没有安装成功:

./run_vmaf yuv420p 576 324 \
  python/test/resource/yuv/src01_hrc00_576x324.yuv \
  python/test/resource/yuv/src01_hrc01_576x324.yuv \
  --out-fmt json
# 执行成功有以下输出
   ...
   ], 
    "aggregate": {
        "VMAF_feature_adm2_score": 0.9345878041226809, 
        "VMAF_feature_motion2_score": 3.8953518541666665, 
        "VMAF_feature_vif_scale0_score": 0.36342081156994926, 
        "VMAF_feature_vif_scale1_score": 0.7666473878461729, 
        "VMAF_feature_vif_scale2_score": 0.8628533892781629, 
        "VMAF_feature_vif_scale3_score": 0.9159718691393048, 
        "VMAF_score": 76.69927060701059, 
        "method": "mean"
    }
}

从输出可以看出对转码前和转码后的两个视频逐帧比较,从 6 个维度评分,最后是总分 VMAF_score 。
播放这两个视频用肉眼看看:

brew install ffmpeg --with-sdl2 --with-x265
ffplay -f rawvideo -video_size 576x324 -pixel_format yuv420p src01_hrc00_576x324.yuv
ffplay -f rawvideo -video_size 576x324 -pixel_format yuv420p src01_hrc01_576x324.yuv

找了一个蓝光视频源,用不同参数转码,之后用 vmaf 评下分。

# 视频文件名是 origin.mkv,查看下视频流信息
ffmpeg -i origin.mkv -hide_banner

Stream #0:0(jpn): Video: hevc (Main 10), yuv420p10le(tv), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)

# 剪切出 8 秒的片段
ffmpeg -i origin.mkv -vcodec copy -acodec copy -ss 00:20:42 -t 00:00:08 split.mkv
# 输出 .yuv 格式
ffmpeg -i split.mkv split.yuv
# CRF 28 转码
ffmpeg -i split.mkv -c:v libx265 -crf 28 crf28.mkv
# 输出 .yuv 格式
ffmpeg -i crf28.mkv crf28.yuv
# 评分
./run_vmaf yuv420p10le 1920 1080 \
  split.yuv \
  crf28.yuv \
  --out-fmt json

试完往下看 README,发现 vmaf 提供了一个 ffmpeg2vmaf 命令,不用自己输出 .yuv 格式。
${your-vmaf-path}/vmaf/python/src/vmaf/externals.py 里加一行 ffmpeg 路径:

FFMPEG_PATH = "/usr/local/bin/ffmpeg"
# 继续转几个不同质量的视频
ffmpeg -i split.mkv -c:v libx265 -crf 51 crf51.mkv
ffmpeg -i split.mkv -c:v libx265 -crf 27 crf27.mkv

转码前后的视频放在网盘了,可以先播放主观感受下。

# 评分
./ffmpeg2vmaf 1920 1080 split.mkv crf27.mkv --out-fmt json > crf27.json
./ffmpeg2vmaf 1920 1080 split.mkv crf28.mkv --out-fmt json > crf28.json
./ffmpeg2vmaf 1920 1080 split.mkv crf51.mkv --out-fmt json > crf51.json

crf27 得分:

"aggregate": {
"VMAF_feature_adm2_score": 0.9506281927651887,
"VMAF_feature_motion2_score": 15.292086189944133,
"VMAF_feature_vif_scale0_score": 0.7033932664352849,
"VMAF_feature_vif_scale1_score": 0.891849091157867,
"VMAF_feature_vif_scale2_score": 0.9376366751606525,
"VMAF_feature_vif_scale3_score": 0.9605367831047515,
"VMAF_score": 91.54301859617843,
"method": "mean"
}

crf28 得分:

"aggregate": {
"VMAF_feature_adm2_score": 0.9454497740556413,
"VMAF_feature_motion2_score": 15.292086189944133,
"VMAF_feature_vif_scale0_score": 0.6865860812976473,
"VMAF_feature_vif_scale1_score": 0.8774754333779801,
"VMAF_feature_vif_scale2_score": 0.9274710703407736,
"VMAF_feature_vif_scale3_score": 0.9534477600744574,
"VMAF_score": 90.0891120853419,
"method": "mean"
}

crf51 得分:

"aggregate": {
"VMAF_feature_adm2_score": 0.7351725278920788,
"VMAF_feature_motion2_score": 15.292086189944133,
"VMAF_feature_vif_scale0_score": 0.38975482224744185,
"VMAF_feature_vif_scale1_score": 0.49917455035693126,
"VMAF_feature_vif_scale2_score": 0.5541193612075329,
"VMAF_feature_vif_scale3_score": 0.6013419372604807,
"VMAF_score": 27.672561113858062,
"method": "mean"
}

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 8 条回复 时间 点赞

你这个是测试手段,但是线上的真正的流量,不可能也这样做吧?能否考虑整合在一起?比如线上每个流都会生成这样的报告,然后制定一套基线,如果数据低于这个基线,占比超过 10% 就报警。

恒温 回复

点播的话,外部或内部用户上传源视频,根据源视频信息用一些预设参数压制出多个等级的视频,比如 360P、720P、1080P 这些,然后分发到 CDN,客户端根据用户选择、网络情况等选择一个等级拉取。
这个工具大概可以用在调整压制参数上。
给这 179 帧评分花了 85 秒,评分的时候吃 30% 的 CPU (MacBook Pro 2015),挑一些做报警看起来可以。

黑水 回复

我们确实也打算用这个来评估 h264 265 以及一些参数不同调整。 ffmpeg2vmaf 支持从线上流截取视频吗?

@zhangzhao_lenovo
ffmpeg2vmaf 只是 ffmpeg 命令管道,把其他格式转成 .yuv 再给 run_vmaf
有个下载在线视频常见的用法是 ffmpeg + youtube-dl 或者 ffmpeg + You-Get 。不过测试自己的网站应该没必要这样吧,和分发 CDN 之前在服务端做有什么区别吗

黑水 回复

我们在 h265 基础上做了一些新的尝试,包括一些参数 cdn 那块也联动调整。 老板要评测 cdn 之后的流

7楼 已删除
剪烛 专栏文章:视频质量评估工具 VMAF 安装 (Mac、Linux) 中提及了此贴 05月15日 20:43

兄台在联想哪个部门?

黑水 #10 · 2020年11月10日 Author
LTV 回复

不在联想呀

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册