Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >x265无损压缩

x265无损压缩

作者头像
Aidol
发布于 2022-03-24 00:41:32
发布于 2022-03-24 00:41:32
1.1K00
代码可运行
举报
文章被收录于专栏:苦旅苦旅
运行总次数:0
代码可运行

今天接到一个需求,需要把YUV序列转换为无损的MP4。一开始准备是用x264编码,把QP设置为0。但这样压缩后,我比较了一下,发现实际上还是有损的。而且QP设置为0后,普通的播放器根本不能打开,只能用基于ffmpeg的播放器才能正常播放。后来想到265有Transform Quantizer Bypass(TQB)技术,本身就就支持无损编码,遂进行了尝试。

ffmpeg把YUV无损转换为MP4的命令行代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ffmpeg -s 1920x1080 -pix_fmt yuv420p -r 60 -i .\BallUnderWater_1920x1080_60fps.yuv 
-c:v libx265 -preset ultrafast -x265-params lossless=1 output_265.mp4

主要在x265指定了lossless=1(开始无损压缩)参数。

现在我们虽然得到了转换后的MP4文件,但是我想进一步验证得到的文件到底是不是无损的。在查询官方文档的时候我看了官方给出了两种验证方式:

  1. 在转换完成后,命令行中最后一行只要出现lossless compression ratio就表明是无损压缩
  2. 可以通过计算原始YUV的hash值和转换为MP4视频后的hash。若hash值一致,则说明是无损转换。这里是计算整个视频的hash值的例子单独对每一个视频单独帧计算hash值例子

通过计算hash和framehash,发现原始视频的hash和frame与转换后得到的MP4文件的hash和framehash值完全一致。着说明确实是无损压缩。

更进一步,既然是无损压缩,那么把MP4文件转换为YUV(我们叫做新YUV),再计算原始YUV和新YUV的PSNR,那么每一帧的PSNR肯定都是无穷大。为啥是先把MP4文件转换为YUV呢?这是因为MP4文件的timebase和原始YUV的timebase不一致,那么两者的每一帧不能一一对应,其计算出的PSNR就不准确了。 话不多说,开动!

  1. 把MP4文件转换为YUV
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ffmpeg -i .\BallUnderWater_1920x1080_60fps.mp4  newyuv.yuv
  1. 计算两个YUV文件的PSNR
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ffmpeg -s 1920x1080 -pix_fmt yuv420p -r 60 -i .\BallUnderWater_1920x1080_60fps.yuv -s 1920x1080 
-pix_fmt yuv420p -r 60 -i .\newyuv.yuv  -lavfi psnr=stats_file=psnr_logfile.txt -f null -    

最终的PSNR结果如下面两张图,可以看出PNSR确实为无穷大。

平均PNSR

每一帧的PSNR

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022.02.08 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Rust学习笔记之基础概念
今天,我们继续「Rust学习笔记」的探索。我们来谈谈关于「基础概念」的相关知识点。
前端柒八九
2023/03/23
7780
Rust学习笔记之基础概念
Rust基础语法(注释、函数、打印)
函数在 Rust 代码中非常普遍。你已经见过语言中最重要的函数之一:main 函数,它是很多程序的入口点。你也见过 fn 关键字,它用来声明新函数。 Rust 函数的基本形式: fn <函数名> ( <参数> ) <函数体> Rust 代码中的函数和变量名使用 snake case 规范风格。在 snake case 中,所有字母都是小写并使用下划线分隔单词。这是一个包含函数定义示例的程序:
共饮一杯无
2022/11/28
8260
Rust基础语法(注释、函数、打印)
【Rust学习】03_常用编程概念
本章介绍了几乎所有编程语言中出现的概念以及它们在 Rust 中的工作方式。许多编程语言的核心有很多共同点。本章中介绍的概念都不是 Rust 独有的,但我们将在 Rust 的背景中讨论它们,并解释使用这些概念的约定。
思索
2024/07/12
3230
【Rust学习】03_常用编程概念
一网打尽 Rust 语法
大家好,我是「柒八九」。一个「专注于前端开发技术/Rust及AI应用知识分享」的Coder
前端柒八九
2024/04/30
2250
一网打尽 Rust 语法
Rust学习笔记(3)- 变量和可变属性
就会直接报错,会提示不能第二次给不可变的变量赋值(cannot assign twice to immutable variable)。 除非写成这样:
TestOps
2022/04/07
5270
Rust学习笔记(3)- 变量和可变属性
【Rust】001-基础语法:变量声明及数据类型
Rust 入门与实践:https://juejin.cn/book/7269676791348854839?utm_source=course_list
訾博ZiBo
2025/01/06
1130
【Rust】001-基础语法:变量声明及数据类型
rust语句,表达式以及函数
在rust里,语句和表达式的区别是非常重要的。语句没有返回值,表达式有返回值。例如:
zy010101
2022/12/21
2850
rust语句,表达式以及函数
用 rustlings 练习 Rust 语言
In Rust, variables are immutable(不可变的) by default.
早起的鸟儿有虫吃
2025/04/11
1230
用 rustlings 练习 Rust 语言
【Rust 基础篇】Rust 匹配(Pattern Matching)
在 Rust 中,匹配(Pattern Matching)是一种强大的语言特性,它允许我们根据不同的模式来执行不同的操作。匹配可以用于多种情况,例如处理枚举类型、解构元组和结构体、处理条件表达式等。本篇博客将详细介绍 Rust 中的匹配语法,并通过示例代码来说明其用法和优势。
繁依Fanyi
2023/10/12
4650
Rust流程控制
语句在英文中是 statement,表达式则是 expression。我们可能常常听说过“赋值语句”或者“算数表达式”这些名词,但是你有想过为什么不是“赋值表达式”吗?语句和表达式有一个重要的区别在于,表达式总是返回一个值,而语句不会。例如:
端碗吹水
2022/06/01
6370
【Rust 基础篇】Rust 模式语法
Rust是一种现代的、高性能的系统级编程语言,它以安全性、并发性和高效性著称。在Rust中,模式(Pattern)是一种强大的语法,用于匹配和解构不同的数据结构。模式可以应用于各种场景,例如匹配枚举、元组、结构体、引用、切片以及自定义类型等。本篇博客将深入探索Rust的模式语法,包括各种模式的定义、使用和搭配使用的技巧,帮助您更好地理解和运用Rust的模式匹配。
繁依Fanyi
2023/10/12
3570
【Rust 基础篇】Rust函数详解
函数是编程语言中的基本构建块之一,用于封装可重用的代码块,并实现特定的功能。在Rust中,函数是一种重要的概念,它们具有严格的类型系统和内存安全性。本篇博客将详细介绍Rust函数的定义、参数、返回值和其他相关概念,并提供相关代码示例。
繁依Fanyi
2023/10/12
4240
【Rust】002-基础语法:函数
在 Rust 中,函数是组织代码的一个基本模块。前面几节中我们已经见过了 Rust 最重要的函数 main 函数,它是整个程序的入口。有了函数,我们就可以把代码逻辑片段封装在其中,从而提高代码的可读性和复用性。
訾博ZiBo
2025/01/06
1150
Rust入坑指南:常规套路
学习一门语言第一个要了解的当然就是变量啦。Rust使用关键字let来定义变量。我们写一个简单的demo
Jackeyzhe
2020/03/11
7660
Rust入坑指南:常规套路
Rust 从入门到精通06-语句和表达式
语句和表达式是 Rust 语言实现逻辑控制的基本单元。 在 Rust 程序里面,语句(Statement)是执行一些操作但不返回的指令,表达式(Expressions)计算并产生一个值。表达式可以是语句的一部分,反过来,语句也可以是表达式的一部分。
IT可乐
2022/09/27
4800
Rust 从入门到精通06-语句和表达式
Rust函数
其中,fn 为函数声明关键字,<function> 为函数名,<parameters> 为参数列表,{} 用于指定函数体的开始和结束。和大多数编程语言一样,Rust 中 main 函数也是程序的入口点。
hotarugali
2022/03/18
4830
Rust实战系列-基本语法
本文是《Rust in action》学习总结系列的第二部分,更多内容请看已发布文章:
abin
2023/03/21
2.4K0
Rust实战系列-基本语法
Rust函数和注释
在前面文章中,基本上都使用了main函数,而main函数是rust 程序的入口,声明函数的方式也很简单:
玖柒的小窝
2021/11/06
4840
Rust语法入门
Rust 是一种系统级编程语言,它的设计目标是提供高性能、安全性和并发性。Rust 的主要优势包括:
码客说
2023/04/17
1.4K0
Rust - 安装环境、基本类型、流程控制、函数、模块、泛型、所有权
学习Rust语言是公司同事最先开始提议的,准备用接下来的项目试试水,Rust是一个强类型编译型语言,比较偏向底层,所以开启了Rust的探索之旅。
stark张宇
2023/02/24
1.2K0
相关推荐
Rust学习笔记之基础概念
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验