YouTube的画质选择指南(含Premium)

YouTube的画质选择指南(含Premium)

不知道什么时候养成了备份 YouTube 视频的习惯,至今也下了小五千了。

事实证明除了松鼠之外,还是稍有意义的,很多视频尤其是日本版权方的经常莫名其妙过一段时间就删除了。现在回想,确实也有个契机:当初看了フィロソフィーのダンス的《オール・ウィ・ニード・イズ・ラブストーリー》这首MV非常喜欢,但是没有保存。结果后来官方将其删除(可能是因为成员变动)后,现在这首MV居然全网都找不到高清版(是的,B站也没有。目前只能找到这个2年前网友上传的超低画质版)!这个仇我记住了,以后绝对不会忘了下载。

YouTube简介

既然要下载,那肯定要下载最高画质版。由于是全球最大视频网站,YouTube估计是被人研究的最彻底的。所以一般而言,用著名命令行下载工具youtube-dl或现在更流行的fork yt-dlp(下文都用这个)直接下载,应该默认就会下载最高画质了,对吧?很可惜,没有这么简单。

YouTube可能是主流视频网站中提供画质版本最多的。和大部分视频网站仅提供不同分辨率不同,YouTube的视频即使在同样分辨率有时也会提供多个版本。另外,在不同的平台(Web,Android,iOS等)有时也会提供不同的格式。顺便一提,YouTube算是最早使用音视频分开的网站,虽然现在为了向后兼容也会提供少许音视频合体的格式(最高画质720p),但是基本99%的情况都是音视频分开下载再本地合成。所幸YouTube每个格式都会有一个对应的唯一编号,倒也挺好区分。

哦顺便说一下,现在的主流视频网站对于用户上传的视频100%都是会再次压缩的,所以什么抓取原始画质早已经是不可能的老黄历了。原因也很好理解,由于视频技术之复杂,用户上传的视频可能有一亿种奇怪的奇怪或者非标准之处,显然只有再次压缩标准化才是唯一出路(当然,B站那种即使二压也会压出音画不同步、而且十几年了也没修好的技术水平就……)。

YouTube到底哪个格式画质好?

使用 yt-dlp的 -F 命令,可以很容易列出一个视频的所有格式:

对于最常见的1080p视频,视频轨方面YouTube就会提供137和248两个格式,分别是AVC(即H264)和VP9。图里还有616和614这两个来自iOS API的格式,这里我们先不讨论。一般而言,VP9作为更先进的格式,如果两者体积相仿、input相同(用户上传的原始视频),那么理论上应该是VP9画质更优。然而这只是理论上——实践上则完全不同。

首先要注意一个细节:图中的各种格式的size,有的是白字,有的是灰字带一个约号~。这里的白字的来源是http(s),所以体积是死的,写多少就是多少。灰字则是HLS (m3u8),并无法得知文件大小,所以是用m3u8里的名义码率推算的。但是!YouTube的m3u8其实是不写平均码率的,只写了“最大码率”,也就是这里的下一列里的数字。所以这里的灰字显示的filezie 100%都是错误的、偏大很多的。这点很重要。

前面说过其他变量相同VP9强于AVC,但是很显然这得是体积类似的前提下。但是这里248的体积是26.8M,AVC则有47.6M,足足大了70%多!你还能很有自信地说是前者好吗?如果对比一下的话(NN放缩200%):

可以看到AVC在细节方面把VP9秒得渣都不剩。而且VP9的整体颜色偏“脏”,色度channel的压缩明显非常狠,比较艳的红色等都变得很黯淡。当然,我知道有人反而喜欢VP9或者H265这种比较平滑/模糊的压缩风格(相对于H264的线条噪点压缩风格),所以也有一定的主观成分,但是我个人肯定会选择细节更多的AVC版本就是了。

YouTube的二次压缩现象

这个问题我在各种场所说过多次:

发现YouTube同一个视频在上传之后,会在过一段时间(几个小时后?几天后?)提高压缩率。比如同样是f136格式,我在公开一小时内的下载的码率2M+,现在就只有1M+了。画面明显更糊,所以下视频要趁早注意这里说的不是直播的(那个下得快能下到HLS和Dash,晚了就只有二压版本),就是普通上传的视频。 pic.twitter.com/VOVyxmcMW9

— fireattack (@ikenaikoto) April 4, 2020

不过这里还是再赘述一下。当一个视频刚上传时,会有一个比较高的码率,画质也会好很多。但是,在过了一段时间之后,视频会被YouTube再次压缩。目前不知道这个“二压”发生的规律,不过可以想象是YouTube的服务器在有空闲资源时,就会对播放量比较大的视频进行如此操作,来节约流量。

这里需要说明一下以防误解:这里说的再次压缩是指YouTube从他服务器内部保存的raw再次进行压缩,并不是说他直接拿一次压缩的视频(也就是你能下到的)再次压缩(那样肯定画质只可能变差)。我们在后面对比版本的时候其实基本可以确定YouTube确实是从raw开始重新压的,因为“二压”的版本有时候会有一压版没有的细节。不过为了说起来方便,下面还是都直接简称再次压缩或者二次压缩了。

以这个视频

为例,其137版在二压前为48.8M(我之前有下载),二压后就只有34.3M了。

除了看大小,其实也有个很简单的方法判断。一般YouTube的视频下下来,元数据里都是没有“Writing library”的,但是二压后的AVC版本,会有:

Writing library : x264 core 155 r2901 7d0ff22

的字样。根据这个就很容易判断二压。VP9的格式也是会二压的,但是没有好的区分方式。不过基本上,如果二压所有格式都会被一起压。另外,有的视频很久也不会有二压。比如上面贴过的ピンキーフック的MV,至今也是非二压版。

注意这里说的“刚上传”是指的后台上传,有些视频虽然刚发布,比如这个视频在成文时才发布了10分钟,但是是早已经上传好了,所以已经是二压后的版本(对于137格式,你甚至可以看到压制时间,比如这个视频就是一个月前了。另外注意writing lib metadata的存在):

Title : ISO Media file produced by Google Inc.

Writing library : x264 core 155 r2901 7d0ff22

Encoded date : 2023-06-15 23:52:49 UTC

Tagged date : 2023-06-15 23:52:49 UTC

1080P Premium画质

YouTube在几个月前,推出了面向Premium用户的所谓“1080p Premium”画质选项。最开始只登录iOS设备。这个选项目前只对最高视频为1080p的视频有效,也就是说4K或者8K的视频即使切成1080P画质也不会有这个选项。

我之前为了尝试这个画质专门开通了Premium的会员,结果我的iPad上无论如何都不能获取到这个选项,和客服扯皮了快一个月也无果(至今也不能!)。这几天,YouTube终于开始在网页版推送这个选项,这样测试起来就方便多了,也是为什么突然现在写这个文章的缘故。

不过,其实即使没有网页版,或者甚至没有Premium会员,其实都是可以获取到这个画质的:在最新版(也不新了,有几个月了)的yt-dlp,可以从iOS的API用游客身份直接获取到1080p Premium画质的格式,也就是616。也因为这个的原因,现在yt-dlp默认会抓取iOS的API,之前是不会的(需要通过--extractor-args "youtube:player_client=ios"手动加上)。所以上面第一张图里有616和614格式(614等价于 web 的 248,不重要)。

当然,现在网页版更新了之后,你可以给cookie(--cookies-from-browser chrome)来登录你的preimum账号,从而获取网页版API的1080p Premium画质格式:356。

这两个格式本身是没有区别的,只是封装不同(iOS是m3u8,web是直接https)。编码是VP9。码率上一般是比137/248高一些的。那么这个格式一定就是上位替代吗?不一定!

影响这个所谓的Premium画质“优越性”的最大因素其实就是上面说的,YouTube的二压现象。因为我早已经知道此现象,所以下载视频都是会趁早的,所以我现在的绝大部分YouTube视频都是二压前的,也就很容易和Premium对比画质。可以发现,码率上,Premium画质的体积经常小于压缩前的137版本。如果用肉眼对比,还是我之前的结论,AVC编码的一般细节更多。配合更高的码率,画质经常是优于616的。甚至有的时候,616的码率虽然比二压前的137高一些,但是画质上仍然不如。

另外,Premium画质的产生时间也并不是即时的。事实上,刚上传的新视频,比如撰文时的此视频,是没有Premium画质选项的。而恰好此视频目前是没有被二压的。所以我怀疑,Premium画质只有在视频被二压后,才会产生。但是目前还没有十足的证据(虽然已经在6、7个视频上复现),这个说法暂时为猜想,我以后会慢慢验证。

而且我有发现一个特例,就是Premium画质本身质量变化(下降)的情况。

我在23年5月16日,当时Premium画质才实装不久的时候,就通过yt-dlp的邪路下载了616的夏川椎菜 『ユエニ』Music Video这个视频。这个视频的137(当时,未二压)体积为48.8M,616的体积则为76.2M,还是大了蛮多的。我也没仔细对比画质,都保存了。

今天,我再去下载此视频,就会发现137的体积已经缩水成了34.3M,而616或356,居然也缩水了,变成了41.0M!

不过我觉得这个视频只是个特例。毕竟当时才刚加的Premium画质,可能谷歌那边产品还不成熟,后面改动过。而且这个视频是音雨那老套路,上传后先用 YouTube 自带的剪辑功能剪辑一次成short ver放出,等碟发售了再恢复给你看完整版。可能也有影响。总之,现在应该就像我上面说的一样,616只有在137二压之后才会出现,而616本身不会再被压了。

那么来对比一下(点击看大图,同样是用NN放缩到200%):

呃,其实这种东西side by side比较难比较,还是用图片查看器前后张翻动眼睛盯着像素比较明显。不过我还是大概说下:首先右上的二压版137基本一眼瞎,颜色尤其是红唇被毁的基本没法看了。相比之下616二压版猛一看观看也还是可以的。但是如果你仔细对比,就会发现其“平滑程度”非常高,基本都没啥细节了。后面背景光斑的锐度差也是非常明显。至于二压前的137和616,其实区别不大,616的锐度高一些,可能甚至有点ringing。但是欠码导致的线条噪点问题确实是616要好一些。

顺便一提,我对比的时候都是刻意不找关键帧对比,不知道这个 methodology 算好还是坏。

实战篇:yt-dlp的默认格式选择的问题和解决方案

先稍微总结下结论:如果能下到未二压的版本,那么对于1080P视频,137我认为是要强于616版本的,而248由于码率过低,直接不考虑。不过如果下载手速太慢没能下到未二压的版本,那么616比起二压137还是有巨大提升的。另外还是码率为王:如果616因为某些原因比二压前的137还高很多,那么还是有保存价值的。

那么,我们应该如何设置yt-dlp来达成这一目的呢?

yt-dlp有一套极其复杂的格式排序和选择方式,详细可以参见这里。自动选择最高分辨率这种简单的自然没问题,也不需要我们干涉。但是

yt-dlp全局默认为:

lang,quality,res,fps,hdr:12,vcodec:vp9.2,channels,acodec,size,br,asr,proto,ext,hasaud,source,id

youtube extractor 默认则稍加修改,为

quality, res, fps, hdr:12, source, vcodec:vp9.2, channels, acodec, lang, proto

两者合体后在下载YouTube时的默认就是:

hasvid, ie_pref, quality, res, fps, hdr:12(7), source, vcodec:vp9.2(10), channels, acodec, lang, proto, size, br, asr, vext, aext, hasaud, id

(有些细节区别属于内部实现的用不到的东西,不要在意。)

有这么几个问题:

同等分辨率、fps下,优先选择VP9视频(vcodec:vp9.2)。音频轨也是优先opus(acodec)。

对于YouTube,在更新了最新版后,其优先选择Premium画质(通过source排序关键词来实现)。

另外早期 youtube-dl 还有个行为是优先选择码率较高的视频

这几点我们上面都针对地说过了:VP9不一定比AVC画质好(事实上如果去掉premium,几乎一定差);对于m3u8的源,yt-dlp无法获取真实码率,而m3u8的名义码率偏高,所以按码率排不靠谱;premium画质不一定更好。

我修改后的排序方式为:

-S "quality,res,fps,hdr:12,channels,size,br,asr"

其实主要就是去掉了按照编码排序的部分(vcodec、acodec)和premium优先的部分(source),另外size这个关键词,是会把那种通过码率推算的体积(上文提到的灰字)给排到最后,所以一定不会优先于有真实体积的格式(https的)。我把它提前来保证优先选择体积最大的格式,虽然有一定风险,但是据我观察基本不会错过更好的格式。而且现在137和248都变成https(之前不是),所以不用太担心。

唯一有个缺陷就是因为我覆盖掉了source,所以默认不会再优先premium格式,而616这个可以白嫖的premium格式又没有真实体积参数,在我的设置下一定会优先级低于137。这里对我倒是无所谓啦,因为我真要下可以带cookie下356(有真实体积,所以可以参加size排序),但是如果有需求,就把source加回到hdr:12后面,size前面就是。

另外话有个参数也推荐,yt-dlp默认下载dash和HLS是可以用-N多线程下载切片的(我config一直有 -N 10),但是暂时不支持https的多线程。不过,YouTube extractor 有个专门的hack(是当初规避YouTube限速开发出来的),就是直接在http的query(不是header)加上range=xxx的参数,可以实现分段下载。这个开关现在还保留呢,可以通过--extractor-arg youtube:formats=dashy启用,实现对YouTube http源原生多线程下载(当然你也可以调用aria2)。

补记

在上文已经提到我一个猜想:生成 Premium 画质和二次压缩其他格式画质是同时发生的,并且提到了这个视频作为证据。现在,这个视频符合我们的猜测,已经提供了 Premium 画质并且被二压了。虽然多一个例子不能说明什么,但是我恰好保存了此视频的旧 info.json,可以和新的对比一下了。我简单处理了数据比较了下新旧都有的格式的大小:

可以看到,对于已知确切大小的(表格下半部分),几乎全都缩水了40%左右,包括我们最想要的137格式。至于上半部分的那些格式,本来就多是从iOS API扒出来的m3u8,上面已经说过这个nominal的比特率是最大比特率而非平均比特率所以没有太大意义。事实上让现在下载一个614格式,会发现其大小只有区区 160 MB 左右,也就是差不多 1284 kb/s,远没有 2843 kb/s 那么多。不过我没有下旧的二压前614,所以没法对比了。至于新增加的Premium的616格式,大小则是 423 MB,其实算是满高的码率,足足比旧137也高了1/3。但是画质真的有变好吗?

我还是之前那个结论:在线条的平滑程度上确实比137强(比如黄框处137就有奇怪的锯齿),但是细节真的杀了太多……看看红框部分的额头皮肤纹理和小胡子,完全都找不到了。

所以,还是老老实实下最速的低压缩率的137吧!

分享到:Tweet更多

点击分享到Reddit(在新窗口中打开)

Reddit

Pocket分享到 Tumblr

点击通过电子邮件将链接发送给朋友(在新窗口中打开)

电子邮件

赞 正在加载……

相关

相关推荐

新生小狗的营养需求(了解出生小狗需要的母乳量及喂食时间)
红米buds5怎么样值不值得买
上海365彩票

红米buds5怎么样值不值得买

📅 06-29 👁️ 5898
重温2002年世界杯经典时刻与历史回顾辉煌足球之旅
365bet亚洲足球赛

重温2002年世界杯经典时刻与历史回顾辉煌足球之旅

📅 07-04 👁️ 1768
飞利浦电动牙刷充电多久?影响电动牙刷充电时长的三大因素
90后是Gen Z还是千禧?一文看懂各个世代的定义
365bet亚洲足球赛

90后是Gen Z还是千禧?一文看懂各个世代的定义

📅 06-30 👁️ 6158
2021手机qq如何查看私密日志
上海365彩票

2021手机qq如何查看私密日志

📅 07-03 👁️ 1959