以原始视频为参考,将转码后的视频与原始视频进行对比是评价视频质量的一类方法,这类方法属于视频质量评测中的全参考方法,精确性较高。一段视频由大量的视频帧组成,如果原始视频和转码后视频的每一帧都是同步的,可以从两个视频中各取对应的一帧,对这两帧进行比较,使用一些算法去统计、评估两个视频的差异,进而得到一些客观上的指标。目前常见的全参考评测指标有峰值信噪比(Peak signal-to-noise ratio,PSNR)、结构相似性(Structural Similarity,SSIM)、视频多方法评估融合(Video Multimethod Assessment Fusion,VMAF) 等,一些开源的媒体处理库(如 FFmpeg)提供了这些指标的计算方式。
从单个评测指标中可以看出转码后的视频与原始视频之间的质量差异,为评估不同转码方式(编码器)之间的差异,需要知道编码器输出的流在不同码率下的质量。可以使用每个编码器对原始视频转码多次,输出多路不同码率的转码视频,计算这些转码视频的评分,然后以码率为横轴、评分为纵轴绘制一组RD(Rate Distortion)曲线。如下图所示,以横轴为基准,可以看出相同码率下哪个编码器编码出的视频评分较高,有更好的质量;以纵轴为基准,可以看出相同评分下哪种编码器编码出的视频码率更低、更能节省网络带宽。VCEG-M33 提出了一种衡量两种编码器差异的指标 BD-Rate,可以评估两种编码器在编码两路相同质量的流时,两路流在码率上的差异。
RD曲线
常见评测指标及方式
PSNR
峰值信噪比 PSNR 是衡量图像失真的指标,其值越大,通常表明视频中图像的质量越好。其计算方式和意义可参考:https://zh.wikipedia.org/wiki/峰值信噪比。
FFmpeg 提供了psnr filter(https://ffmpeg.org/ffmpeg-filters.html#psnr)来计算两个视频之间的 PSNR,以一个对比视频(如由原始视频转码后得到)和一个原始视频作为输入。两个视频的视频帧在输入到 filter 前必须有相同的分辨率和像素格式,同时也假定两个视频有相同的帧数。示例如下:
# 相同分辨率的编码视频
ffmpeg -i transcode_video.mp4 -i video.mp4 -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]psnr=stats_file=psnr.log" -f null -
# 不同分辨率的编码视频(对齐到高分辨率的原视频)
ffmpeg -i transcode_video_720p.mp4 -i video_1080p.mp4 -lavfi "[0:v]scale=1920x1080,settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]psnr=stats_file=psnr.log" -f null -
# 未编码流(yuv420p)
ffmpeg -video_size 1280x720 -pixel_format yuv420p -i transcode_video.yuv -video_size 1280x720 -pixel_format yuv420p -i video.yuv -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]psnr=stats_file=psnr.log" -f null -
SSIM
结构相似度 SSIM 是一种用以衡量两张图像相似程度的指标,其值越大,通常表明视频中的图像质量越好。其计算方式及意义可参考:https://zh.wikipedia.org/wiki/結構相似性。
FFmpeg 提供了ssim filter(https://ffmpeg.org/ffmpeg-filters.html#ssim)来计算两个视频之间的 SSIM,以一个对比视频(如由原始视频转码后得到)和一个原始视频作为输入。两个视频的视频帧在输入到 filter 前必须有相同的分辨率和像素格式,同时也假定两个视频有相同的帧数。示例如下:
# 相同分辨率的编码视频
ffmpeg -i transcode_video.mp4 -i video.mp4 -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]ssim=stats_file=ssim.log" -f null -
# 不同分辨率的编码视频(对齐到低分辨率的原视频)
ffmpeg -i transcode_video_720p.mp4 -i video_1080p.mp4 -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]scale=1280x720,settb=AVTB,setpts=N[ref];[main][ref]ssim=stats_file=ssim.log" -f null -
# 编码流与未编码流(rgb)
ffmpeg -i transcode_video_720p.webm -video_size 1280x720 -pixel_format rgb24 -i video.rgb -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]ssim=stats_file=ssim.log" -f null -
VMAF
VMAF 是 Netflix 开发的一种视频感知质量融合算法,它结合多个度量指标来对视频质量进行评估,通过机器学习算法将基本指标融合到最终的指标中。其值越大,视频中图像的质量越好。
FFmpeg 提供了libvmaf filter(https://ffmpeg.org/ffmpeg-filters.html#libvmaf-1)来计算两个视频之间的 VMAF,其内部调用了 Netflix 的vmaf库(https://github.com/Netflix/vmaf),以一个对比视频(如由原始视频转码后得到)和一个原始视频作为输入。示例如下:
# 相同分辨率的编码视频
ffmpeg -i transcode_video.mp4 -i video.mp4 -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]libvmaf=log_fmt=json:log_path=vmaf.json:n_threads=8" -f null -
# 不同分辨率的编码视频(对齐到高分辨率的原视频)
ffmpeg -i transcode_video_720p.mp4 -i video_1080p.mp4 -lavfi "[0:v]]scale=1920x1080,settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]libvmaf=log_fmt=json:log_path=vmaf.json:n_threads=8" -f null -
# 未编码流(yuv420p)
ffmpeg -video_size 1920x1080 -pixel_format yuv420p -i transcode_video.yuv -video_size 1920x1080 -pixel_format yuv420p -i video.yuv -lavfi "[0:v]settb=AVTB,setpts=N[main];[1:v]settb=AVTB,setpts=N[ref];[main][ref]libvmaf=log_fmt=json:log_path=vmaf.json:n_threads=8" -f null -
BD-Rate
BD-Rate 全称 Bjontegaard-Delta rate,用于评测不同编码器的 RD(Rate Distortion) 性能。其计算方式如下:
Bitrate-PSNR表格
若 BD-Rate 值为 -N%(N 是非负值),说明当编码出的流质量相同时,编码器 E2 相对编码器 E1 能节省 N% 的码率;若BD-Rate 值为 +N%,说明为编码出相同质量的流,编码器 E2 需要增加 N% 的码率。
开源方案的局限
及腾讯云给出的解决方案
使用 FFmpeg 命令行的方式对视频进行评测存在一些不便和问题:
下面介绍一下可以处理上述问题的方案。
多个视频并行评测
假设输入有 1 个原始视频和 N 个对比视频,并行评测的流程如下:
并行评测
在并行评测过程中,每个视频只被解码了一次,充分利用了 CPU 的多核能力,减小了评测时间,提高了评测效率。在并行评测之前需要评估其对内存资源的消耗,如果并行评测的视频数量过多,并且视频的分辨率、码率较高(如 8K 视频),可能会存在内存溢出的问题。
指定时间区间评测
假设视频时长为 T 秒,指定的时间区间为 [t1, t2],评测流程如下:
指定时间区间评测
指定帧区间评测
假设指定的帧区间为 [f1, f2],评测流程如下:
指定帧区间评测
直播流首帧对齐
如前所述,视频评测的过程是逐帧评分的过程,如果输入的两个视频帧之间没有对应关系,那么评测的结果是没有意义的。对于 HLS/DASH 这类自适应码率的流,分片之间通常是对齐的,保证了帧的同步;对于其它类型的直播流,它们的第一帧可能并不同步,一路流的第一帧可能要早于或晚于另一路流的第一帧,因此需要在评测前对两路流进行分析,找出它们匹配的起始帧,然后从起始帧开始进行评测。
为对齐评测的起始帧,一种方案是从两路流的开头各取一小段视频,将视频再划分成多个小片段,比较这些片段之间的相似性,两个片段的相似性越高,它们互相匹配的可能性就越大。可以基于 PSNR/SSIM/VMAF 等评测指标来做相似性评价,基于指定帧区间评测的能力去计算两个视频片段的评分。
假设有一路源流 S 和 一路转码流 T,从两者中各读取一定时长的片段 s1 和 t1,s1 和 t1 中一定有可以对齐的两帧(即存在两种情况:s1 的第一帧能与 t1 中的某一帧对齐;t1 的第一帧能与 s1 中的某一帧对齐)。流程如下:
评测首帧对齐
评测直播流的一种方案是将其转封装成点播流,然后对点播流进行评测,但需要评估这个过程引入的延时。
MPS视频评测系统
为降低视频评测的使用门槛,提高评测效率,直观展示评测结果,腾讯云媒体处理服务 MPS 上线了视频评测系统。您可前往媒体处理控制台,在【更多服务】中选择【转码评测】,使用相关功能。系统目前提供两种评测功能:视频质量评测和 BD-Rate 评测,可以客观的评估视频质量和不同编码器之间的差异,即将上线直播流转码质量监控。
视频质量评测
视频质量评测用于计算多个视频(一个原始视频和多个对比视频)的 PSNR、SSIM、VMAF 等评分。
用户可以以腾讯云存储 COS、URL 的方式输入原始视频,以腾讯云存储 COS 、 URL、MPS 转码模版的方式输入或创建对比视频。以 MPS 转码模版为输入时,评测系统将先对原始视频进行转码,然后对转码后的视频进行评测。
用户可以自定义评测的时间范围或帧数范围;若输入视频的分辨率不一致,可以选择将评测时的分辨率对齐到高分辨率视频或低分辨率视频。
系统会对输入视频进行评分,获取整体分数和逐帧分数,绘制时间/帧数-分数曲线图,并截取视频中得分最低(质量最差的)若干张视频帧,生成评测报告。用户可以在评测详情页查看评测结果,导出 PDF 格式的评测报告。
系统还支持对输入的多个视频进行同屏对比,在同一页面下同时播放多个输入视频,展示视频帧的分数随时间的变化。
具体用法可参考文档:
https://cloud.tencent.com/document/product/862/103989
BD-Rate评测
BD-Rate 评测用于评估编码器之间的差异。
用户可以以腾讯云存储 COS、URL 的方式输入原始视频,以腾讯云存储 COS、URL、MPS 转码模版的方式输入或创建对比视频。以 MPS 转码模版为输入时,可以选择以指定码率或 CRF 的方式进行转码。用户可以自定义评测的时间范围或帧数范围;若输入视频的分辨率不一致,可以选择将评测时的分辨率对齐到高分辨率视频或低分辨率视频。
系统会对输入视频进行评分,获取每个视频的码率及整体分数,绘制 RD 曲线,展示不同编码方式下码率与评分的关系;计算 BD-Rate,评估不同编码器之间的差异,生成评测报告。用户可以在评测详情页查看评测结果,导出 PDF 格式的评测报告。
RD曲线示例
BD-Rate示例
系统还支持对输入的多个视频进行同屏对比,在同一页面下同时播放多个输入视频,展示视频帧的分数随时间的变化。
具体用法可参考文档:
https://cloud.tencent.com/document/product/862/103990
直播流转码质量监控
直播流转码质量监控用于对转码流的视频帧进行评分,监控流的质量和码率变化,后续腾讯云媒体处理MPS视频测评系统将会上线这项能力。
当前转码评测功能正在内测中,限时免费试用。您可前往【媒体处理控制台】→【更多服务】→【转码评测】中,体验相关功能。
如果您想要进一步了解或使用腾讯云相关能力,欢迎扫描下方二维码添加音视频小姐姐微信,我们将安排产研同学专门跟进您的需求。
腾讯云音视频在音视频领域已有超过21年的技术积累,持续支持国内90%的音视频客户实现云上创新,独家具备腾讯云RT-ONE™全球网络,在此基础上,构建了业界最完整的 PaaS 产品家族,并通过腾讯云视立方 RT-Cube™ 提供All in One 的终端SDK,助力客户一键获取众多腾讯云音视频能力。腾讯云音视频为全真互联时代,提供坚实的数字化助力。