前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >x265无损压缩

x265无损压缩

作者头像
Aidol
发布2022-03-24 08:41:32
9480
发布2022-03-24 08:41:32
举报
文章被收录于专栏:苦旅苦旅

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

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

代码语言:javascript
复制
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
复制
 ffmpeg -i .\BallUnderWater_1920x1080_60fps.mp4  newyuv.yuv
  1. 计算两个YUV文件的PSNR
代码语言:javascript
复制
 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 删除。

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档