Evey 如何选择播放方式¶
为什么同一部电影在电视上原样播放,在手机上却要经过转换?
简单来说:
- 您从来不用选择画质。按下播放时,服务器会查看文件、您的设备能播放什么,以及服务器自身的负载,然后选择可行方式中开销最小的一种。
- 方式一共有三种:直接播放(文件原样发送)、重封装(画面和声音不变,重新封装为另一种文件格式)和转码(转换电影的一部分,常常只是声音)。
- 所以同一部电影可以原样发给一台设备,同时为另一台设备做转换;服务器忙的时候,同一台设备上的播放方式也可能不同。
- 通常您什么都不用做。想知道用的是哪种方式、为什么,可以在播放器里打开流信息:见看懂流信息。
本页先介绍这三种方式,以及如何看懂流信息。后面是服务器使用的具体规则,供希望了解或调整这些规则的读者参考。
三种结果¶
| 在流信息里 | 播放器收到什么 | 服务器要付出什么 |
|---|---|---|
| 直接播放 | 原始文件,一个字节都不变。 | 读取文件。 |
| 重封装 | 原始的视频和音频,装进另一种容器。不重新编码任何内容。 | 重新打包。能做的时候由服务器内部的 MKVGo 完成,否则用 FFmpeg 复制。 |
| 转码 | 至少有一条轨道被重新编码。常常只是音频,视频仍是原始的。 | 一次编码。只有重新编码视频才会占用一个转码名额。 |
服务器按这个顺序尝试。即使要转码,它也只重新编码需要重新编码的轨道。
看懂流信息¶
流信息(播放器控制栏里的信息按钮 (i);在电视上,位于播放器的选项菜单里)会先显示方法,然后列出每条轨道和对它的处理(直接复制、已转码,或者客户端解码,最后这种是指由网页播放器自己解码的音频),并在为何无法直接播放下面列出原因。
原因分为四类:
| 原因从哪里来 | 显示的例子 |
|---|---|
| 播放器无法原样使用这条轨道 | 此播放器无法解码的视频编码 · 此播放器无法解码的音频编码 · 分辨率超出播放器上限 · 音频声道数超出此播放器支持范围 · 播放器无法解码的像素格式(10 位 H.264、4:2:2) · 容器无法直接播放(已重新封装为 HLS) |
| 这次播放受到的限制 | 码率超出允许上限 · 客户端测得的线路无法承载直拷 |
| 对画面或声音的影响 | HDR 已转换为 SDR(色调映射) · 字幕已内嵌到画面 · 已请求音频重新同步 |
| 某项设置,或者已经做出的决定 | 首选视频编码(个人资料设置) · 本次会话已固定该选择 |
只看正在播放的那条音轨。如果文件里有一条没被选中的解说音轨是 DTS 格式,文件不会因此被转码。
流信息是在播放开始时计算的。只有一种情况它无法预见:视频流开始的那一刻,显卡正好已满负荷。这时视频流会改由处理器处理,管理 → 正在播放会显示实际使用的后端。
每一方提供什么¶
文件。 编码、分辨率、位深、HDR 格式、码率,以及音轨和字幕轨,这些在扫描文件时就读取好了。
播放器。 播放开始时,应用会报告它所在的设备能解码什么:支持哪些编码系列、能打开哪些容器、最高分辨率、屏幕能否显示 HDR、能输出几个音频声道,有些设备还会报告 H.264 更低的上限或级别。网页应用向浏览器查询;Android 和 Android TV 应用向设备的解码器和显示屏查询。Evey 不保存“支持哪些设备”的清单,它只用播放器报告的内容。投屏时,如果接收端能报告自己的能力,就由它自己来描述;否则使用一份保守的配置:见投屏到 Chromecast。
这次播放。 个人资料里的偏好(最大码率、最大音频声道数、字幕处理方式),以及适用于这位观众的限制,见下文。
服务器。 它能不能实时完成这次编码(用显卡或处理器),以及有没有空闲的转码名额。这是实际测量出来的,不是假设的:见转码与服务器容量。
同一个文件,三种结果¶
一部 4K HEVC 电影,HDR10,码率 70 Mb/s,带一条杜比 TrueHD 7.1 音轨,在一台 Android TV 上播放。这台电视的解码器支持 HEVC,屏幕能显示 HDR:
- 没有码率限制。 电视能解码视频,也能显示 HDR,所以视频保持原样。它不能解码 TrueHD,所以只重新编码音频。流信息显示转码,视频为直接复制。
- 限制为 20 Mb/s,而显卡能编码带 HDR 的 10 位 HEVC。 视频必须重新编码才能降到限制以内。服务器用 HEVC 重新编码,并保留 HDR,因为电视和显卡都支持。
- 同样的限制,但显卡正忙,或者此影片无法使用显卡。 改由处理器编码。处理器编码成 H.264,在这里 H.264 不带 HDR,所以画面会经过色调映射转成 SDR,画质取决于处理器能稳定做到的水平。
文件和电视都没有变。变的是这次播放的限制和服务器的状态。
这次播放的限制¶
如果一个影片的码率(视频加上正在播放的音轨)高于下面这些限制中最低的那个,就会被转码降到这个限制:
- 播放器报告的最大值;
- 账户的最大码率,由管理员设置;
- 个人资料的最大串流码率;手机报告自己在用移动网络时,还有它的最大蜂窝数据码率;
- 最大远程码率(管理 → 远程访问)和视频码率上限(远程观众)(管理 → 转码),取两者中较低的那个。只有当观众的地址是公网地址、并且不在 LAN 网络之内时才适用。私有地址永远不受限制。
如果正在播放的音轨的声道数多于播放器报告的数量,或多于个人资料里的最大音频声道,这条音轨就会被重新编码。重新编码后的音轨最多保留 5.1 声道,不会更多:见音频。
服务器自行施加的限制¶
有几项限制目前播放器不会报告,所以由服务器作为一条保守的兼容规则来执行,对所有播放器都一样:10 位 H.264,以及所有 4:2:2、4:4:4 或 12 位的视频,都会被重新编码;而 10 位及以下、4:2:0 的 HEVC、VP9 和 AV1,则看播放器是否支持这种编码。杜比视界只会以播放器能正确显示的形式保留:见HDR 与杜比视界。
为什么播放方式很少在中途改变¶
决定在播放开始时做出,并在整个会话中保持不变,这样播放器就不会收到来自两种不同编码的片段。如果切换音轨或字幕需要改变处理方式,或者重新开始播放该影片,就会重新做一次决定。
强制使用某种方式¶
无法强制使用某种方式:服务器总是根据文件和播放器来选择。您能限制的是画质,按设备分别设置,位置在设置 → 播放 → 省流量模式(本设备)。它只限制这台设备上的流,账户下的其他设备保留各自的设置。关闭表示不设上限。省流最高要求 720p、3 Mbps 和立体声。旅行 / 低流量最高要求 480p、1 Mbps 和立体声。超过上限的片源会被转码到上限以内,流信息会把这个上限显示为原因。
播放器设置里的画质与此不同:它是在转码后的视频流的几种画质之间做选择。自动会根据网络情况调整;选一个高度(1080p、720p...)就固定在这个画质;原画质会取消播放器本来会要求的高度限制。
深入了解¶
- 详细标准:HDR 与杜比视界 · 音频 · 字幕 · 投屏到 Chromecast
- 服务器如何分配其处理能力:转码与服务器容量
- 服务器内部不靠 FFmpeg 完成的工作:Evey 中的 MKVGo
- 具体实现:播放链路