最近整理一些视频,我发现太多了,就想把一些本来就需要转码的视频缩小一下。因为转码的时候为了弥补损失,我将码率增大了 10-20%,但是如果将 H264 转 HEVC(当然也可以是其他格式),那么或许不用增大码率甚至可以减少码率。

但是码率缩小多少好呢?

HEVC 的体积一般是 H264 的 50-80%,但是这个跨度也不小。

肉眼观察太难评了,而且每次都这样很麻烦,我就找了一些技术评判方法,来找到合理的缩小值。

FFMPEG 支持 SSIM(Structural Similarity Index,结构相似性指数),可以评估两个视频之间的差别。我们就使用这个指标。

在转码的时候,我们首先要考虑原视频的码率。因为码率极大的情况下,码率哪怕只有原来的 5%,效果也不会下降太多。而在低码率的情况下,下降 50% 就会带来很大的影响。

其次我们需要考虑我们能接受的损失程度是多少。要做到这点,需要通过实验,建立 SSIM 和人肉眼看到的情况之间的关系。

SSIM 测试

这里需要说明一下,SSIM 只是一个参考,它只是从某种角度上表示转码前后的损失度,重点还是我们肉眼看到的情况。

首先这个测试分两类:第一次我用 Blackmagic Camera 这个 App 拍摄 220Mbps 码率的 4K H264 视频,文件大小 80MB;第二次我截取一个 5700Kbps 1080P 流媒体电影片段,文件大小 100 MB,分别代表两种可能的情况。

本节转码时,编码均使用显卡加速。

对比测试命令如下:

ffmpeg -i 第一个文件路径 -i 第二个文件路径 -lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim" -f null -

这里我使用的是-lavfi "[0:v]settb=AVTB,setpts=PTS-STARTPTS[main];[1:v]settb=AVTB,setpts=PTS-STARTPTS[ref];[main][ref]ssim",而不是网上常见的-filter_complex ssim,是因为我的两个视频如果用这个会识别错误。你可以根据你自己的情况修改一下。

你会看到一个类似编码的过程,然后看到最终的结果:

SSIM Y:0.986175 (18.593297) U:0.995715 (23.680221) V:0.995205 (23.192565) All:0.989270 (19.693974)

它分别显示了 YUV 和总共的 SSIM。

可以看到在高码率的情况下,视频压到 10% 码率的时候曲线才出现了波动,当然在肉眼观察的时候也发现此处开始,画质有明显的下降,比如没有那么锐利了(由于素材不咋地,就不放截图了)。

请添加图片描述

我们把图表纵轴上下限修改一下,可以更精确的看到变化情况:

请添加图片描述

当在常见的流媒体码率下,只要压到 50% 左右,SSIM 就开始有较大损失,虽然肉眼可以发现画质损失了,但是不明显,依旧属于能看。但是当压到 10% 的时候,那就很无语了。

注意下图的上下限和上图不一样。

请添加图片描述

下面第一张是原文件,第二张是 45% 码率的,第三张是 10% 码率的。可以看到第三张的画质损失严重:

请添加图片描述
请添加图片描述
请添加图片描述

根据数据可以发现,如果码率相比 100% 码率的情况下, SSIM 差距达到 0.01,那么画质会有肉眼可见的损失。如果达到 0.05 -0.1,那么会有很严重的画质损失。

SSIM 仅供参考

这里再次强调一下,SSIM 只是一个参考,它只是从某种角度上表示转码前后的损失度,重点还是我们肉眼看到的情况。不要本末倒置。

比如在一些特殊情况下,两个完全不同的视频的 SSIM 可能能达到 0.9 的级别。只不过我们在测试原视频和转码文件的时候这个指标可以当做参考。

同码率下转码一定有损失

首先这种换编码的转化一定有损失,那怕不降低码率甚至提高 20% 的码率也会有损失,上面的测试中你也可以看到 100% 的时候 SSIM 也不为 1(5700K 测试 为 0.992643,而 220m 的结果为 0.896002)。如果你使用--lossless可以保证无损,但是码率会高很多,不划算。

关于无损转码的详细说明可以看 x265 - readthedocs。

选择 75% 码率

根据上面的测试,我们可以看到 50% 左右一定会损失画质,只是不明显罢了,但是 50% 到 100% 这区间,可以看到变化不大,我们可以取中间值。

此外,在 Blackmagic Camera App 中, H264 的编码为 220Mbps,而 HEVC 的编码为 160Mbps,约为73%。

所以选择 75% 码率是一个比较合理的选项。

在完整转码一个约 680 MB 的文件视频后,得到 SSIM 为 0.989270,肉眼可见没啥区别。证明这个比例是比较合适的,节约了四分之一的体积,虽然小文件没什么区别,但是 1TB 变成 0.75 TB,还是差距巨大的

H264 转 HEVC

在使用 FFMPEG 将 H264 转为 HEVC,请使用以下命令:

ffmpeg -c:v h264_cuvid -i 输入文件路径 -c:v hevc_nvenc -b:v 码率 -tag:v hvc1 输出文件路径

解释一下:

  • -c:v libx265:表示使用 libx265 软件编码器。
  • -b:v 码率:这里设置码率,需要注意如果是大码率,比如上面的 220Mbps 这种级别,不要使用220m,而是应该使用220000k,因为前者可能会导致转码后的码率非常低,比如我在测试过程中发现,使用220m转码后只有7562 kb/s,这差距太大了。
  • -tag:v hvc1:这部分是为了支持 Apple 的 HEVC,不然你转码完的视频会发现无法使用 Mac 等苹果设备的播放器播放。

如果你需要使用 Nvidia 硬件加速,那么使用以下命令:

ffmpeg -c:v h264_cuvid -i 输入文件路径 -c:v hevc_nvenc -b:v 码率 -tag:v hvc1 输出文件路径

解释一下:

  • -c:v h264_cuvid表示使用硬件解码器。如果你的格式出现问题,那么不要用这个,使用软件解码兼容性更高,而且速度没啥区别,就是 CPU 利用率高。
  • -c:v hevc_nvenc:表示使用 NVENC 的 HEVC 硬件编码器。

希望能帮到有需要的人~

参考资料/扩展阅读

Structural similarity index measure - Wikipedia:SSIM 的维基百科,里面解释了 SSIM 是如何计算的。

H.265/HEVC Video Encoding Guide - FFMPEG:FFMPEG 官方关于 HEVC 的编码指南。如果你需要使用 HEVC 编码,那么建议看看这个指南。

11.237 ssim - FFmpeg Filters Documentation:FFMPEG 关于 SSIM 的文档。

此外感谢豆包帮我把输出转换成表格,方便我制图。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92929.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92929.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92929.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端,route路由

路由定义与导航动态路由匹配&#xff1a;参数传递&#xff08;/user/:id&#xff09;嵌套路由配置与 <router-view> 层级渲染编程式导航&#xff1a;router.push、router.replace 和 router.go路由守卫与权限控制全局守卫&#xff1a;beforeEach、beforeResolve、afterEa…

Kubernetes网络原理深度解析

Kubernetes网络原理深度解析 1 Kubernetes网络模型 Kubernetes 网络模型是其实现容器化应用高效通信的基础框架。它致力于解决容器编排环境中复杂的网络连通性、服务发现与负载均衡等问题&#xff0c;追求让容器、Pod 等网络端点像传统主机网络一样简洁、可预测地通信 。其核心…

Python3.10 + Firecrawl 下载 Markdown 文档:构建高效通用文章爬虫

在信息爆炸的时代&#xff0c;从各种网站收集和整理文章内容已成为许多开发者和研究人员的常见需求。无论是为了内容聚合、数据分析还是知识管理&#xff0c;一个高效、稳定的通用文章爬虫都是不可或缺的工具。 本文将详细介绍如何使用 Python 3.10 结合 Firecrawl API 构建一个…

国产3D大型装配设计新突破②:装配约束智能推断 | 中望3D 2026

本文为CAD芯智库整理&#xff0c;未经允许请勿复制、转载&#xff01;→ www.xwzsoft.com/h-nd-605.html中望3D2026亮点速递之【装配篇】已经介绍了设计效率的提升&#xff0c;今天将分享的是中望3D2026【装配约束智能推断】&#xff0c;也预告一下第三篇是讲解【组件复用效率提…

深入浅出设计模式——行为型模式之观察者模式 Observer

文章目录1.观察者模式简介2.观察者模式结构3.观察者模式代码实例3.0.公共头文件3.1.观察者3.1.1.抽象观察者Observer3.1.2.具体观察者Player3.2.目标类3.2.1.抽象目标AllyCenter3.2.2.具体目标AllyCenterController循环包含错误示例“前向声明什么时候不够、必须 #include 对方…

CA证书、SSL加速器、HTTPS、HTTP和域名之间的关系

理解CA证书、SSL加速器、HTTPS、HTTP和域名之间的关系对于构建安全、高效的网站至关重要。它们共同构成了现代安全网络通信的基础。下面是它们各自的概念以及它们之间的关系&#xff1a;域名 概念&#xff1a; 人类可读的网站地址&#xff08;如 www.example.com&#xff09;。…

3D感知多模态(图像、雷达感知)

一.BEVFusion1.简要介绍BEV是一个俯视空间&#xff0c;Fusion做的就是融合&#xff0c;这里指的就是图像和点云的融合。那如何把图像和点云融合在一起&#xff1f;认为融合方法有三种&#xff1a;a.point level fusion:点集的融合&#xff0c;从点云中采样一些点,再根据相机的内…

STM32 HAL库驱动W25QXX Flash

STM32 HAL库驱动W25QXX Flash 1. 概述 W25QXX系列是一种SPI接口的Flash存储器&#xff0c;广泛应用于嵌入式系统中作为数据存储设备。本文档详细介绍了基于STM32 HAL库的W25QXX Flash驱动实现&#xff0c;包括硬件连接、驱动函数实现以及使用示例。 项目源码仓库&#xff1a…

Vivado自定义IP核学习笔记

文章目录【1】创建一个新的IP核【2】实现功能【3】编辑IP核【4】IP封装【5】创建Vivado工程【1】创建一个新的IP核 1.1 打开Vivado->点击【Tasks->Manage IP->New IP Location】->弹出窗口1.2 【Next】->设置IP属性->【Finish】->【OK】 【IP Location】…

【面试】高级开发面试场景题

1、如何保证MySql到ES的数据一致性? 答:ES是一个开元分布式搜索和分析引擎、它提供了全文搜索、结构化搜索分析以及这些组合的能力。 全文搜索能力:ES支持复杂的搜索能力,包括模糊匹配、短语查询、布尔查询等,并且可以快速的返回结果 实时数据分析:实时数据分析,支持对…

《 慢 SQL 分析与 SQL 优化实战指南》

&#x1f50d; 慢 SQL 分析与 SQL 优化实战指南、 &#x1f9e0;前言 在数据库性能调优中&#xff0c;慢 SQL 是性能瓶颈的常见元凶。 一次慢查询可能会拖垮整个业务线程池&#xff0c;甚至引发锁等待、雪崩效应。 对后端开发与 DBA 而言&#xff0c;快速定位并优化慢 SQL&am…

C#中如何运用JWT用户认证

一、JWT概述JSON Web Token&#xff08;JWT&#xff09;是一种轻量级的身份认证机制&#xff0c;广泛应用于分布式系统中的用户认证。它通过紧凑的JSON格式存储用户身份信息&#xff0c;并使用数字签名确保信息的完整性和真实性。与传统的基于Session的认证相比&#xff0c;JWT…

Hibernate 使用详解

在现代的Java开发中&#xff0c;数据持久化是一个至关重要的环节。而在众多持久化框架中&#xff0c;Hibernate以其强大的功能和灵活性&#xff0c;成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法&#xff0c;希望能为广大开发者提供一些有…

【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)

基于 YOLO12 与 OpenCV 的实时点击目标跟踪系统 在计算机视觉领域&#xff0c;目标检测与跟踪是两个核心任务。本文将介绍一个结合 YOLO 目标检测模型与 OpenCV 跟踪算法的实时目标跟踪系统&#xff0c;该系统允许用户通过鼠标交互选择特定目标进行持续跟踪&#xff0c;支持多…

【数据库】 MySQL 表的操作详解

在 MySQL 数据库的日常开发与维护中&#xff0c;表的操作是最基础且最常用的部分。本文将从 创建表、查看表结构、修改表 以及 删除表 等方面进行详细讲解&#xff0c;并附上对应的 SQL 语句示例&#xff0c;方便在实际项目中直接应用。一、创建表 1.1 创建表语法 CREATE TABLE…

DiT: Transformer上的扩散模型

论文&#xff08;ICCV 2023&#xff09;&#xff1a;Scalable Diffusion Models with Transformers 代码和工程网页&#xff1a;https://www.wpeebles.com/DiT.html DiTs&#xff08;Diffusion Transformers&#xff09;是首个基于Transformer架构的扩散模型&#xff01;它在…

MySQL 索引:索引为什么使用 B+树?(详解B树、B+树)

文章目录一、二叉查找树(BST)&#xff1a;不平衡二、平衡二叉树(AVL)&#xff1a;旋转耗时三、红黑树&#xff1a;树太高由一个例子总结索引的特点基于哈希表实现的哈希索引高效的查找方式&#xff1a;二分查找基于二分查找思想的二叉查找树升级版的BST树&#xff1a;AVL 树四、…

ESP32入门开发·VScode空白项目搭建·点亮一颗LED灯

目录 1. 环境搭建 2. 创建项目 3. 调试相关介绍 4. 代码编写 4.1 包含头文件 4.2 引脚配置 4.3 设置输出电平 4.4 延时函数 4.5 调试 1. 环境搭建 默认已经搭建好环境&#xff0c;如果未搭建好可参考&#xff1a; ESP32入门开发Windows平台下开发环境的搭建…

ONLYOFFICE AI 智能体上线!与编辑器、新的 AI 提供商等进行智能交互

ONLYOFFICE AI 插件​迎来重要更新&#xff0c;带来了新功能和更智能的交互体验。随着 AI 智能体&#xff08;现为测试版&#xff09;的上线、带来更多 AI 提供商支持以及其他新功能&#xff0c;AI 插件已经成为功能强大的文档智能助理。 关于 ONLYOFFICE ONLYOFFICE 文档是多…

【C++进阶学习】第十一弹——C++11(上)——右值引用和移动语义

前言&#xff1a; 前面我们已经将C的重点语法讲的大差不差了&#xff0c;但是在C11版本之后&#xff0c;又出来了很多新的语法&#xff0c;其中有一些作用还是非常大的&#xff0c;今天我们就先来学习其中一个很重要的点——右值引用以及它所扩展的移动定义 目录 一、左值引用和…