关于jellyfin播放视频的兼容性分析

Jellyfin是一个自由软件媒体系统,可以方便的将NAS或PC上的视频、音乐等内容创建局域网服务(甚至互联网服务),可以很好的把NAS或PC硬盘中的视频文件按照流媒体播放平台的形式进行展示,方便查找和观看。

只需前往Jellyfin的官方网站下载页面下载安装包。
https://jellyfin.org/downloads/
选择Windows对应的安装包下载。下载完成后,打开安装包,按照安装向导的提示进行操作。安装过程中会自动配置必要的组件,包括数据库和Web服务器。安装完成后,Jellyfin服务会自动启动。

如果不会配置组件,可以采用 nyanmisaka调优的Jellyfin中国特供版
https://www.chiphell.com/thread-2375777-1-1.html

弄好了以后,在同一台电脑打开浏览器,输入http://localhost:8096,首次访问会进入设置向导。根据提示设置你的媒体库,添加视频、音乐等媒体文件夹。这样jellyfin服务器就设置好了。

然后,就可以用手机、平板或电视上的jellyfin的客户端,访问jellyfin流媒体服务,远程访问媒体库(局域网),观看电影、电视或动漫剧集。如果需要外网访问还需要设置内网穿透。

播放过程转码问题

Jellyfin播放视频过程中,解码性能和本地播放有很大的差异,经常无法调用手机或电视上的硬件解码

有些时候,命名手机上的MX播放器可以支持硬件解码,但jellyfin客户端却要转码。因为,手机或电视上的Jellyfin客户端对于芯片硬解支持能力的调用开发还有一些未完成的,或者说一些小众芯片的支持代码还没有写好。同时,还取决于Jellyfin后台播放设置情况,如果设置直接网页播放,默认只有H264(AVC)格式的视频文件可以串流播放。

Jellyfin转码主要是采用开源软件FFmpeg进行视频编码/解码的硬件加速(HWA),如果PC采用英特尔处理器,可以调用Intel Quicksync(QSV)进行硬件加速。

播放过程中,能不能直接串流播放(服务器仅仅传输视频文件,在手机或电视客户端进行解码),依赖于多方面的因素影响。首先,需要设置jellyfin服务器优先串流(jellyfin默认会尝试串流播放),然后要求jellyfin客户端设置成exoplayer播放,如果客户端能够支持解码相关视频文件,则可以串流播放。

串流播放的话,服务器只是传输mp4视频文件,手机或电视进行解码,清晰度最高。视频文件多大,jellyfin服务器就向客户端发送多大的文件。
如果是转码播放,则可能损失一定的清晰度,因为FFmpeg进行转码的时候,属于有损重新编码,所以会损失清晰度。当码率设置较高的时候,清晰度损失基本可以忽视;当码率设置较低的时候,可能出现肉眼可见的清晰度损失。
转码播放又分为 CPU转码 和 硬件加速转码(如QSV)。

  • 软编码
    CPU转码就是ffmpeg软编码视频,比较吃CPU资源,要求CPU具有极强的性能,否则可能出现卡顿(每秒完成的转码视频帧数低于播放帧率)。特别是在快速拖动进度条的时候,这种卡顿会很明显。
  • 硬编码
    硬件加速转码(如QSV)调用集显或独显的专用视频编码单元进行加速,相比于CPU软编码,速度优势非常明显,甚至可以达到10倍以上的差异(通常只要转码帧率大于视频帧率即可正常无卡顿播放)。转码速度越快,播放的流畅感越好。

视频编码

已知jellyfin网页版(chrome浏览器打开http://localhost:8096)可以很好的支持H264(AVC)编码的视频播放。
而对于H265/HEVC编码的视频,chrome网页版播放通常不支持,可以通过开启chrome对HEVC支持,实现解码。EDGE浏览器可以支持HEVC硬件解码,如果不支持,可以尝试安装windows专用的HEVC解码补丁(实际上,2020年以后的CPU基本上都支持HEVC解码,只是浏览器支持的差异)。

如果jellyfin客户端不支持视频的编解码格式,Jellyfin服务器会进行的转码,通过适当的配置可以让服务器采用硬编码(如QSV)进行视频转码加速。在局域网带宽充裕的情况下,只要设置的码率足够高,转码后的视频清晰度还是可以接受的。

似乎jellyfin客户端对于HEVC(H.265)10Bit格式不太支持(各个设备可能不同,需要实测)。手机或电视硬件支持HEVC(H.265)10Bit,但客户端没有匹配相关SoC芯片的情况下,也可能被当成不支持处理(jellyfin服务器转码播放)。

音频编码

如果jellyfin客户端不支持音频编码格式或者视频的封装格式,也有可能导致重编码。音频的转码(重编码)计算压力远远小于视频的转码(重编码),重新封装的转码压力就更低了。比如说,ddp5.1格式的音频编码,可能就不被客户端支持,所有的手机和大部分电视都仅仅是双声道立体声,选择AAC编码的stero立体声即可。ddp5.1格式、EAC3等格式的音频编码,只会增加视频播放过程中,传输的码率,没有实际意义(配备家庭5.1或7.1声道影院级扬声器的大佬请直接忽视)。

字幕编码

如果字幕与客户端不兼容,也可能导致jellyfin服务器进行转码。

软件更新

随着jellyfin不断开发更新,开源开发组的程序员创造性的实现了大量SoC芯片匹配,硬解性能越来越好。

官方串流支持说明

以下翻译Jellyfin官网客户端解码支持情况,链接地址如下:
https://jellyfin.org/docs/general/clients/codec-support/

Jellyfin的目标是播放所有的媒体,如果容器(container,如MP4、MKV)、视频编码(如H264\H265\AVC\VP9)、音频编码(如AAC、AEC\DDP5.1)和字幕都与Jellyfin客户端兼容。Jellyfin服务器将调用FFmpeg将视频文件转码为Jellyfin客户端可以播放的格式。

如果音频、容器或字幕恰好不受支持,将会发生直接流(Direct Stream),Jellyfin服务器仅改变音频编码或容器。如果视频编解码格式不受支持,这将导致视频转码(transcoding ),字幕也可能会导致直接流(转码字幕)或视频转码(字幕被烧录成硬字幕嵌入视频流)的发生。

如果是网页访问,可以链接以下网址测试浏览器兼容性
https://cconcolato.github.io/media-mime-support/

客户端Client视频兼容性如下表所示

按编码按效率排序 Chrome Edge Firefox Safari Android Android TV iOS SwiftFin (iOS) Roku Kodi Desktop
MPEG-4 Part 2/SP × × × × × × ×
MPEG-4 Part 2/ASP × × × × × × ×
H.264 8Bit
H.264 10Bit × × × ×
H.265 8Bit □8 √7 × □1 □2 √5 □1 √6 □9
H.265 10Bit □8 √7 × □1 □2 □5 □1 √6 □9
VP9 √10 √3 □3 × ×
AV1 □11 □4 × ×

表格中(下同): √=支持; × = 不支持; □ = 部分支持。

注释:

  1. HEVC仅支持MP4、M4V和MOV容器(视频文件格式为\*.MP4\*.M4V\*.MOV)。
  2. 安卓播放系统碎片化比较严重,一致性不佳,根据客户端报告是否支持HEVC,服务器尝试直接传输流(Direct Stream)。
  3. 可能(部分)依赖于硬件支持(可以在Android设备上利用CPU解码进行补充)。大多数价格较高的新安卓手机和许多“4K”安卓电视设备都有VP9硬件解码支持。有关受支持的编解码器,请参阅设备制造商。
  4. 至少需要Android TV 10。
  5. 从jellyfin TV 0.12版本开始,所有运行安卓5.0+设备都支持HEVC,但早期一代的Amazon Fire可能还不能工作。根据设备不同,可能支持10bit位深视频。在客户端jellyfin TV 0.12版之前,在某些特定设备上支持HEVC硬解。
  6. 苹果手机搭载A8X以上处理器或更新的设备,且系统版本高于iOS14的支持HEVC解码。
  7. Windows10系统只有从微软商店安装HEVC视频扩展(HEVC Video Extension),支持HEVC解码。(系统更新到最新可能直接支持,自测matebook 13 2021版可播放)
  8. 谷歌Chrome 104版本以上,可以通过Chrome的快捷方式添加--enable-features=PlatformHEVCDecoderSupport参数,实现HEVC解码支持。如不明白怎么操作,请自行百度Chrome104启用hevc硬件解码教程。(最新EDGE虽然同样采用Chrome内核,默认开启hevc硬解,谷歌公司因为VP9和HEVC竞争,以及HEVC专利的缘故,相关功能默认关闭)
  9. 只有在4K设备上才支持HEVC解码。
  10. 在Safari 14以上版本支持VP9解码。
  11. AV1解码只能在A17处理器或M3系列处理器或更新版本的设备上使用,并且需要Safari 17以上版本。

MPEG视频格式对应图表

MPEG-2 Part 2 MPEG-4 Part-21 MPEG-4 Part-10 MPEG-4 Part-14 MPEG-H Part 2
H.262 MPEG-4 SP/ASP H.264 MP4 Container2 H.265
MPEG-2 Video DivX MPEG-4 AVC HEVC
DVD-Video DX50
  1. MPEG-4 Part-2 vs Part-10
  2. MPEG-4 Part 17: MP4TT Subtitles

这里不是很明白意思,可以大概理解为:
常见的X264编码的MP4格式对应MPEG-4/Part-10 = AVC = H.264
常见的X265编码的MP4格式对应MPEG-H/Part 2 = HEVC = H.265

客户端Client音频兼容性

如果音频编解码不支持或不兼容(例如在立体声(stereo)设备上播放5.1、7.1声道音频),则必须对音频编解码器进行转码。音频转码的CPU运算压力远远小于视频转码。用foobar转码MP3,经常能跑到50+倍速,相同电脑对720视频转码才1倍速。

Chrome Edge Firefox Safari Android Android TV iOS SwiftFin (iOS) Roku Kodi Desktop
FLAC
MP3 □1
AAC
AC3 ×
EAC32
VORBIS3 × × ×
DTS4 × × × × × √6
OPUS □5 □5
ALAC × × × × ×

MPEG音频编码格式对应图表

MPEG-1 MPEG-2
MP2 (layer 2) AAC (Part 7)
MP3 (layer 3)
  1. 单声道MP3被客户端错误地报告为不支持,并由jellyfin服务器转码为AAC。
  2. 仅测试了EAC3 2.0。
  3. 不支持OGG音频容器,导致VORBIS被jellyfin服务器转码。
  4. 只测试过DTS单声道Mono。
  5. Safari只支持\*.caf格式文件的opus 音频流。
  6. 在所有设备上,Roku都是通过直通(passthrough )支持DTS。Roku TVs & Ultra原生(Native)支持AC3和E-AC3和Roku电视和Ultra上的AC3和Ultra。

常见的电脑用的两个音响、耳机、手机(支持立体声的高级手机)等都属于stereo类型,不过很多电脑、手机通常播放器可以自动处理,将5.1、7.1声道音频解码成2.0声道并播放。非发烧友找视频源的时候,直接选择AAC编码音频流的链接下载即可,表中aac兼容性最好。
配备家庭影院的大佬请无视以上D丝观点。

客户端Client字幕兼容性

对于字幕的转码情况比较复杂(subtle issue微妙问题?),通常容器(即视频格式,如*.mp4)支持的字幕数量有限。
如果字幕需要转换编码,则会有两种处理方式:
其一,字幕被转换成另一种客户端支持的格式,
其二,由于不支持字幕转换编码,通过软字幕嵌入,则需要采用硬字幕的方式烧录到视频流(burned into the video)。

第二种方式,实际上是进行视频重编码(transcode),而且是超过视频流重编码的高难度转码(本质是发生了两次转换:字幕流转码+视频流转码),因此需要jellyfin服务器消耗大量算力进行视频重编码。

常见的字幕格式的分类

Format TS MP4 MKV AVI
SubRip Text (SRT) Text ×
WebVTT (VTT)1 Text × ×
ASS/SSA Formatted Text × ×
VobSub2 Picture
MP4TT/TXTT XML × × ×
PGSSUB Picture × × ×
EIA-608/7083 Embedded ×
  1. 在HLS流中支持VTT字幕。
  2. VobSub还有另一个名称是DVB-SUB(SUB + IDX)。
  3. 在MPEG视频编解码器中,EIA-608/708字幕嵌入的私人频道(channel 21)。EIA-608是标准的CC字幕,而EIA-708是典型的SDH。

CC字幕是:隐藏式字幕,可在电视、DVD、网页等平台上显示文字,方便听障人士、外国人等观看。
SDH字幕是:听障人士版的字幕,外国正版的dvd根据法律要求提供听障人士字幕,专用名字是SDH(Subtitles for Deaf and Hard-of-hearing),通常比普通字幕更加精准,而且会出现所有声音描述,提示当前画面伴有声音情况,保证听障人士更好的观影感受。

古早的视频多采用“硬字幕”方式直接焊死在视频中(video stream),现在字幕组制作的字幕多采用srt、ass/ssa格式的“软字幕”提供‘外挂字幕’或‘内嵌软字幕’
如果是外挂字幕可调整性较好,如果是内嵌字幕则可能引发jellyfin转码,从兼容性的角度来看,内嵌字幕的视频选择\*.mkv格式兼容性最好。常见的\*.mp4格式内嵌字幕组的字幕反而可能引发异常转码

字幕类型​
字幕有很多不同的版本。封闭、打开、烧录、强制、SDH和CC都是常见的字幕类型。格式(如SubRIP或VobSUB)对于字幕的类型并不重要。(原文:There are many variations of subtitles. Closed, open, burned-in, forced, SDH, and CC are among the common types of subtitles. The format (such as SubRIP or VobSUB) does not matter for the type of subtitle. 感觉理解不了)

  • 软字幕/独立字幕(Closed Subtitles):是可以打开或关闭的字幕的通用名称,包括Forced、SDH、CC或常规字幕。

  • 硬字幕/烧录字幕(burned-in subtitles):是已永久嵌入视频中,且不能关闭的字幕。硬字幕实际上是视频流的一部分,不能控制开启或关闭状态。

  • SDH和软字幕:SDH和CC是聋人和重听患者的字幕,包括额外的内容(如背景噪音)。SDH和CC不是由特定类型的字幕定义的,只是根据它们传达的意图。如果使用OTA调谐器和DVR,字幕将被嵌入到视频中,并在提取字幕之前进行转码,字幕将破坏字幕。

  • 强制字幕(Forced):“在电影中很常见,只有当角色说外国或外星语言,或者在本地化和配音过程中不翻译标志、国旗或其他文本时才提供字幕。在某些情况下,如果电影是要从一个不会说相关语言的特定角色的角度来看,那么外国对话可能不会被翻译。”-wiki百科。

客户端jellyfin Client视频格式兼容性(容器兼容性)

如果视频格式不被jellyfin客户端支持,将导致重新封装(remux,也可翻译成重新混流)。Jellyfin服务器将调用ffmpeg或其他封装软件,将视频流和音频流重新封装到新的容器中(通俗的讲,就是把*.MP4转换成*.MKV,但不改变内容)。由于重新封装(remux)过程中,视频流和音频流被直接复制,对于Jellyfin服务器CPU并不会产生很大的压力,大多数视频格式都将被重新封装成HLS流媒体协议的TS容器封装。

重新封装(remux)需要Jellyfin服务器CPU进行的计算量很小,理论上MP4内嵌ass软字幕,可以通过重新封装成客户端支持的格式。

Chrome Edge Firefox Safari Android Android TV Kodi Roku
MP41
MKV2, 3 × × ×
WebM3, 5, 6
TS4
OGG5 ×
  1. MP4格式是少数几个不会进行重新封装(remux)的容器之一。
  2. MKV格式几乎可以封装任何格式编码,但不兼容Firefox中的流媒体,需要重新封装。
  3. 在Firefox浏览器中,播放MKV格式时,客户端将其标记成了WebM格式。
  4. TS是jellyfin优选的视频流容器之一(TS设计之初就是用于流媒体播放)。
  5. 由于设计的缘故,WebM和OGG格式支持有限(疑似互联网大厂的恩怨情仇?)。
  6. 在Safari上,需Safari 14以上版本,才支持WebM。

点评:视频格式的后缀(\*.mp4\*.mkv\*.avi)是普通用户最常见到的视频格式标签,实际上这里视频格式仅仅是视频封装容器名称,真正影响视频编码效率的是视频编码器和音频编码器。从Jellyfin流媒体播放视频的特点,采用流媒体封装格式\*.TS是最好的,但实际网络资源大多是\*.mp4\*.mkv\*.avi,兼容性而言MP4和MKV都是非常优秀的,如果考虑多个音频、字幕流同时封装,选择\*.mkv格式的视频无疑是最优的。

参考资料

  1. 百度贴吧Jellyfin使用教程:
    https://tieba.baidu.com/p/7155369746
  2. Nyanmisaka在ChipHell发布Jellyfin中国特供版:
    https://www.chiphell.com/thread-2375777-1-1.html
  3. Jellyfin官网客户端解码支持:
    https://jellyfin.org/docs/general/clients/codec-support/