HEVC 的画质和压缩率的优势仅在超高清分辨率时才凸显,而 QSV 的画质和压缩率能和 AVC 持平,全高清及以下的分辨率, HEVC 基本上得不偿失

2020-08-25 20:40:50 +08:00
 ungrown

今天有(mo)空(yu)闲搞了个小实验,想看看 2K 以下的分辨率,包括 FHD(1920x1080)和 HD(1280x720)甚至更低分辨率时,HEVC 的画质和压缩率相比 AVC 到底有多少提升。

之前给家里影音资源大量二压的过程就隐约觉得,在 FHD 、HD 甚至更低分辨率的场景下,HEVC 似乎很得不偿失。

本来还想着通过实验找到个比较均衡的 CRF 参数供以后使用,但是结果让我大跌眼镜,很想放弃 HEVC 。

本文的 hevc 专指 ffmpeg 自带 x265 编码器,avc 专指 ffmpeg 自带 x264 编码器,qsv 专指 ffmpeg 自带 h264_qsv 编码器

[先放结论] [ 1 ] 如果画面细节是可以舍弃的,那么采用较高的 crf,25 以上甚至 28 以上,此时的 hevc 编码虽然很费时间,但是体积可以缩得很小,而且虽然细节丢失后的画面涂抹感严重,但是轮廓色块却能比较好得保留下来,相比之下此时的 avc 早已变成马赛克(实际上 avc 在默认的 crf=23 时轮廓线条已经开始轻微碎片化)。 [ 2 ] avc 的缺点随着分辨率的升高而被放大,到 4K 甚至更高的分辨率时,avc 将被 hevc 碾压,这同时符合 hevc 的设计目标和现实中的应用场景。 [ 3 ] 在 FHD 全高清乃至更低分辨率的条件下,hevc 在码率利用率上的优势不太明显,尤其在使用低 crf 压制时,hevc 相比于 avc 最多只能减小 30%左右的码率,而且相比于 avc 依然有轻微的涂抹感,会丢失一些细微细节,然而这却是耗费了几倍的编码时间换来的。

实验素材是个高码率 MMD,因为是 CG 动画,代表性还是不够广泛,但权且作为这类视频的典型例子。

软件全都是 FFmpeg,版本 4.0.2 。

codec   res     crf     ratio
+-------+-------+-------+----
hevc    x       16      .343
avc     x       16      .447
hevc    x       19      .226
avc     x       19      .322
hevc    x       22      .147
avc     x       22      .222
hevc    x       25      .099
avc     x       25      .154
hevc    x       28      .068
avc     x       28      .109
hevc    fhd     16      .257
qsv     fhd     16      .319
avc     fhd     16      .358
hevc    fhd     19      .165
qsv     fhd     19      .219
avc     fhd     19      .236
hevc    fhd     22      .109
avc     fhd     22      .159
hevc    fhd     25      .075
avc     fhd     25      .112
hevc    hd      16      .123
qsv     hd      16      .171
avc     hd      16      .176
hevc    hd      19      .083
qsv     hd      19      .12
avc     hd      19      .117
hevc    hd      22      .057
avc     hd      22      .08
hevc    hd      25      .04
avc     hd      25      .057

codec:编码器,qsv 专指 h264_qsv,我的 CPU 旧,不支持 hevc_qsv

res:输出分辨率,x 指原分辨率,fhd 指缩小到内切 1920x1080,hd 指缩小到内切 1280x720

crf:就是 crf 参数,顺便一提实验中除了 crf 和缩放没有其他参数

ratio:压缩比,输出文件相比源文件的体积比值,小数点前面的 0 省略了

有经验的人知道,avc 的 crf=23 和 hevc 的 crf=28 有点接近

但这并不代表 avc 和 hevc 输出相同画质对应的 crf 总是相差 5

crf 越小,这俩的输出画质越接近

实际上 23 以下的相同 crf 时,这俩的输出画质就已经不能一眼看出来了,得暂停、靠近、放大、截图……

但真实情况还要更复杂,因为 hevc 针对超高清优化,像素块涂抹感很严重

对于全高清以下的分辨率,hevc 细节其实丢得很多

但在 crf=16 时,hevc 、avc 、qsv 三者的画质非常接近

硬要说的话,avc 依然最佳,但与其他两个的差距可以忽略

但此时,这三者体积也很接近,hevc 顶多也就节约 20%-30%的码率

虽然对视频平台服务商来讲可以剩下很多成本

但在本地存储时,节约的空间不明显,而压制的时间却是成倍增加

所以说 hevc 得不偿失撒(对个人、家用)

如果增大 crf,19 也还行,22 算是个分水岭

再往上,细节的丢失可以被轻易地感知,但很多时候用户就是不需要保留这些细节

比如说,我之前一直把家里的电影统一缩小到内切 1280x720,用 crf=25 压制成 hevc

“看电影看的是故事不是像素点”

一些值得收藏的视频则会用 crf=28,当然也是 hevc

“以后重看时大概看个意思就行了”

这么看来,hevc 虽然非常耗时,但能用低码率牺牲细节保留轮廓,也是个很不错的应用面

那如果要保留细节、输出高画质、又要二压减小体积呢?

我以前一直采用 crf<22 的 hevc,但通过这次实验,我觉得该换思路

既然此时 hevc 画质没有优势,体积没有优势,耗时劣势拉满,那为什么不用 avc 呢

既既然此时 qsv 无论是画质、体积都和 avc 相差无几甚至偶有反超,而速度却数倍于 avc,那为什么不用 qsv 呢

全文完

8721 次点击
所在节点    FFmpeg
86 条回复
ungrown
2020-08-26 07:24:15 +08:00
@est #38 你是要二压存档吗?在乎时间的话,x264 或者硬件加速(比如 qsv ),不在乎时间 hevc,为了看清车牌,crf 不能太高但也不需要太低,以 crf=22 为起点尝试,另外可以试着降低分辨率看看能否在满足需要的同时减少总信息量。尝试过程不需要全片压缩,找些有前面车牌的画面的片段,两三秒钟的,切出来实验就行。
zhuangku556
2020-08-26 07:51:48 +08:00
@ungrown 那你可以直接下 1-2GB 左右的压制版本,这种很多啊
ungrown
2020-08-26 08:09:44 +08:00
@zhuangku556 以前是主流,现在搜索结果中这档资源越来越靠后。以前人人搞出的 hr-hdtv 用 1024x576 分辨率来降低体积,码率其实给足了。现在的一两 GB 的资源往往是枪版、0day 版、抢首发版,空有高分辨率但码率欠的过分不说,还往往压进了翻译质量差的硬字幕。另外就是,因为是脚本批量二压,所以就算下载的是一两 G 的版本,也逃不过再被二压的命运。
est
2020-08-26 08:26:38 +08:00
@ungrown 对。我是要二压。行车记录仪那个默认的 h264 baseline 体积巨大。。几分钟就好几个 G 了。。有些时候想想保存一些行车视频。
mxalbert1996
2020-08-26 08:29:49 +08:00
@ungrown 你的算数真厉害,毕竟硬盘休眠这种东西根本就不存在呢,而且仓库盘一定要一直插着电呢。
SF
2020-08-26 08:34:24 +08:00
说起来有人测试过 bilibili 切换到 HEVC 后的画质变化吗?
不知什么时候开始 HTML5 播放器在 Safari 上已经默认播放 HEVC 视频流了。相同分辨率等级下提供的视频流码率都有不同程度的降低,大概在 30% - 50% 之间。
ungrown
2020-08-26 08:41:41 +08:00
@SF 变化不明显,体积如你所说省了接近一半,原因还是可以从正文表格中找到端倪:高分辨率、中等偏高的 crf,就对应着四成左右的体积减小。

画质细细对比的话,还是 hevc 的老毛病,有比 avc 更强的涂抹感,但都局限在很小的像素块上,不逐帧反复对比是看不出的。

我拿自己修改的 you-get 从 B 站拖了大量视频,新上传的视频基本都默认下载 hevc 源。
zhuangku556
2020-08-26 08:50:10 +08:00
@ungrown 你可以去毛子网站 yts 看看,电影都是 1-2GB 左右而且没有硬字幕。
ungrown
2020-08-26 08:54:57 +08:00
@est #44 那就参考我的回复自己做一下实验,切几秒钟的片段出来,很快的
ungrown
2020-08-26 09:04:57 +08:00
@mxalbert1996 #45 你的妄想更厉害
毕竟在你想象的场景里,我那多年积累的几百收藏是必须要全年 365 天 24 小时不间断 CPU 满载压制一遍又一遍的
毕竟在你的想象里,我是不能在开着笔记本工作或者娱乐时,顺便在后台开低优先级 ffmpeg 充分利用时间和设备算力的
毕竟在你的想象里,在笔记本低负载就已经二三十 W 功耗的基础上,加个压制任务到满载的四五十 W 功耗,是远超过你那些不管是在带电跑还是吃灰的硬盘所消耗的生产资源和电力能源的
毕竟在你的想象里,花三小时左右压制一部电影所消耗的资源,是远超过你为了下高清圆盘几十个 GB 不得不长时间开机跑硬盘所消耗的资源的
毕竟在你的想象里,你那些花了大量时间金钱下载收藏却难得看一次甚至一次都不一定会去看的高清资源所耗费的时间精力金钱资源,是不可能会超过我优选、量少、体积小这些策略的
ungrown
2020-08-26 09:07:05 +08:00
@zhuangku556 #48 谢谢提供的信息,以后要新增收藏我去那里看看,如果满足需求可以减少一部分二压工作
ungrown
2020-08-26 09:18:28 +08:00
@zhuangku556 #48 我搜了一下 wiki,这个组真的有意思,相见恨晚啊
zhuangku556
2020-08-26 09:39:32 +08:00
@ungrown 是的,清晰度和体积平衡的不错,要求不高足够了。
vanxy
2020-08-26 10:07:58 +08:00
楼主这一套流程太牛了。
我是重度松鼠症, 下下来的片几乎没有删的。不够空间就加硬盘, 片大概只看了 30%吧。
Dukewill
2020-08-26 10:55:29 +08:00
多谢,楼主的实验还是很有参考意义的,工作上经常需要压视频,又没时间研究各种参数组合。

不过对于楼主说“看电影不看像素点,不听音效”实在是难以认同,照这个思路,直接听机器语音读剧本岂不更妙?
盲猜楼主只是单纯的享受研究压制的乐趣罢了,这也挺好的。
ungrown
2020-08-26 11:05:37 +08:00
@minami #7 调了 ctu 、cu 、tu 的参数后,hevc 本身就已经很慢的速度又慢了几倍,2333
ungrown
2020-08-26 11:08:02 +08:00
@Dukewill #55 啊不,家里电影电视剧都是二压成不超过 720p 的 hevc 了,电影 crf=25,电视剧视情况 22~28 (有些年代久远的低分辨率文件得用 22 压不然全糊了),观感很好,体积很小(动作场景不多的电影压到 500M 以下,大点的基本在 800M 左右)
ungrown
2020-08-26 11:28:47 +08:00
@darer #26
@minami #7
我组合尝试了 ctu 和 sao 的参数

单纯禁用 sao 会丢失涂抹细节,码率和不禁用一样,但是画质变得稍微更差了

```python
In [29]: c.config_hevc(crf=19)
In [30]: c.estimate_overwrite()
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\29.mkv" -crf 19 -vcodec hevc -x265-params log-level=error "o-0\29.mkv"
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\2.mkv" -crf 19 -vcodec hevc -x265-params log-level=error "o-0\2.mkv"
[h264 @ 000001fd7594f180] Increasing reorder buffer to 1
Out[30]: {'0': 0.226}

In [47]: c.config_hevc(crf=19,no_sao=1)
In [48]: c.estimate_overwrite()
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\29.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:no-sao=1 "o-0\29.mkv"
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\2.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:no-sao=1 "o-0\2.mkv"
[h264 @ 0000017a35d7f140] Increasing reorder buffer to 1
Out[48]: {'0': 0.222}
```

单纯调整 ctu 、cu 、tu 码率有略微上升,速度速度进一步降低,但是截图对比又看不出有保留更多细节,似乎和没调这些参数之前一样

```python
In [43]: c.config_hevc(crf=19,ctu=32,max_tu_size=4,min_cu_size=8)
In [44]: c.estimate_overwrite()
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\29.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:ctu=32:max-tu-size=4:min-cu-size=8 "o-0\29.mkv"
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\2.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:ctu=32:max-tu-size=4:min-cu-size=8 "o-0\2.mkv"
[h264 @ 0000022faaa9f1c0] Increasing reorder buffer to 1
Out[44]: {'0': 0.282}
```

然后我把这俩参数一起用,既调小块又禁用 sao,输出画质好像比默认参数时保留了更多的细节,好像有所改善,但又不明显,我也不知道是不是心理作用

```python
In [45]: c.config_hevc(crf=19,ctu=32,max_tu_size=4,min_cu_size=8,no_sao=1)
In [46]: c.estimate_overwrite()
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\29.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:ctu=32:max-tu-size=4:min-cu-size=8:no-sao=1 "o-0\29.mkv"
[I][mylib.ffmpeg.FFmpegCaller] ffmpeg -hide_banner -loglevel warning -y -i "i-0\2.mkv" -crf 19 -vcodec hevc -x265-params log-level=error:ctu=32:max-tu-size=4:min-cu-size=8:no-sao=1 "o-0\2.mkv"
[h264 @ 000001e7e3eaf1c0] Increasing reorder buffer to 1
Out[46]: {'0': 0.274}
```
mikeven
2020-08-26 11:44:06 +08:00
我觉得不是 hevc 问题,而是 x265 编码器一般,以及参数设置问题。理论上 hevc 全码率秒杀 avc 的,cpu 编码也>=显卡编码,低码率优势更明显,你这些结论都很反常识啊。
imn1
2020-08-26 11:55:13 +08:00
这个附言足够 ban id 了……可惜 LZ 不能自己删帖

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/701397

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX