文档章节

利用简单工具进行客观视频质量分析

张旭0512
 张旭0512
发布于 2016/07/11 11:06
字数 633
阅读 268
收藏 3
点赞 0
评论 0

#利用简单工具进行客观视频质量分析

1. 主要工具:

ffmpeg, eavlvid

其中eavlvid的下载地址:http://www2.tkn.tu-berlin.de/research/evalvid/EvalVid/evalvid-2.7.tar.bz2

其实只使用了psnr,编译的时候,用“make psnr”即可。

psnr命令行使用方法: psnr x y <YUV format> <src.yuv> <dst.yuv> [multiplex] [ssim]

psnr使用方法图

例如: ./psnr 1920 1080 420 haoshengyin_420.yuv qsv-1080p.yuv ssim > qsv_ssim.csv

2. 主要流程

源YUV文件 -> ffmpeg编码(硬编或软编)-> ffmpeg解码生成YUV文件 -> YUV文件比对,生成psnr和ssim数据 -> 图表分析数据 -> 得出结论

3. 代码设计

编码语言用shell即可。

用例生成模块:

因子: 编码方式(软编或硬编), 码率, GOP值, preset, profile, 生成用例 -> 调用单个文件比对单元

单个文件比对单元:

源YUV文件 -> ffmpeg编码 -> 解码成YUV -> 利用工具获取yuv比对数据 -> 删除解码生成的yuv文件 传入参数: 源YUV文件路径, YUV比对数据路径, 编码方式(软编或硬编), 码率, GOP值, preset, profile

附代码:


#!/bin/bash

# functions
function exit_if_error()
{
    if [ "$?" != "0" ]; then
        echo "error!!!!!  "
        echo "++++++++++stack top++++++++++"
        declare i
        declare level=${#FUNCNAME[@]}
        for((i=1;i<level;i++))
        do
            [ x"${FUNCNAME[$i]}" != x ] && \
                echo -e "in ${FUNCNAME[$i]}()   at ${BASH_SOURCE[$i]}: ${BASH_LINENO[((i-1))]}"
        done

        echo "----------stack buttom-------"
        exit 1
    fi

}


function do_one_analysis()
{
    echo "use encode_type:"$1 "bit_rate:"$2 "gop_size:"$3 "preset:"$4 "profile:"$5
    encode_type=$1
    bit_rate=$2
    gop_size=$3
    preset=$4
    profile=$5


    # to generate ffmpeg command, 
    #e.g: ./ffmpeg -s 1920x1080 -i haoshengyin_420.yuv  -vcodec h264_qsv -b 1000k -s 1280x720 -f mp4 -y qsv.mp4
    dst_path="$dst_dir/${encode_type}_${bit_rate}_gop${gop_size}_${preset}_${profile}.mp4"
    encod_cmd="${ffmpeg_path} -s ${src_width}x${src_height} -i $src_yuv -vcodec $encode_type -b $bit_rate -s ${src_width}x${src_height} -g ${gop_size} -preset $preset -profile $profile -f mp4 -y $dst_path" 
    echo "encod_cmd: $encod_cmd"

    # to encode
    ${ffmpeg_path} -s ${src_width}x${src_height} -i $src_yuv -vcodec $encode_type -b $bit_rate -s ${src_width}x${src_height} -g ${gop_size} -preset $preset -profile $profile -f mp4 -y $dst_path
    exit_if_error

    dst_yuv_path="${dst_path}.yuv"
    decode_com="${ffmpeg_path} -i ${dst_path} -pix_fmt yuv420p -y ${dst_yuv_path}"
    echo "decode_com: $decode_com"

    # to decode
    ${ffmpeg_path} -i ${dst_path} -pix_fmt yuv420p -y ${dst_yuv_path}
    exit_if_error

    # to generate analysis cmd
    # e.g: ./psnr 1920 1080 420 haoshengyin_420.yuv qsv-1080p.yuv ssim > qsv_ssim.csv

    analysis_cmd_psnr="${analysis_bin} ${src_width} ${src_height} 420 ${src_yuv} ${dst_yuv_path} > ${dst_path}_psnr.csv"
    echo "analysis_cmd_psnr:${analysis_cmd_psnr}"
    ${analysis_bin} ${src_width} ${src_height} 420 ${src_yuv} ${dst_yuv_path} > ${dst_path}_psnr.csv
    exit_if_error

    analysis_cmd_ssim="${analysis_bin} ${src_width} ${src_height} 420 ${src_yuv} ${dst_yuv_path} ssim > ${dst_path}_ssim.csv"
    echo "analysis_cmd_ssim:${analysis_cmd_ssim}"
    ${analysis_bin} ${src_width} ${src_height} 420 ${src_yuv} ${dst_yuv_path} ssim > ${dst_path}_ssim.csv
    exit_if_error

    # clean the no need yuv file
    rm -rf ${dst_yuv_path}
}

function Analysis()
{
    echo "Analysis begin"

    for rate in $g_bit_rate
    do
        #echo "use bit_rate:"$rate
        for gop in $g_gop_size
        do
            #echo "use gop_size:"$gop
            for preset in $g_presets
            do
                #echo "use preset:"$preset
                for profile in $g_profiles
                do
                    #echo "use profile:"$profile
                    for codec in $g_encode_type
                    do
                        #echo "use codec:"$codec
                        do_one_analysis $codec $rate $gop $preset $profile

                    done

                done

            done

        done

    done

}



# globle params
g_encode_type="libx264 h264_qsv"
g_bit_rate="1000k 1500k 2000k 2500k"
g_gop_size="25 50 100"
g_presets="veryfast medium veryslow"
g_profiles="baseline main high"

# the source yuv path
src_yuv="/home/haoshengyin_420_deinterlace.yuv"
src_width=1920
src_height=1080
dst_dir="/home/test"

ffmpeg_path="/home/ffmpeg"
analysis_bin="/home/psnr"

# to analysis
Analysis 

© 著作权归作者所有

共有 人打赏支持
张旭0512
粉丝 40
博文 136
码字总数 30203
作品 0
朝阳
程序员
[总结]视频质量评价技术零基础学习方法

前段时间略忙,因此一直计划要总结的很多东西都没来得及写,这两天趁着空闲时间写上一篇。以后等时间充裕了再补充一些内容。本文总结一下学习视频质量评价技术的方法。视频质量评价是我研究生...

leixiaohua1020
2014/04/21
0
0
视频质量评价方法:VQM

如何确定一个视频质量的好坏一直以来都是个棘手的问题。目前常用的方法就是通过人眼来直接观看,但是由于人眼的主观性及观看人员的单体差异性,对于同样的视频质量,不同的人的感受是不一样的...

leixiaohua1020
2013/10/13
0
0
【省带宽、压成本专题】降低30%视频码率,深挖“窄带高清”的实现原理

过去几年,又拍云一直在点播、直播等视频应用方面潜心钻研,取得了不俗的成果。我们结合点播、直播、短视频等业务中的用户场景,推出了“省带宽、压成本”系列文章,从编码技术、网络架构等角...

又拍云
05/15
0
0
AV1显著超越H.265和VP9?—MSU最新比较公布

本文转载自“煤矿工厂”。莫斯科国立大学(MSU)开启了一项从主观层面对比视频质量的服务,本文是他们对AV1和VP9、HEVC编码质量的测试结果。 前言 最新的编码质量对比研究表明,视频编码标准...

LiveVideoStack
02/02
0
0
讲解视频质量,视频质量测试,主观客观评价视频质量

1 从模拟信号到数字信号 2 客观视频质量 3 主观视频质量 4 参见 5 参考 视频质量是量化一段视频通过视频传输/处理系统时画面质量变化(通常是下降)程度的方法。由于视频处理系统可能会导致...

mazhitong1020
2017/05/24
0
0
视频编码器评测系统:VideoCodecRank

视频编码器领域一直有个比较复杂的问题:mpeg2、divx、xvid、mpeg4、vp8、vp9、x264、openh264、x265等等这一系列编码器到底哪个好?而对于同一种视频编码器,又包括了各种各样的参数配置,这...

leixiaohua1020
2015/07/04
0
0
Python数据分析学习路径图(120天Get新技能)

Python是一种面向对象、直译式计算机程序设计语言,由Guido van Rossum于1989年底发明。由于他简单、易学、免费开源、可移植性、可扩展性等特点,Python又被称之为胶水语言。下图为主要程序语...

数据007
2016/01/22
0
0
来给你的微信公众号做个诊断吧

之前我曾在博客上介绍过如何利用西瓜公众号工具找爆文的文章,让很多运营公众号的朋友解决了大量内容的问题,得到不少好评,最近他们又推出了一款名为“公众号诊断”的工具。 这个工具也挺实...

卢松松
2015/10/19
73
0
QoE的定义及影响因素

QoE标准的定义,摘自论文《用户体验质量(QoE)的模型与评价方法综述》(林闯,胡杰,孔祥震) 现有的文献给出了许多关于QoE定义和影响因素的讨论,但是没有形成一个统一的论述.下面我们将在这...

leixiaohua1020
2013/10/07
0
0
厉害了我的琴!钢琴教育竟然用上了AI+云计算?

随着AI技术越来越成熟,许多传统行业也逐渐向互联网+的方向发展。如果学钢琴能加入AI新科技,是不是就能将学琴者从枯燥无味的学习过程中解脱出来,钢琴老师也将happy教学呢? 近日,广东琴趣...

zabenbrdit36243qnjx1
2017/12/14
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

崛起于Springboot2.X之开发拦截器(21)

序言:几乎所有项目都需要拦截器,所以小伙伴们必须要掌握这门技术哦,不然只会mybaits增删改查那是实习生干的活呀。 1、创建拦截器类,implements HandlerInterceptor public class MyInce...

木九天
9分钟前
0
0
(转)SQL语句的执行顺序

(7) SELECT (8) DISTINCT <select_list> (1) FROM <left_table> (3) <join_type> JOIN <right_table> (2) ON <join_condition> (4) WHERE <where_condition> (5) GROUP BY <group_by_list> (......

Avner
18分钟前
0
0
1.14 救援模式

确保开机启动时连接镜像文件,如果是真机服务器,就需要:U盘或光盘镜像启动进入BIOS 不同主板进入bios按键不同,一般是F12或Esc 光标:移动到Boot(开机启动项) 减号移动:光标选中行,按-...

小丑鱼00
25分钟前
0
0
ES11-全文检索

高级别全文检索通常用于在全文本字段(如电子邮件正文)上运行全文检索。 他们了解如何分析被查询的字段,并在执行之前将每个字段的分析器(或search_analyzer)应用于查询字符串。 1.term查...

贾峰uk
28分钟前
0
0
java 复制对象有哪些方式

java 复制对象有哪些方式 Apache的 Common beanutils库 org.apache.commons.beanutils.BeanUtils.copyProperties(dest,origin); Springframework 的BeanUtil 依赖: <dependency> ......

黄威
44分钟前
1
0
jstack的简单使用

公司测试反应, 一个java应用的机器, 即使不做交易, cpu始终是30%多, 于是想到了jstack, 实践步骤记录一下: 1, 找出java应用的进程号 ps -ef|grep 应用名|grep -v grep 2, 找出pid下的cpu占用...

零二一七
51分钟前
1
0
导入CSV文件就行数据整理分析

#-*-coding:utf-8-*-import csv,os,re,mathlocalPath=input("请输入所有群文件的根目录:") #所有QQ群文件的物理根目录路径def info(): info_dic=[] dirList=os.listdi...

Kefy
今天
5
0
CoreText进阶(六)-内容大小计算和自动布局

CoreText进阶(六)-内容大小计算和自动布局 其它文章: CoreText 入门(一)-文本绘制 CoreText入门(二)-绘制图片 CoreText进阶(三)-事件处理 CoreText进阶(四)-文字行数限制和显示更...

aron1992
今天
1
0
一个Unity高人的博客,涉猎范围很广,深度也很深。

https://blog.csdn.net/ecidevilin/article/list/

爽歪歪ES
今天
0
0
Spring Cloud Config-Git后端

EnvironmentRepository的默认实现使用Git后端,这对于管理升级和物理环境以及审核更改非常方便。要更改存储库的位置,可以在Config Server中设置“spring.cloud.config.server.git.uri”配置...

itcloud
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部