假设我有相同的视频材料编码在两个(或更多)文件中。我想对它们运行一些实用程序,以基本方式指出哪个文件的质量“最好”。“基本”意味着我想获得逐一比较不同方面(例如视频分辨率、视频比特率、音频采样率、音频比特率等)的报告,然后获得一个综合评分。
这就是关于功能,但是为了使该实用程序真正可用,它应该是开源和命令行的。
答案1
我从事视频质量研究,很难对“哪个视频更好”这个问题给出简单的答案。尤其是当你有两个来自同一来源的剪辑,但无法访问原始来源时(例如,从“互联网”上获取的电影的两个副本)。
理想情况下,你想要的是一个能给你平均意见得分(MOS)视频的评分标准,即1到5之间的数字,或0到100之间的数字,对应于人类感知到的质量。
如果您想要实用工具,则可以跳过下一部分。
简介:为什么不能简单地比较比特率/分辨率/等等。
仅比较视频分辨率并不能说明质量。事实上,它可能完全是误导。700MB 大小的 1080p 电影翻录可能看起来比 700MB 大小的 720p 翻录更糟糕,因为前者的比特率太低,从而引入了各种压缩伪影。
同样,在类似帧大小下比较比特率时也是如此,因为不同的编码器实际上可以在较低的比特率下提供更好的质量,反之亦然。例如,使用 XviD 制作的 720p 700MB 翻录看起来会比使用 x264 制作的 700MB 翻录更差,因为后者效率更高。
如果涉及不同的分辨率,情况会变得更加复杂。人类对低比特率伪影的厌恶程度要高于低分辨率,因此 540p 视频能看起来比 720p 视频更好,这取决于它的编码方式。
你还必须定义最终的“总分”(MOS)是如何由各个质量因素组成的。这沉重取决于多种因素,包括但不限于:
- 您正在比较的视频类型(卡通、电影、新闻等)
- 编码前的原始质量(你可以用高比特率编码一个坏文件,但它不会使文件质量变好)
这只是在谈论纯粹的压缩质量。我们甚至没有谈论不同的人对视频的看法。假设你有一个朋友正在看电影,因为他或她喜欢清晰的细节和高运动分辨率。他们在看到低质量的翻录时会比那些只是为了看电影的朋友更加挑剔他们的内容。他们可能不会太在意质量,只要电影有趣或有娱乐性就行。
有不同类型的视频质量指标!
有几种所谓的视频质量指标,可根据用于确定质量的信息类型进行分类。原则上,简单来说,您可以区分以下几种:
无参考指标– 您有一个视频作为输入,并希望获得质量分数。在比较两个剪辑而无法访问原始剪辑的情况下,您正在寻找无参考度量,因为你无法访问原始视频。这样的指标将采用一个视频并输出一个质量分数。以下是一些例子NR 指标可以检测到的问题(例如模糊、块状)。由于各种原因,没有提供单一输出质量分数的准确 NR 模型。而且这些 NR 指标无法轻松区分原始视频源的问题(例如模糊的手机摄像头)与编码引入的问题(例如降级)。
全参考指标– 您有原始视频和编码视频,并且想要一个质量分数。例如,您可以拍摄一部蓝光电影,然后从中创建两个翻录,并使用全参考指标来估计质量损失和翻录。这通常需要更长的时间来计算,但它比 NR 指标准确得多。请注意,对于 FR 指标,源视频和降级视频应具有相同的分辨率 - 如果不是,您必须先升级降级视频,以便其分辨率与源视频匹配。
请注意,上述指标着眼于视频编码质量,但也有一些指标考虑了诸如流式传输视频时的初始加载时间和停顿事件等问题(例如ITU-T P.1203)。
我可以使用什么工具?
以下是可用于测试视频质量指标的现成工具列表:
- VMAF – 视频多方法评估融合Netflix(更多信息这里)
- VQMT – 视频质量测量工具由瑞士洛桑联邦理工学院 (EPFL) 开发,结合了多种指标
- MSU 视频质量工具是一款商业软件,结合了多种指标
- AVQT– Apple 自己的视频质量工具,于 WWWDC 2021 上首次亮相。
- ITU-T P.1203 实施用于分析 HTTP 流媒体质量
- ITU-T P.1204.3实施用于分析 H.264、H.265 和 VP9 编码的比特流
- P.1204.3 扩展(也称为 AVQBits)基于 P.1204.3 标准,但无需比特流即可使用(由于 Python 依赖性,使用起来不那么简单;免责声明:我隶属于该小组)
- FF指标,用于 FFmpeg 中多个视频质量指标的 Windows GUI
- ffmpeg 质量指标,FFmpeg 的 Python 包装器,用于计算多个视频质量指标(免责声明:我自己编写的)
现在有哪些指标?
PSNR、PSNR-HVS 和 PSNR-HVS-M
对于初学者,峰值信噪比(峰值信噪比)是一种非常简单但不太好的视频质量评估方法。它对于大多数应用程序和快速诊断来说效果相对较好,但无法很好地评估人类对质量的感受。
换句话说,只有在没有其他方法可用时才使用 PSNR。不准确而且表现相当糟糕。
PSNR 可以逐帧计算,然后您可以例如平均整个视频序列的 PSNR 来获得最终分数。PSNR 越高越好。可以使用 ffmpeg计算PSNR。
PSNR-HVS 和 PSNR-HVS-M 是 PSNR 的扩展,试图模拟人类的视觉感知,因此它们应该更准确。虚拟质谱和密歇根州立大学可以计算两个视频之间的PSNR,PSNR-HVS和PSNR-HVS-M。
SSIM、MS-SSIM
结构相似性(SSIM)与 PSNR 一样易于计算,并且能够提供更准确的结果,但仍然是逐帧计算的。ffmpeg 可以计算 SSIM(使用此命令但替换psnr
为ssim
)。
您还可以使用虚拟质谱或者密歇根州立大学或我的Python 工具。VQMT 和 MSU 还包括 MS-SSIM,它比 SSIM 给出更好的(即更具代表性的)结果,以及一些其他衍生产品。
结果应该与 PSNR 相似,但 SSIM 更准确。同样,您需要将参考与处理后的视频进行比较才能实现此目的,并且两个视频的分辨率应相同。
军事空军
视频多方法评估融合Netflix 开发的一套工具可以根据一些现有指标来计算视频质量,然后通过机器学习方法将这些指标融合成 0 到 100 之间的最终分数。Netflix 有解释整件事在这里:
[VMAF] 通过组合多个基本质量指标来预测主观质量。基本原理是,每个基本指标在源内容特征、伪像类型和失真程度方面可能都有自己的优点和缺点。通过使用机器学习算法(在我们的例子中是支持向量机 (SVM) 回归器)将基本指标“融合”为最终指标,为每个基本指标分配权重,最终指标可以保留各个指标的所有优势,并提供更准确的最终分数。
VMAF 已成为视频行业衡量视频质量的事实标准。它的表现好多了比 PSNR 和 SSIM 更好,它还考虑了视频特有的属性,例如运动。同样,您比较的视频必须具有相同的分辨率;如果不是,则将较低分辨率的视频升级。
你也可以用于ffmpeg
计算VMAF分数, 或者我自己的工具。
视觉质量管理
这视频质量指标已在视频质量专家组(VQEG)是一种很好的全参考算法。您可以免费下载 VQM 或使用 MSU 的实现。
当您注册并下载时,您想使用NTIA 通用模型或者具有可变帧延迟的视频质量模型。
该模型效果很好,但它是在 21 世纪初训练的,因此 VMAF 显然是更好的选择。
AVQT
苹果已经开发他们自己的视频质量工具(高级视频质量工具,AVQT),它以全参考方式工作,因此需要输入视频和降级版本。您只能在配备 Apple Silicon 处理器的 Apple 机器上使用此功能。
到目前为止,关于该工具的工作原理还知之甚少。与 VMAF 等其他工具相比,它可以处理更大的显示分辨率甚至 HDR。然而,其准确性尚未得到独立验证。
国际电联 P.1204.3
这是基于比特流的视频质量评估的 ITU-T 标准。它是一种短期视频质量预测模型,使用完整比特流数据来估计片段级别的视频质量分数(针对长度约为 10 秒的片段)。
参考实现可以是在 GitHub 上找到。
已经证明表现良好,即使没有源视频,也能实现与 VMAF 类似的性能。
还有其他型号基于P.1204.3无需比特流即可使用,即如果您只有编解码器、比特率、帧率和分辨率信息。如果您手头没有视频文件,这对于分析目的更有用。
其他指标
它们都是商业解决方案,并且您找不到可供下载的软件。
ITU 也有一些关于无参考指标的标准,例如ITU-T P.1201和ITU-T P.1202,它们使用来自 IPTV 流媒体比特流的参数。然而,这些已经过时了,可能不应该再使用了。
ITU-T P.1203可用于自适应流媒体的情况;它会考虑初始加载延迟、停顿和随时间推移的质量切换,以生成总体质量分数。但是,当您只想比较两个视频片段时,它并不那么准确。为此,您应该使用完整参考模型(如 VMAF)或更准确的基于比特流的模型(如 P.1204.3)。
概括
如果您只是想比较简单的客观可衡量的标准,例如:
- 框架大小
- 比特率
- 每秒帧数
- 视频分辨率
… 简单调用ffprobe input.mp4
应该会在一开始就为您提供所需的所有详细信息。然后您可以在电子表格中总结这一点。请注意,当您对视频进行编码时,x264
例如,如果需要,会将诸如 PSNR 之类的内容直接记录到文件中,以便您以后可以使用这些值。
至于如何衡量这些标准,您可能应该强调比特率——但前提是你知道编解码器/分辨率是相同的。通常可以说,当您拥有同一原始视频的两个编码,并且两个视频都使用 x264 时,比特率较高的那个会更好。当比特率相当低时,您可能会看到低分辨率视频看起来比高分辨率视频更好,因为升级导致的质量下降并不像低比特率导致的质量下降那么严重。
根据比特率比较不同的编解码器不可能除非您对内容和单个编码设置有更多了解。帧速率也是一个非常主观的东西,如果帧速率远低于 25 Hz,则应将其计入测量值。对于此类编解码器间比较,VMAF 或 P.1204.3 等指标将很合适。
如果您没有可用的指标,那就用您的眼睛去看吧!
我非常喜欢维维特,一款可以让你以 1:1 并排比较两个剪辑的工具,看看哪一个看起来更好。有两个版本,一个对于浏览器, 和离线工作。只需加载两个视频,您就会得到一个滑块,您可以使用它来选择要比较的视频部分。
类似的工具是视频比较。这里,视频不需要具有相同的分辨率、颜色格式、容器格式、编解码器或持续时间等。它还接受 FFmpeg 命令,例如:video-compare -d -l "setpts=8.0*PTS" -r "setpts=8.0*PTS" videoA.mp4 videoB.mp4
将减慢两个视频的速度,以便您可以通过帧速率转换等检查抖动/运动模糊。
总而言之,如果你手头没有软件工具,那么就特别强调比特率,如果它是你唯一拥有的东西。也别忘了用你的眼睛 :)
答案2
我不知道有什么工具可以给你最终的建议或分数,但是使用FFmpeg,你可以输出你在问题中列出的所有细节。
在命令行中,ffmpeg -i 将列出视频中的信息。从那里,您可以编写脚本来解析信息并根据您认为合适的方式对其进行加权。
答案3
我很惊讶还没有人提到这一点,但我想对 FFmpeg 的建议发表评论。FFmpeg 过滤器建议:
- 峰值信噪比
- 同步同步信号
- 军事空军
仅当两个视频的分辨率相同时才有效。这在我的例子中是一个问题,因为我想比较以两种方式编码的同一个视频:
Resolution:1280x960 Bandwidth:3122000 Codecs:avc1.640028, mp4a.40.2
Resolution:720x544 Bandwidth:4619000 Codecs:avc1.640028, mp4a.40.2
一个分辨率更高,另一个比特率更高。我很好奇哪一个质量“更好”,但你不能用 FFmpeg 来实现这一点。PSNR [1] 和 SSIM [2] 的文档中明确提到了这一点:
为了保证此过滤器正常工作,两个视频输入必须具有相同的分辨率和像素格式。
VMAF [3] 文档中没有提到这一点,但如果你尝试使用不同分辨率的视频,你会得到这样的结果:
输入视频的宽度和高度必须相同。