Fixing Missing Chinese Subtitles in Jellyfin Android TV

Fixing Missing Chinese Subtitles in Jellyfin Android TV
From 神薙

问题发现:

之前已经在NAS上部署docker版本的Jellyfin,中文字幕显示不了的问题可以通过在Jellyfin里设置备用字体来解决。

简单来说就是:

  1. 下载Noto Sans CJK字体包
  2. 在Jellyfin控制台-播放-转码,开启启用备用字体,并把第一步里下载的字体包放到备用字体文件路径

最近配合投影仪购入了一个FireTV Stick,在上面下载Jellyfin后发现在浏览器手机客户端显示正常的中文字幕在安卓电视版的Jellyfin上无法正常显示。


问题探究:

经过第一轮网络搜索后,原本以为发现是安卓TV版不支持字幕烧录,所以.ass外挂字幕会有问题。但最新的安卓TV版本似乎已经修复了这个问题。

另外,尝试播放外挂.ass字幕的神薙时字幕无法显示,但播放把字幕内封到.mkv文件里的终物语可以正常显示。通过解析终物语的.mkv文件,发现字幕文件里指定的字体也同时作为附件被内封到了.mkv里。于是我尝试使用MkvToolNix把神薙字幕指定的字体和字幕本身也内封到.mkv里,但依然无法正常显示中文字符。


通过解析Jellyfin日志,发现了一些线索。

ffmpeg version 7.0.2-Jellyfin Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-ptx-compression --disable-static --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto=auto --enable-gpl --enable-version3 --enable-shared --enable-gmp --enable-gnutls --enable-chromaprint --enable-opencl --enable-libdrm --enable-libxml2 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libdav1d --enable-libsvtav1 --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --enable-libfdk-aac --arch=amd64 --enable-libshaderc --enable-libplacebo --enable-vulkan --enable-vaapi --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] libass API version: 0x1703000
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] libass source: commit: 0.17.3-0-ge46aedea0a0d17da4c4ef49d84b94a7994664ab5
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Shaper: FriBidi 1.0.16 (SIMPLE) HarfBuzz-ng 10.2.0 (COMPLEX)
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/FOT-MatissePro-DB.otf'
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/FZZYSK.TTF'
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/方正粗宋_GBK.ttf'
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/方正准圆_GBK.ttf'
[Parsed_subtitles_2 @ 0x55d1b14d8ec0] Using font provider fontconfig
Input #0, matroska,webm, from 'file:/video/终物语/终物语 E10.mkv':
  Metadata:
    encoder         : libebml v1.4.0 + libmatroska v1.6.0
    creation_time   : 2020-07-22T07:55:35.000000Z
  Duration: 00:24:13.12, start: 0.000000, bitrate: 2972 kb/s
  Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn (default)
      Metadata:
        BPS-eng         : 2317138
        DURATION-eng    : 00:24:13.119000000
        NUMBER_OF_FRAMES-eng: 34840
        NUMBER_OF_BYTES-eng: 420884760
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(jpn): Audio: opus, 48000 Hz, stereo, fltp (default)
      Metadata:
        BPS-eng         : 264135
        DURATION-eng    : 00:24:13.120000000
        NUMBER_OF_FRAMES-eng: 72656
        NUMBER_OF_BYTES-eng: 47977509
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:2(jpn): Audio: opus, 48000 Hz, stereo, fltp
      Metadata:
        title           : Commentary
        BPS-eng         : 186030
        DURATION-eng    : 00:24:13.120000000
        NUMBER_OF_FRAMES-eng: 72656
        NUMBER_OF_BYTES-eng: 33790607
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:3: Subtitle: ass (ssa) (default)
      Metadata:
        title           : SC
        BPS-eng         : 135
        DURATION-eng    : 00:24:04.420000000
        NUMBER_OF_FRAMES-eng: 347
        NUMBER_OF_BYTES-eng: 24530
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:4: Subtitle: ass (ssa)
      Metadata:
        title           : TC
        BPS-eng         : 135
        DURATION-eng    : 00:24:04.420000000
        NUMBER_OF_FRAMES-eng: 347
        NUMBER_OF_BYTES-eng: 24536
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:5: Subtitle: ass (ssa)
      Metadata:
        title           : Commentary SC
        BPS-eng         : 179
        DURATION-eng    : 00:24:07.880000000
        NUMBER_OF_FRAMES-eng: 389
        NUMBER_OF_BYTES-eng: 32502
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:6: Subtitle: ass (ssa)
      Metadata:
        title           : Commentary TC
        BPS-eng         : 181
        DURATION-eng    : 00:24:07.880000000
        NUMBER_OF_FRAMES-eng: 389
        NUMBER_OF_BYTES-eng: 32885
        _STATISTICS_WRITING_APP-eng: mkvmerge v48.0.0 ('Fortress Around Your Heart') 64-bit
        _STATISTICS_WRITING_DATE_UTC-eng: 2020-07-22 07:55:35
        _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:7: Attachment: otf
      Metadata:
        filename        : FOT-MatissePro-DB.otf
        mimetype        : application/vnd.ms-opentype
  Stream #0:8: Attachment: ttf
      Metadata:
        filename        : FZZYSK.TTF
        mimetype        : application/x-truetype-font
  Stream #0:9: Attachment: ttf
      Metadata:
        filename        : 方正粗宋_GBK.ttf
        mimetype        : application/x-truetype-font
  Stream #0:10: Attachment: ttf
      Metadata:
        filename        : 方正准圆_GBK.ttf
        mimetype        : application/x-truetype-font
Stream mapping:
  Stream #0:0 (hevc) -> setparams:default (graph 0)
  overlay_vaapi:default (graph 0) -> Stream #0:0 (hevc_vaapi)
  Stream #0:1 -> #0:1 (opus (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[Parsed_subtitles_2 @ 0x7fc0f0006a80] libass API version: 0x1703000
[Parsed_subtitles_2 @ 0x7fc0f0006a80] libass source: commit: 0.17.3-0-ge46aedea0a0d17da4c4ef49d84b94a7994664ab5
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Shaper: FriBidi 1.0.16 (SIMPLE) HarfBuzz-ng 10.2.0 (COMPLEX)
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/FOT-MatissePro-DB.otf'
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/FZZYSK.TTF'
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/方正粗宋_GBK.ttf'
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Loading font file '/cache/attachments/a73e2ec42fa9f3014c86bcc6c27b1f80/方正准圆_GBK.ttf'
[Parsed_subtitles_2 @ 0x7fc0f0006a80] Using font provider fontconfig
[Parsed_subtitles_2 @ 0x7fc0f0006a80] fontselect: (方正准圆_GBK, 700, 0) -> FZY3K--GBK1-0, 0, FZY3K--GBK1-0
Output #0, hls, to '/cache/transcodes/36df184ee5eeb6c0c6299ceb87021897.m3u8':
  Metadata:
    encoder         : Lavf61.1.100
  Stream #0:0: Video: hevc (Main) (hvc1 / 0x31637668), vaapi(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 5945 kb/s, 23.98 fps, 90k tbn
      Metadata:
        encoder         : Lavc61.3.100 hevc_vaapi
  Stream #0:1: Audio: aac, 48000 Hz, stereo, s16, 256 kb/s (default)
      Metadata:
        encoder         : Lavc61.3.100 libfdk_aac
frame=   20 fps=0.0 q=-0.0 size=N/A time=00:00:00.00 bitrate=N/A speed=   0x    
[Parsed_subtitles_2 @ 0x7fc0f0006a80] fontselect: (方正准圆_GBK, 400, 0) -> FZY3K--GBK1-0, 0, FZY3K--GBK1-0
frame=   48 fps= 48 q=-0.0 size=N/A time=00:00:01.16 bitrate=N/A speed=1.17x    
[hls @ 0x55d1b1514700] Opening '/cache/transcodes/36df184ee5eeb6c0c6299ceb870218970.ts' for writing
frame=   75 fps= 50 q=-0.0 size=N/A time=00:00:02.29 bitrate=N/A speed=1.53x    
frame=  102 fps= 51 q=-0.0 size=N/A time=00:00:03.42 bitrate=N/A speed=1.71x    
frame=  129 fps= 52 q=-0.0 size=N/A time=00:00:04.54 bitrate=N/A speed=1.82x    
[hls @ 0x55d1b1514700] Opening '/cache/transcodes/36df184ee5eeb6c0c6299ceb870218971.ts' for writing
frame=  157 fps= 52 q=-0.0 size=N/A time=00:00:05.71 bitrate=N/A speed= 1.9x    
frame=  190 fps= 54 q=-0.0 size=N/A time=00:00:07.09 bitrate=N/A speed=2.03x    
[hls @ 0x55d1b1514700] Opening '/cache/transcodes/36df184ee5eeb6c0c6299ceb870218972.ts' for writing
frame=  223 fps= 56 q=-0.0 size=N/A time=00:00:08.46 bitrate=N/A speed=2.12x    
frame=  249 fps= 55 q=-0.0 size=N/A time=00:00:09.55 bitrate=N/A speed=2.12x    
frame=  284 fps= 57 q=-0.0 size=N/A time=00:00:11.01 bitrate=N/A speed= 2.2x    

终物语 部分日志

ffmpeg version 7.0.2-Jellyfin Copyright (c) 2000-2024 the FFmpeg developers
  built with gcc 12 (Debian 12.2.0-14)
  configuration: --prefix=/usr/lib/jellyfin-ffmpeg --target-os=linux --extra-version=Jellyfin --disable-doc --disable-ffplay --disable-ptx-compression --disable-static --disable-libxcb --disable-sdl2 --disable-xlib --enable-lto=auto --enable-gpl --enable-version3 --enable-shared --enable-gmp --enable-gnutls --enable-chromaprint --enable-opencl --enable-libdrm --enable-libxml2 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libfontconfig --enable-libharfbuzz --enable-libbluray --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libopenmpt --enable-libdav1d --enable-libsvtav1 --enable-libwebp --enable-libvpx --enable-libx264 --enable-libx265 --enable-libzvbi --enable-libzimg --enable-libfdk-aac --arch=amd64 --enable-libshaderc --enable-libplacebo --enable-vulkan --enable-vaapi --enable-amf --enable-libvpl --enable-ffnvcodec --enable-cuda --enable-cuda-llvm --enable-cuvid --enable-nvdec --enable-nvenc
  libavutil      59.  8.100 / 59.  8.100
  libavcodec     61.  3.100 / 61.  3.100
  libavformat    61.  1.100 / 61.  1.100
  libavdevice    61.  1.100 / 61.  1.100
  libavfilter    10.  1.100 / 10.  1.100
  libswscale      8.  1.100 /  8.  1.100
  libswresample   5.  1.100 /  5.  1.100
  libpostproc    58.  1.100 / 58.  1.100
[Parsed_subtitles_2 @ 0x55c596fb1f00] libass API version: 0x1703000
[Parsed_subtitles_2 @ 0x55c596fb1f00] libass source: commit: 0.17.3-0-ge46aedea0a0d17da4c4ef49d84b94a7994664ab5
[Parsed_subtitles_2 @ 0x55c596fb1f00] Shaper: FriBidi 1.0.16 (SIMPLE) HarfBuzz-ng 10.2.0 (COMPLEX)
[Parsed_subtitles_2 @ 0x55c596fb1f00] Using font provider fontconfig
Input #0, matroska,webm, from 'file:/video/神薙/[VCB-Studio] Kannagi [01][Ma10p_1080p][x265_flac_2aac].mkv':
  Metadata:
    encoder         : libebml v1.4.4 + libmatroska v1.7.1
    creation_time   : 2025-08-28T07:04:44.000000Z
  Duration: 00:23:41.03, start: 0.000000, bitrate: 6448 kb/s
  Chapters:
    Chapter #0:0: start 0.000000, end 117.017000
      Metadata:
        title           : Chapter 01
    Chapter #0:1: start 117.017000, end 207.040000
      Metadata:
        title           : Chapter 02
    Chapter #0:2: start 207.040000, end 864.997000
      Metadata:
        title           : Chapter 03
    Chapter #0:3: start 864.997000, end 1324.990000
      Metadata:
        title           : Chapter 04
    Chapter #0:4: start 1324.990000, end 1421.034000
      Metadata:
        title           : Chapter 05
  Stream #0:0: Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn (default)
      Metadata:
        BPS             : 5423267
        DURATION        : 00:23:41.026000000
        NUMBER_OF_FRAMES: 35185
        NUMBER_OF_BYTES : 963325545
        _STATISTICS_WRITING_APP: mkvmerge v80.0 ('Roundabout') 64-bit
        _STATISTICS_WRITING_DATE_UTC: 2025-08-28 07:04:44
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)
      Metadata:
        BPS             : 583827
        DURATION        : 00:23:41.020000000
        NUMBER_OF_FRAMES: 16653
        NUMBER_OF_BYTES : 103703864
        _STATISTICS_WRITING_APP: mkvmerge v80.0 ('Roundabout') 64-bit
        _STATISTICS_WRITING_DATE_UTC: 2025-08-28 07:04:44
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:2(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp
      Metadata:
        BPS             : 169647
        DURATION        : 00:23:41.034000000
        NUMBER_OF_FRAMES: 66611
        NUMBER_OF_BYTES : 30134360
        _STATISTICS_WRITING_APP: mkvmerge v80.0 ('Roundabout') 64-bit
        _STATISTICS_WRITING_DATE_UTC: 2025-08-28 07:04:44
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:3(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp
      Metadata:
        BPS             : 169785
        DURATION        : 00:23:41.034000000
        NUMBER_OF_FRAMES: 66611
        NUMBER_OF_BYTES : 30158858
        _STATISTICS_WRITING_APP: mkvmerge v80.0 ('Roundabout') 64-bit
        _STATISTICS_WRITING_DATE_UTC: 2025-08-28 07:04:44
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:4(srd): Subtitle: ass (ssa) (default)
      Metadata:
        BPS             : 108
        DURATION        : 00:23:09.900000000
        NUMBER_OF_FRAMES: 343
        NUMBER_OF_BYTES : 18791
        _STATISTICS_WRITING_APP: mkvmerge v80.0 ('Roundabout') 64-bit
        _STATISTICS_WRITING_DATE_UTC: 2025-08-28 07:04:44
        _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
  Stream #0:5: Attachment: ttf
      Metadata:
        filename        : 方正行楷_GBK.ttf
        mimetype        : application/x-truetype-font
  Stream #0:6: Attachment: ttf
      Metadata:
        filename        : 方正准圆_GBK.TTF
        mimetype        : application/x-truetype-font
Stream mapping:
  Stream #0:0 (hevc) -> setparams:default (graph 0)
  overlay_vaapi:default (graph 0) -> Stream #0:0 (hevc_vaapi)
  Stream #0:1 -> #0:1 (flac (native) -> aac (libfdk_aac))
Press [q] to stop, [?] for help
[Parsed_subtitles_2 @ 0x7fc0cc006a80] libass API version: 0x1703000
[Parsed_subtitles_2 @ 0x7fc0cc006a80] libass source: commit: 0.17.3-0-ge46aedea0a0d17da4c4ef49d84b94a7994664ab5
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Shaper: FriBidi 1.0.16 (SIMPLE) HarfBuzz-ng 10.2.0 (COMPLEX)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Using font provider fontconfig
Output #0, hls, to '/cache/transcodes/62249dc233533765607b5d0c01e5893a.m3u8':
  Metadata:
    encoder         : Lavf61.1.100
  Stream #0:0: Video: hevc (Main) (hvc1 / 0x31637668), vaapi(tv, bt709, progressive), 1920x1080 [SAR 1:1 DAR 16:9], q=2-31, 6448 kb/s, 23.98 fps, 90k tbn
      Metadata:
        encoder         : Lavc61.3.100 hevc_vaapi
  Stream #0:1: Audio: aac, 48000 Hz, stereo, s16, 256 kb/s (default)
      Metadata:
        encoder         : Lavc61.3.100 libfdk_aac
frame=    0 fps=0.0 q=0.0 size=N/A time=N/A bitrate=N/A speed=N/A    
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: (方正准圆_GBK, 700, 0) -> /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf, 0, DejaVuSans-Bold
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x6293 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x6293 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x5230 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x5230 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x4E86 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x4E86 for font: (方正准圆_GBK, 700, 0)
frame=   24 fps= 24 q=-0.0 size=N/A time=00:00:00.00 bitrate=N/A speed=   0x    
frame=   58 fps= 39 q=-0.0 size=N/A time=00:00:01.41 bitrate=N/A speed=0.945x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a0.ts' for writing
frame=   88 fps= 44 q=-0.0 size=N/A time=00:00:02.66 bitrate=N/A speed=1.33x    
frame=  115 fps= 46 q=-0.0 size=N/A time=00:00:03.79 bitrate=N/A speed=1.52x    
frame=  142 fps= 47 q=-0.0 size=N/A time=00:00:04.92 bitrate=N/A speed=1.64x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a1.ts' for writing
frame=  168 fps= 48 q=-0.0 size=N/A time=00:00:06.00 bitrate=N/A speed=1.72x    
frame=  194 fps= 48 q=-0.0 size=N/A time=00:00:07.09 bitrate=N/A speed=1.77x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a2.ts' for writing
frame=  219 fps= 49 q=-0.0 size=N/A time=00:00:08.13 bitrate=N/A speed=1.81x    
frame=  250 fps= 50 q=-0.0 size=N/A time=00:00:09.42 bitrate=N/A speed=1.88x    
frame=  276 fps= 50 q=-0.0 size=N/A time=00:00:10.51 bitrate=N/A speed=1.91x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a3.ts' for writing
frame=  300 fps= 50 q=-0.0 size=N/A time=00:00:11.51 bitrate=N/A speed=1.92x    
frame=  329 fps= 51 q=-0.0 size=N/A time=00:00:12.72 bitrate=N/A speed=1.96x    
frame=  354 fps= 51 q=-0.0 size=N/A time=00:00:13.76 bitrate=N/A speed=1.97x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a4.ts' for writing
frame=  376 fps= 50 q=-0.0 size=N/A time=00:00:14.68 bitrate=N/A speed=1.96x    
frame=  400 fps= 50 q=-0.0 size=N/A time=00:00:15.68 bitrate=N/A speed=1.96x    
frame=  424 fps= 50 q=-0.0 size=N/A time=00:00:16.68 bitrate=N/A speed=1.96x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a5.ts' for writing
frame=  448 fps= 50 q=-0.0 size=N/A time=00:00:17.68 bitrate=N/A speed=1.96x    
frame=  471 fps= 50 q=-0.0 size=N/A time=00:00:18.64 bitrate=N/A speed=1.96x    
frame=  495 fps= 49 q=-0.0 size=N/A time=00:00:19.64 bitrate=N/A speed=1.96x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a6.ts' for writing
frame=  518 fps= 49 q=-0.0 size=N/A time=00:00:20.60 bitrate=N/A speed=1.96x    
frame=  543 fps= 49 q=-0.0 size=N/A time=00:00:21.64 bitrate=N/A speed=1.97x    
frame=  569 fps= 49 q=-0.0 size=N/A time=00:00:22.73 bitrate=N/A speed=1.98x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a7.ts' for writing
frame=  596 fps= 50 q=-0.0 size=N/A time=00:00:23.85 bitrate=N/A speed=1.99x    
frame=  624 fps= 50 q=-0.0 size=N/A time=00:00:25.02 bitrate=N/A speed=   2x    
[hls @ 0x55c596f0f880] Opening '/cache/transcodes/62249dc233533765607b5d0c01e5893a8.ts' for writing
frame=  652 fps= 50 q=-0.0 size=N/A time=00:00:26.19 bitrate=N/A speed=2.01x    
frame=  680 fps= 50 q=-0.0 size=N/A time=00:00:27.36 bitrate=N/A speed=2.03x    
frame=  709 fps= 51 q=-0.0 size=N/A time=00:00:28.57 bitrate=N/A speed=2.04x    
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x6293 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x6293 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x5230 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x5230 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x4E86 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x4E86 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x6293 not found, selecting one more font for (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x6293 for font: (方正准圆_GBK, 700, 0)
[Parsed_subtitles_2 @ 0x7fc0cc006a80] Glyph 0x5230 not found, selecting one more font for (方正准圆_GBK, 700, 0)

神薙 部分日志

经过对比可以发现,成功显示字幕的终物语中:


[Parsed_subtitles_2 @ 0x7fc0f0006a80] fontselect: (方正准圆_GBK, 700, 0) -> FZY3K--GBK1-0, 0, FZY3K--GBK1-0

成功在附件中找到了字幕文件所指定的字体。

神薙中:

[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: (方正准圆_GBK, 700, 0) -> /usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf, 0, DejaVuSans-Bold
[Parsed_subtitles_2 @ 0x7fc0cc006a80] fontselect: failed to find any fallback with glyph 0x5230 for font: (方正准圆_GBK, 700, 0)

系统没有尝试从附件中寻找字体,直接尝试从Jellyfin容器中找字体。Jellyfin容器中没有自带支持中文字符的字体,所以无法正常显示字幕。

并不像其他平台上的客户端,安卓电视版本的Jellyfin似乎不会去备用字体中寻找需要的字体。


问题解决:

既然知道是没有字体所导致的问题,那么我们只要在usr/share/fonts/truetype/这个路径下也加入Noto Sans CJK字体包就好了。我们可以使用软链,让系统在usr/share/fonts/truetype/路径寻找字体时自动跳转到我们的备用字体路径。

  1. 安装 fontconfig来管理字体
# 进入容器
docker exec -it jellyfin-jellyfin-1 bash

# 安装
apt-get update
apt-get install -y fontconfig
  1. 建立字体目录,进行软链
mkdir -p /usr/share/fonts/custom
ln -sf /config/config/font/* /usr/share/fonts/custom/
  1. 修改fontconfig的config让简体字体优先
cat > /etc/fonts/local.conf <<'XML'
<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
  <dir>/usr/share/fonts/custom</dir>

  <alias>
    <family>sans-serif</family>
    <prefer>
      <family>Noto Sans CJK SC</family>
      <family>Noto Sans CJK TC</family>
    </prefer>
  </alias>
</fontconfig>
XML
  1. 刷新缓存,验证
# 刷新缓存
fc-cache -f -v

# 验证
docker exec jellyfin-jellyfin-1 fc-match "方正准圆_GBK"
docker exec jellyfin-jellyfin-1 fc-match "Noto Sans CJK SC"
docker exec jellyfin-jellyfin-1 fc-match ":lang=zh,sans-serif"

验证返回NotoSansCJK的字体就为成功。

重新在安卓电视Jellyfin上播放,中文字体就可以正常显示了。
Jellyfin版本升级后刚刚的改动可能会丢失,可以手动重新进行一遍,也可以把以上步骤合并到一个脚本到时候来运行。


希望这篇Blog可以帮助到和我一样遇到这个问题的你 :)

感谢阅读~